失败报告在Google应用脚本中的定时触发器中

时间:2014-01-22 16:49:20

标签: google-apps-script

我在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()) {

我在这里做错了什么?我的脚本可以正常工作。我只是不明白为什么我收到错误消息。

2 个答案:

答案 0 :(得分:2)

在Drive SDK文档中,您应该查看有关exponential backoff的部分。您可以尝试使用GASRetry库在Apps脚本中简化此操作。

答案 1 :(得分:0)

@ Greg的回答指出了在Google Apps Scripts中使用API​​的所有正确资源。

虽然可能看起来像访问应用程序脚本这样对ScriptDBDriveAppSpreadsheetApp等内容的访问权限,但实际上存在侵占性使用的访问限制。最简单的解决方案是Utilities.sleep(1000);

但是,如果您的脚本在600秒限制内运行严密,或者您需要确保尽可能快地完成每个请求,那么@ Greg的答案中的资源将会有很大帮助。