我在Google电子表格上使用以下定时触发器。它每十分钟运行一次:
function timedTriggerWatchFiles(rootFolder) {
// make an array with all the names of the childfolder
if (DriveApp.getFoldersByName(rootFolder).hasNext()) {
var childFolders = DriveApp.getFoldersByName(rootFolder).next().getFolders();
}
var childFoldersA = [];
while (childFolders.hasNext()) {
childFoldersA.push(childFolders.next().getName());
}
// run watchfiles for each child folder
for ( var i=0 ; i < childFoldersA.length ; i++) {
watchFiles(rootFolder, childFoldersA[i]);
}
}
function timedTrigger() {
timedTriggerWatchFiles("folder");
}
我每天至少一次在收件箱中收到“失败报告”,并说:
We're sorry, a server error occurred. Please wait a bit
and try again. (line 242, file "Code")
执行日志提供以下消息:
[14-01-22 17:29:38:363 CET] Execution failed: We're sorry,
a server error occurred. Please wait a bit and try again.
(line 242, file "Code") [37.016 seconds total runtime]
这些行总是不同,但也始终包含函数hasNext()
。这是第242行:
while (childFolders.hasNext()) {
我在这里做错了什么?我的脚本可以正常工作。我只是不明白为什么我收到错误消息。
答案 0 :(得分:2)
在Drive SDK文档中,您应该查看有关exponential backoff的部分。您可以尝试使用GASRetry库在Apps脚本中简化此操作。
答案 1 :(得分:0)
@ Greg的回答指出了在Google Apps Scripts中使用API的所有正确资源。
虽然可能看起来像访问应用程序脚本这样对ScriptDB
,DriveApp
,SpreadsheetApp
等内容的访问权限,但实际上存在侵占性使用的访问限制。最简单的解决方案是Utilities.sleep(1000);
。
但是,如果您的脚本在600秒限制内运行严密,或者您需要确保尽可能快地完成每个请求,那么@ Greg的答案中的资源将会有很大帮助。