超过了Google Apps脚本中的最长执行时间

Cor*_*rry 48 google-apps-script

我有一个不断收到此错误的Apps脚本.通过通知邮件判断,看起来时间限制是5分钟.有谁知道是否有办法延长这个时间限制?或者是否有办法再次调用Apps脚本,它从它停止的地方开始提取?任何帮助表示赞赏.

Ant*_*doi 68

你可以做的一件事(这当然取决于你想要完成的事情)是:

  1. 将必要的信息(例如循环计数器)存储在电子表格或其他永久存储中(即ScriptProperties).
  2. 让您的脚本每五分钟左右终止一次.
  3. 设置一个时间驱动的触发器,每五分钟运行一次脚本(或使用脚本服务以编程方式创建触发器).
  4. 在每次运行时,从您使用的永久存储中读取已保存的数据,并从中断处继续运行脚本.

这不是一个适合所有人的解决方案,如果您发布您的代码,人们将能够更好地为您提供帮助.

这是我每天使用的脚本的简化代码摘录:

function runMe() {
  var startTime= (new Date()).getTime();

  //do some work here

  var scriptProperties = PropertiesService.getScriptProperties();
  var startRow= scriptProperties.getProperty('start_row');
  for(var ii = startRow; ii <= size; ii++) {
    var currTime = (new Date()).getTime();
    if(currTime - startTime >= MAX_RUNNING_TIME) {
      scriptProperties.setProperty("start_row", ii);
      ScriptApp.newTrigger("runMe")
               .timeBased()
               .at(new Date(currTime+REASONABLE_TIME_TO_WAIT))
               .create();
      break;
    } else {
      doSomeWork();
    }
  }

  //do some more work here

}
Run Code Online (Sandbox Code Playgroud)

注意#1:变量REASONABLE_TIME_TO_WAIT应该足够大,以便触发新的触发器.(我把它设置为5分钟,但我认为它可能会少于此).

注意#2:doSomeWork()必须是执行速度相对较快的功能(我会说不到1分钟).

注意#3:谷歌已弃用Script Properties,并将Properties Service其引入.该功能已相应修改.


ron*_*nme 28

此外,尽量减少对谷歌服务的通话量.例如,如果要更改电子表格中的单元格范围,请不要读取每个单元格,对其进行修改并将其存储回来.而是将整个范围(使用Range.getValues())读入内存,将其变异并立即存储所有内容(使用Range.setValues()).

这应该可以节省大量的执行时间.


Liy*_*ali 14

Anton Soradoi的答案似乎没问题,考虑使用缓存服务而不是将数据存储到临时表中.

 function getRssFeed() {
   var cache = CacheService.getPublicCache();
   var cached = cache.get("rss-feed-contents");
   if (cached != null) {
     return cached;
   }
   var result = UrlFetchApp.fetch("http://example.com/my-slow-rss-feed.xml"); // takes 20 seconds
   var contents = result.getContentText();
   cache.put("rss-feed-contents", contents, 1500); // cache for 25 minutes
   return contents;
 }
Run Code Online (Sandbox Code Playgroud)

另请注意,截至2014年4月,脚本运行时限制为6分钟.


小智 5

我已经使用ScriptDB来保存我的位置,同时在循环中处理大量信息.该脚本可以/确实超过5分钟的限制.通过在每次运行期间更新ScriptDb,脚本可以从db读取状态并从中断处继续,直到所有处理完成.试试这个策略,我想你会对结果感到满意.

  • 不推荐使用 ScriptDb。 (2认同)

小智 5

如果您使用的是G Suite Business或企业版.在App maker启用脚本运行运行时,您可以注册App Maker的早期访问权限,将运行时间从6分钟增加到30分钟 :)

关于app maker的更多细节点击这里