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)
根据这个读/写方法的比较,使用高级服务写入比 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)
| 归档时间: |
|
| 查看次数: |
1006 次 |
| 最近记录: |