【发布时间】:2013-02-20 04:21:24
【问题描述】:
是否允许像这样在 Google App 脚本中链接时间触发器:
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 分钟。
有时脚本被中断并且数据未完全处理,这对我有什么影响!我没有收到任何电子邮件提醒,日志或执行记录中也没有任何内容 - 一切正常。
我开始认为可能 10 秒启动脚本方法相当快,但毕竟它在 API 中......
有什么想法吗? 这是唯一可能的解决方案,如何将大任务分成更小的部分,因为 Google App 脚本的运行时间不能超过 ~ 5-6 分钟(请参阅配额)。
【问题讨论】:
-
您每天将使用多少总处理时间?
-
在开发过程中,我每天至少运行 20 次脚本......这不会超过 1 小时/天,这是免费谷歌应用程序的限制。我们确实有 Google Apps for Business(更大的配额)。
-
我担心您会达到每个脚本的 20 个触发器配额。您提供的代码正在重复创建触发器。所以也许你应该删除以前的触发器?那是
ScriptApp.getProjectTriggers()。检查处理函数是否为"timeDrivenEvent",如果使用ScriptApp.deleteTrigger()则删除。 -
为什么不使用一个每 5 分钟触发一次并在任务完成时被删除的触发器?
-
不一定,您可以在第一次调用时直接调用该函数而无需使用触发器,第二次(以及随后的)调用将是“定时器触发”。让我们知道您在测试后的结果。
标签: google-apps-script google-api google-apps