如何在Google Apps脚本中增加6分钟的执行限制?

时间:2017-02-01 04:17:02

标签: google-apps-script limit execution-time

有没有办法增加Google Apps脚本的6分钟执行时间限制?我认为答案可能是G Business Suite的Early Access计划。如果我可以进入早期访问计划,我可能愿意为G Business Suite每月支付10美元,以便将执行限制从6分钟增加到30分钟。但G Suite帮助论坛的顾问表示,Early Access是一个有限的计划,这意味着我无法保证能够获得该计划。

还有其他方法可以增加6分钟的执行限制吗?

请注意,在这个问题中,我并没有询问如何优化我的脚本以适应6分钟限制的想法。 (我可能会问,将来,如果当前问题的答案是“否,则没有别的办法。”)

因此,对当前问题的恰当答案是:

  • “不,没有其他方法可以增加Google App Scripts的6分钟执行限制。”
  • “是的,还有其他方法可以增加6分钟的执行限制,这些就是......”

2 个答案:

答案 0 :(得分:3)

我有几十个工作>跑6分钟。我使用了多年来我调整过的“外环”脚本(下图)。无论需要多长时间,它都会完成每项工作。

设置(只是一个指南 - 您需要将其应用于您自己的特定场景):

  1. 将行var thingies =更改为您要处理的内容。它理想情况下应该是一个数组。
  2. //do our work here
  3. 之后添加您自己的代码
  4. 在名为outerLoop()的函数上设置触发器,每x小时/天运行一次。可以将它重命名为有意义的内容,例如doProcessWidgets()
  5. 代码:

    //automatically invoked from outerLoop()'s creation of a new trigger if required to get work done
    function outerLoopRepeating() {
      outerLoop();
    }
    // trigger this function
    function outerLoop() {
      try {
        var processingMessage = 'Initialising', isOverMaxRuntime = false, startTime = new Date(), // calc elapsed time
            functionName = arguments.callee.name, repeatingFunctionName = functionName + 'Repeating'; //for logging, triggering
    
        // Deletes all occurrences of the Repeating trigger we don't end up with undeleted time based triggers all over the place
        //add library GASRetry MGJu3PS2ZYnANtJ9kyn2vnlLDhaBgl_dE
        GASRetry.call(function(){ScriptApp.getProjectTriggers().forEach(function(i) {
          if (i.getHandlerFunction() === repeatingFunctionName) {ScriptApp.deleteTrigger(i);}
        });});
    
        Logger.log('========== Starting the "%s" function ==========', functionName);
    
        // Handle max execution times in our outer loop
        // Get start index if we hit max execution time last run
        var start = parseInt(PropertiesService.getScriptProperties().getProperty(functionName + "-start")) || 0;
    
        var thingies = ['stuff to process', 'in an Array',,,,]; //
        for (var i = start ; i < thingies.length; i++) {
          if (Math.round((new Date() - startTime)/1000) > 300) { //360 seconds is Google Apps Script max run time
            //We've hit max runtime. 
            isOverMaxRuntime = true;
            break;
          }
          //do our work here
          Logger.log('Inside the for loop that does the xyz work. i is currently: %d', i);
          var processingMessage = Utilities.formatString('%d of %d thingies: %s <%s>',  i+1, thingies.length, thingyName, thingyId);
    
          //do our work above here
        }
        if (isOverMaxRuntime) {
          //save state in user/project prop if required
          PropertiesService.getScriptProperties().setProperty(functionName + '-start', i);
          //create another trigger
          GASRetry.call(function(){ScriptApp.newTrigger(repeatingFunctionName).timeBased().everyMinutes(10).create();});
          Logger.log('Hit max run time - last iteration completed was i=%s', i-1);
        } else {
          Logger.log('Done all the work and all iterations');
          PropertiesService.getScriptProperties().deleteProperty(functionName + '-start');
          Logger.log('Completed processing all %s things with the "%s" function', thingies.length, functionName);
        }
      } catch (e) {
        Logger.log('%s. While processing %s', JSON.stringify(e, null, 2), processingMessage);
        throw e;
      }
    }
    

答案 1 :(得分:1)

对于G Suite组织,据我了解,可以通过登录Early Access Program来消除最长执行时间限制。来自Quotas for Google Services

  

灵活配额及早访问

     
    

此功能是早期访问功能集的一部分。因此,目前只有一些开发人员可以访问它。

  
     

通常,如果脚本执行超出上述配额或限制之一,脚本执行将停止并出现相应的错误   消息被返回。这可能会留下脚本的数据   一个无限期的状态。

     

在灵活的配额制度下,此类硬配额限制将被删除。   脚本在达到配额限制时不会停止。相反,他们是   延迟到配额可用,此时脚本   执行恢复。一旦配额开始使用,它们将被重新填充   常规费率。为了合理使用,脚本延迟很少见。

如果您无法访问EAP,则此站点上共享了几种解决方法。一些解决方法让脚本运行直到发生错误,然后在下一个要处理的项目上重新启动它,其他脚本只是将工作分成小到足以避免错误。

相关Q&amp; A