在Google Apps脚本中超出了最长执行时间
我有一个Apps脚本,不断得到这个错误。 通过通知邮件来判断,看起来时间限制是5分钟。 有谁知道是否有办法延长这个时间限制? 或者也许有办法再次调用Apps脚本,并从停止的地方回来? 任何帮助表示赞赏。
你可以做的一件事(这当然取决于你想要完成的)是:
- 将所需的信息(例如循环计数器)存储在电子表格或其他永久存储区(即ScriptProperties)中。
- 让你的脚本每五分钟左右终止一次。
- 设置一个时间驱动的触发器,每5分钟运行脚本(或者使用脚本服务以编程方式创build一个触发器)。
- 在每次运行时,从您使用的永久性存储中读取已保存的数据,并继续从停止的位置运行脚本。
这不是一个适合所有人的解决scheme,如果你发布你的代码,人们将能够更好地协助你。
以下是我每天使用的脚本的简化代码摘录:
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:variablesREASONABLE_TIME_TO_WAIT
应该足够大,以便触发新的触发器。 (我把它设置为5分钟,但我认为可能会比这less)。
注2: doSomeWork()
必须是一个执行速度相对较快的函数(我会说不到1分钟)。
注3:谷歌已弃用Script Properties
,并引入了Properties Service
。 该function已相应修改。
另外,尽量减less对谷歌服务的电话数量。 例如,如果您想要更改电子表格中的单元格范围,请不要读取每个单元格,然后对其进行修改并将其存储回去。 而是将整个范围(使用Range.getValues() )读入内存,对它进行变异并将其全部存储(使用Range.setValues() )。
这应该会节省很多执行时间。
Anton Soradoi的答案似乎没问题,但考虑使用caching服务,而不是将数据存储到临时表中。
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月,脚本运行时间的限制 是6分钟 。
我已经使用ScriptDB来保存我的地方,同时在循环中处理大量的信息。 该脚本可以/超过5分钟的限制。 通过在每次运行期间更新ScriptDb,脚本可以从数据库中读取状态,并在所有处理完成之前提取它的停止位置。 试试这个策略,我想你会对结果感到满意。
如果您使用的是G Suite Business或Enterprise版本。 你可以在应用程序制造商启用你的脚本运行运行时将运行时间从6分钟增加到30分钟后注册App Maker的早期访问 🙂
有关应用程序制造商的更多细节请点