Google apps script 谷歌应用程序脚本:时间触发器不可靠
是否允许在Google应用程序脚本中链接时间触发器,如下所示:Google apps script 谷歌应用程序脚本:时间触发器不可靠,google-apps-script,google-api,google-apps,Google Apps Script,Google Api,Google Apps,是否允许在Google应用程序脚本中链接时间触发器,如下所示: function doGet(e){ //first invocation by user, HTTP GET if (e == null || e.parameters == null) { return ContentService.createTextOutput("EMPTY"); } saveGetParametersForUser(Session.getUser().getE
function doGet(e){ //first invocation by user, HTTP GET
if (e == null || e.parameters == null) {
return ContentService.createTextOutput("EMPTY");
}
saveGetParametersForUser(Session.getUser().getEmail(), e);
//trigger 10 seconds
var timeTrigger = ScriptApp.newTrigger("timeDrivenEvent").timeBased().after(10 * 1000).create();
}
function timeDrivenEvent() { //runs until there are some data in ScriptDB
Logger.log("INVOKED AT " + new Date());
removeAllPreviousTriggers(); //removes old time triggers
var somedata = loadTaskData({email: "" + Session.getUser().getEmail()});
var remainingData = processTaskData(somedata);
if(remainingData == null){
return; //we are finished here
}
removePreviousAndSaveRemainingTaskData(remainingData);
var timeTrigger = ScriptApp.newTrigger("timeDrivenEvent").timeBased().after(10 * 1000).create();
}
- 用户doGet()的第一次调用
- 在处理所有数据之前,脚本以10秒的间隔调用自身(例如,处理2分钟,10秒什么都没有发生,然后再处理2分钟…)
- 处理数据的大小约为几千字节,处理时间通常为1-2分钟
这是唯一可能的解决方案,因为Google应用程序脚本的运行时间不能超过5-6分钟(请参阅配额),所以如何将大任务分成小任务。有一个周期性时间触发器可以很好地工作,正如评论中建议的那样 我只是想知道为什么时间触发链不起作用!我打破了谷歌应用程序脚本不喜欢的原则 文件:
方法everyMinutes将要创建的触发器设置为在以分钟为单位传递的时间间隔内触发,该时间间隔必须是1、5、10、15或30中的一个。您每天将使用多少总处理时间?在开发期间,我每天至少运行20次脚本。。。这不超过1小时/天,这是免费谷歌应用程序的限制。我们确实有谷歌商务应用程序(更大的配额)。我担心每个脚本都会达到20个触发配额。您给出的代码正在重复创建触发器。所以也许你应该删除以前的触发器?那就是
ScriptApp.getProjectTriggers()
。检查处理程序函数是否为“timeDrivenEvent”
,如果使用ScriptApp.deleteTrigger()
,则将其删除。为什么不使用一个触发器,每5分钟触发一次,并在任务完成时将其删除?不一定,您可以在第一次调用时直接调用该函数,而不使用第二次调用的触发器(和下面的)调用将是“计时器触发”。让我们知道您在测试后的结果。感谢更新,很高兴知道它有帮助。这个新的解决方案带来了新的问题。我可能需要使用一些锁定,因为脚本有时可以同时运行两次(例如,当处理时间>1分钟时,脚本实例开始运行,因为我正在使用everyMinute(1).Google应用程序脚本给我带来了很多痛苦。您可以使用ScriptProperties中存储的标志来允许脚本仅在处理当前区块时运行-或者您可以使用5分钟的触发器来确保没有“重叠”。@MartinV。更好的可能是使用LockService.getPrivateLock();