Google 脚本使用 setValues 超时

问题描述 投票:0回答:1

我有一个脚本,它使用 setValues 合并两个具有相同结构的电子表格。最近开始超时了,因为数据随着时间的推移变得太大了

我做了一些研究并偶然发现了这个网站,它比较了不同读/写方法的性能。结论是使用 google 的高级服务(Sheets API)可以比 setValues 节省大量时间。

我真的很纠结如何将我的脚本转换为使用 SheetsAPI。这是我的原始代码:

function getData() {
  var get_files = ['File1', 'File2'];
  var copySheet = SpreadsheetApp.openById('[ID for end result]').getSheetByName('Sheet1');
  copySheet.getRange('A2:Z').clear();
  for (z = 0; z < get_files.length; z++) {
    var files = DriveApp.searchFiles(`title='${get_files[z]}' and mimeType='${MimeType.GOOGLE_SHEETS}' and trashed=false`);
    var file = files.hasNext() && files.next();
    if (!file) {
      console.log(`"${get_files[z]}" of Google Spreadsheet was not found.`);
      continue;
    }
    var sheets = SpreadsheetApp.open(file).getSheets();
    for (var i = 0; i < sheets.length; i++) {
      var values = sheets[i].getDataRange().getValues().slice(1);
      copySheet.getRange(copySheet.getLastRow() + 1, 1, values.length, values[0].length).setValues(values);
    }
  }
}

我不熟悉 Sheets API,我尝试利用 SheetsAPI 实现 Range.copyTo 并使用更少的处理时间。

google-apps-script google-sheets google-sheets-api
1个回答
0
投票

当我看到你的脚本时,我认为 Sheets API 可用于从电子表格的所有工作表中检索所有值,也可用于将所有值放入目标工作表。当这反映在您的脚本中时,以下修改如何?

修改脚本:

在使用此脚本之前,请在 Advanced Google 服务中启用 Sheets API

function getData() {
  var spreadsheetId = "[ID for end result]"; // Please set your destination spreadsheet ID.
  var get_files = ['File1', 'File2'];
  var copySheet = SpreadsheetApp.openById(spreadsheetId).getSheetByName('Sheet1');
  copySheet.getRange('A2:Z').clear();
  SpreadsheetApp.flush();
  var values = [];
  for (z = 0; z < get_files.length; z++) {
    var files = DriveApp.searchFiles(`title='${get_files[z]}' and mimeType='${MimeType.GOOGLE_SHEETS}' and trashed=false`);
    var file = files.hasNext() && files.next();
    if (!file) {
      console.log(`"${get_files[z]}" of Google Spreadsheet was not found.`);
      continue;
    }
    var sheets = SpreadsheetApp.open(file).getSheets();
    var v = Sheets.Spreadsheets.Values.batchGet(file.getId(), { ranges: sheets.map(s => s.getSheetName()) }).valueRanges.flatMap(({ values }) => values.slice(1));
    values = [...values, ...v];
  }
  if (values.length == 0) return;
  Sheets.Spreadsheets.Values.update({ values }, spreadsheetId, "Sheet1", { valueInputOption: "USER_ENTERED" });
}
  • 运行此脚本时,将检索
    ['File1', 'File2']
    的 2 个电子表格的所有工作表中的所有值。并且,检索到的值被放入目标电子表格的“Sheet1”。

参考资料:

© www.soinside.com 2019 - 2024. All rights reserved.