簡體   English   中英

如何在 Google Apps 腳本中動態創建新工作表時 append 第一行數據

[英]How to append first row data while creating new sheets dynamically in Google Apps Script

我有這段代碼可以動態創建新工作表,但省略了第一行,因為它的結構使得它根據第一列A:A中的值創建新工作表。 在附加 rest 數據之前,如何構造它以捕獲第一個(標題行)。

function newSheet() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var templateSheet = ss.getActiveSheet();
    var sheet1 = ss.getSheetByName("main")
    var getNames = [...new Set(sheet1.getRange("A2:A").getValues().filter(String).toString().split(","))];
var title = sheet1.getRange("A1:Z1").getValues().filter(String).toString().split(",");// Not sure


    for (var i = 0; i < getNames.length; i++) {
        var copy = ss.getSheetByName(getNames[i]);
             if (copy) {

        ss.deleteSheet(copy)


                 var rowIndexes = sheet1.getRange("A:A").getValues()
                .map((value, index) => [value[0], (index + 1)])
                .filter(value => value[0] === getNames[i]);


            var namedSheet = ss.insertSheet(getNames[i]);

            rowIndexes.map(index => {
                var rowValues = sheet1.getRange(index[1], 1, 1, sheet1.getLastColumn()).getValues();
                sheet1.getLastColumn()).getValues();;

                // Append title row first???

                namedSheet.appendRow(rowValues[0]);

            ss.setActiveSheet(ss.getSheetByName(getNames[i]));
            ss.moveActiveSheet(ss.getNumSheets());

            });

情況:

您想要執行以下操作:

  • 為 A 列中的每個不同值創建一個新工作表(如果之前已創建,請將其刪除)。
  • 每個創建的工作表中的第一行應該與源工作表 ( main ) 中的第一行相同。
  • 工作表的 rest 應僅包含 A 列值與工作表名稱匹配的行。

代碼示例(檢查內聯注釋):

function newSheet() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var templateSheet = ss.getActiveSheet();
  var sheet1 = ss.getSheetByName("main");
  var getFirstColumn = sheet1.getRange(2, 1, sheet1.getLastRow() - 1).getValues().map(row => row[0]); // Get column A contents (excluding row 1)
  var getNames = [...new Set(getFirstColumn)]; // Get unique values from column A (excluding row 1)
  var title = sheet1.getRange(1, 1, 1, sheet1.getLastColumn()).getValues()[0]; // Get row 1 values
  var data = sheet1.getRange(2, 1, sheet1.getLastRow() - 1, sheet1.getLastColumn()).getValues(); // Get all data in "main" sheet (excluding row 1)
  for (var i = 0; i < getNames.length; i++) { // Iterate through each unique value in column A
    var copy = ss.getSheetByName(getNames[i]);
    if (copy) ss.deleteSheet(copy); // If there is a sheet with this name, delete it
    var filteredData = data.filter(row => row[0] === getNames[i]); // Get rows from "main" sheet with current unique column A value
    var namedSheet = ss.insertSheet(getNames[i]); // Create sheet for current unique column A value
    namedSheet.appendRow(title); // Append row 1 values to new sheet
    namedSheet.getRange(2, 1, filteredData.length, filteredData[0].length).setValues(filteredData); // Copy filtered data to new sheet
  }
}

筆記:

  • 無需獲取要復制的行的索引,您可以相應地過濾它們而不保留索引。 這大大簡化了您的代碼。
  • 在將數據的 rest 附加到工作表之前,您可以只在第一行 append 。 您還可以將title數組添加到filteredData數據數組的開頭並同時寫入所有數據,包括第一行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2025 STACKOOM.COM