【发布时间】:2021-03-06 16:14:31
【问题描述】:
我有一个 Google Apps 脚本已经运行了 4 年,没有出现任何问题。但是,自从 3 周以来,我遇到了这个问题:脚本运行了很长时间并且失败了。这发生在每 10 次运行中的 3 次。错误消息是“服务电子表格在访问 ID 为 [此处为电子表格 ID] 的电子表格时超时”。
实际的脚本是复杂的(数千行)并在数百个电子表格上运行,使用fetchUrl() 获取数据并使用setValues() 填充工作表。这个实际的脚本过去可以在 10 张工作表的电子表格上正常工作,并且可以在过去 4 年中毫无问题地更新每张工作表中的 180k 单元格。现在,我连一张表都更新不了。
下面的脚本复制了这个问题:它使用.getValues() 和.setValues()将 1300 行 x 140 列从 Sheet1 复制到 Sheet2。当行数增加到 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');
}
【问题讨论】:
-
嗯,您正在复制 182k 值。我想这可能需要一些时间,但我希望它能够在时限内完成。如果文件已经足够大,它可能会影响整体性能。
-
感谢您的评论,@Marios!它曾经在更大的工作表上工作得很好,每张有 10 张 180k 单元格。您知道可以使用 setValues() 设置的单元格数量的配额吗?问题不在于性能低下,而是脚本失败以及超过 10 分钟无法访问电子表格。
-
一种解决方法而不是实际的解决方案只是创建文件的副本并使用它。希望这会在一段时间内解决这个问题。
-
@Marios,我认为我的解释可能不清楚,但这只是一个复制问题的虚拟脚本。实际代码要复杂得多,适用于数百个电子表格。也许我应该在我原来的问题中澄清这一点。
-
我得到了类似的结果。我想我可能会避免使用电子表格进行此操作。
标签: google-apps-script google-sheets server-error request-timed-out