我有一个不断收到此错误的Apps脚本。通过通知邮件判断,看起来时间限制是5分钟。有谁知道是否有办法延长这个时间限制?或者是否有办法再次调用Apps脚本,它从它停止的地方开始提取?任何帮助表示赞赏。
答案 0 :(得分:65)
你可以做的一件事(当然这取决于你想要完成的事情)是:
这不是一个适合所有人的解决方案,如果您发布代码,人们可以更好地为您提供帮助。
以下是我每天使用的脚本的简化代码摘录:
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的更多详情