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

时间:2011-10-21 19:53:03

标签: google-apps-script

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

5 个答案:

答案 0 :(得分:65)

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

  1. 将必要的信息(例如循环计数器)存储在电子表格或其他永久存储中(即ScriptProperties)。
  2. 让您的脚本每隔五分钟左右终止一次。
  3. 设置时间驱动的触发器,每五分钟运行一次脚本(或使用Script service以编程方式创建触发器。)
  4. 每次运行时,请从您使用的永久存储中读取已保存的数据,然后从中断处继续运行脚本。
  5. 这不是一个适合所有人的解决方案,如果您发布代码,人们可以更好地为您提供帮助。

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

    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
    
    }
    

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

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

    注意#3:Google已弃用Script Properties,并引入了Properties Service。该功能已相应修改。

答案 1 :(得分:26)

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

这可以节省大量的执行时间。

答案 2 :(得分:14)

Anton Soradoi's answer似乎没问题,但考虑使用Cache Service ,而不是将数据存储到临时表中。

 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;
 }

另请注意,截至2014年4月,limitation of script runtime 为6分钟


G Suite Business / Enterprise / Education和Early Access用户:

截至2018年8月,这些用户的max script runtime现在设置为30分钟。

答案 3 :(得分:5)

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

答案 4 :(得分:5)

如果您使用的是G Suite Business或企业版。 您可以register early access for App Maker启用App maker后,您的脚本运行运行时间会将运行时间从6分钟增加到30分钟:)

有关应用制作者Click here的更多详情