Google Apps 脚本 setValues() 问题:间歇性超时

Nin*_*til 8 server-error request-timed-out google-sheets google-apps-script

我有一个已经运行 4 年没有问题的 Google Apps 脚本。但是,自从 3 周以来,我遇到了这个问题:脚本运行了很长时间并且失败了。这种情况每 10 次运行中就有 3 次发生。错误消息是“服务电子表格在访问具有 id [电子表格 ID 此处] 的电子表格时超时”

实际的脚本是精心制作的(数千行)并在数百个电子表格上运行,使用数据获取数据fetchUrl()并使用setValues(). 这个实际的脚本过去可以在 10 张工作表的电子表格上正常工作,并且可以在过去 4 年中毫无问题地更新每张工作表中的 180k 单元格。现在,我什至无法更新一张纸。

下面的脚本复制了这个问题:它使用.getValues()和将 1300 行 x 140 列从 Sheet1 复制到 Sheet2 .setValues()。当行数增加到 800 以上时,脚本开始失败。当它运行良好时,执行日志显示它需要 8 秒。当它失败时,日志会显示长达 900 秒的运行时间。在此期间,您无法访问电子表格超过 10 分钟,如果您尝试在不同的选项卡中加载电子表格,则它根本不会加载。

我已经向 Google 支持提出了一个问题,我没有时间表,但对给您带来的不便深表歉意。这发生在我尝试过脚本的所有域上,不仅是我的域。您需要尝试运行脚本 10 次才能查看失败情况。

如果有人可以提出解决方法或提供有关此问题的一些见解,我将不胜感激。

这是复制该问题的电子表格的链接:https : //docs.google.com/spreadsheets/d/1jea15rtjv85YIZumABMfFKESb2_QmX0-7zC-KchWeDc/edit?usp=sharing

function myFunction() {
  var row1 = 1;
  var col1 = 1;
  var row2 = 1300;
  var col2 = 140;
  console.log({numrows:row2, numcols:col2} );
  var rng = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1").getRange(row1,col1,row2,col2);
  var values_to_set = rng.getValues();
  var rng2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2").getRange(row1,col1,row2,col2);
  rng2.setValues(values_to_set);
  console.log('done');
  
}
Run Code Online (Sandbox Code Playgroud)

msh*_*ruz 5

根据这个读/写方法的比较,使用高级服务写入比 setValues() 更快。

使用原始代码段的以下修改版本适用于您的示例电子表格:

function myFunction() {
  var row1 = 1;
  var col1 = 1;
  var row2 = 1300;
  var col2 = 140;
  Logger.log({numrows:row2, numcols:col2} );
  var rng = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1").getRange(row1,col1,row2,col2);
  var values_to_set = rng.getValues();
  var rng2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2").getRange(row1,col1,row2,col2);
  //rng2.setValues(values_to_set);
  // Based on https://developers.google.com/apps-script/advanced/sheets
  var request = {
    'valueInputOption': 'USER_ENTERED',
    'data': [
      {
        'range': 'Sheet2!' + rng2.getA1Notation(),
        'majorDimension': 'ROWS',
        'values': values_to_set
      }
    ]
  };
  Sheets.Spreadsheets.Values.batchUpdate(request, SpreadsheetApp.getActiveSpreadsheet().getId());
  Logger.log('done');
}
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的回答,@mshcruz。这是迄今为止最有帮助的解决方法。我不知道我可以通过 Google Apps 脚本使 Sheets API 工作,您的示例非常有帮助。我将进一步测试我的代码,如果没有其他有用的答案,我将检查此答案。 (2认同)