App Script new Google Sheet 创建问题

App Script new Google Sheet creation issue

我正在尝试编写一个 App 脚本,它从多个不同的电子表格(完全独立的文档)中获取字符串数据并将它们全部放入一个新的电子表格中。当我 运行 记录器时,它会显示我想要的所有数据。我希望每条数据都显示在 A 列中,但是当我 运行 我的脚本时,它只将 1 个数据点而不是所有数据点放入电子表格中。有人可以给我一些指导吗?这是我的代码:

function pullTogether() {
  var files = DriveApp.getFolderById('Folder ID').searchFiles('title != "nothing"');
  const rangeName = 'Sheet1!B2:C';
  while(files.hasNext()){
    var xFile = files.next();
    var name = xFile.getId();
    
    const values = Sheets.Spreadsheets.Values.get(name, rangeName).values;
    for (const row in values) {
      var a1 = (values[row][0]);
      Logger.log(a1);
    
  var ss = SpreadsheetApp.openById("ID of new spreadsheet"); //I have the real ID in my code
  var cell = ss.getRange("A2");
  cell.setValue(a1);
     
}
}

}

我相信你的目标如下。

  • 您想从特定文件夹下的每个 Spreadsheet 的“B”列中检索值。
  • 您想将检索到的值放入目标的“A”列 sheet。

修改点:

  • 关于 but when I run my script, it only puts 1 data point in the spreadsheet instead of all of them.,当我看到你的脚本时,检索到的值总是放在目标 sheet 的单元格“A2”中。我认为这可能是您遇到问题的原因。

  • 在你的脚本中,我认为当使用以下流程时,流程成本会变低。通过这个流程,你的问题也可以被移除。

  • 在您的情况下,即使未使用 Sheets API,脚本也可以使用 getValues().

当这些点体现在你的脚本中,就变成了下面这样。

修改后的脚本:

请设置文件夹 ID 和目标 Spreadsheet ID。

function pullTogether() {
  // Retrieve values from each Spreadsheet.
  var values = [];
  var files = DriveApp.getFolderById('Folder ID').searchFiles(`title != 'nothing' and mimeType='${MimeType.GOOGLE_SHEETS}'`);
  var sheetName = 'Sheet1'
  while (files.hasNext()) {
    var xFile = files.next();
    var sheet = SpreadsheetApp.open(xFile).getSheetByName(sheetName);
    if (sheet) {
      var v = sheet.getRange("B2:B" + sheet.getLastRow()).getValues();
      values = [...values, ...v];
    }
  }

  // Put values to the destination sheet.
  var ss = SpreadsheetApp.openById("ID of new spreadsheet"); //I have the real ID in my code
  var dstSheet = ss.getSheets()[0];
  dstSheet.getRange(2, 1, values.length, values[0].length).setValues(values);
}

注:

  • 虽然我不确定你的实际情况,当上面的脚本对大数据不起作用时,请修改如下。

    • 来自

        dstSheet.getRange(2, 1, values.length, values[0].length).setValues(values);
      
    •   Sheets.Spreadsheets.Values.update({ values }, ss.getId(), `'${dstSheet.getSheetName()}'!A2`, { valueInputOption: "USER_ENTERED" });
      

参考文献: