为什么基于时间的 GAS 触发器在 V8 中因未知原因被禁用?
Why does time-based GAS Trigger get disabled for unknown reason in V8?
我有(除其他外)以下四个功能。
fallback()
newSubmission()
installSubmissionTrigger()
uninstallSubmissionTrigger()
我有一个触发器:
- 在表单提交时运行。
- 调用
fallback()
将内容发布到电子表格以供审阅。
fallback
呼叫 installSubmissionTrigger()
.
installSubmissionTrigger
每分钟创建一个基于时间的触发器 运行ning。
- 触发器调用
newSubmission()
.
newSubmission
做我想做的事并调用 uninstallSubmissionTrigger()
.
uninstallSubmissionTrigger
删除基于时间的触发器。
所有这些使用 Rhino 都可以正常工作,但是当我启用 V8 时,基于时间的触发器在应该 运行.
时由于未知原因而被禁用
同样在使用 V8 时,如果我手动 运行 installSubmissionTrigger()
,触发器会触发。
如果我手动 运行 fallback()
,触发器也会触发。
触发器被禁用的未知原因可能是什么?
function fallback(event) {
...
installSubmissionTrigger();
...
}
function newSubmission() {
...
uninstallSubmissionTrigger();
...
}
function installSubmissionTrigger() {
var properties = PropertiesService.getScriptProperties();
if(!properties.getProperty("triggerID")) {
var trigger = ScriptApp.newTrigger('newSubmission').timeBased().everyMinutes(1).create();
properties.setProperty("triggerID", trigger.getUniqueId());
Logger.log("Creating newSubmission trigger: " + trigger.getUniqueId());
}
}
function uninstallSubmissionTrigger() {
var properties = PropertiesService.getScriptProperties();
properties.deleteProperty("triggerID");
// Loop over all triggers.
var allTriggers = ScriptApp.getProjectTriggers();
for (var i = 0; i < allTriggers.length; i++) {
// If the current trigger is the correct one, delete it.
if (allTriggers[i].getHandlerFunction() === 'newSubmission') {
ScriptApp.deleteTrigger(allTriggers[i]);
}
}
}
用例示例:
- 一位客户提交了新门报价请求。
- 然后他们还提交了一份报价请求,要求他们对房屋进行扩建。
- 这扇门很可能是扩建的一部分,因此理想情况下,我们会将此请求发送给处理房屋扩建和门的公司。
- 但如果门请求得到立即处理,它可能已被发送给专门处理门的专家。
您遇到的这个问题已被报告,它与 V8 运行时有关 [1]。您可以使用按预期工作的 DEPRECATED_ES5
运行时版本。
以下是我如何克服这个问题的。我在我的脚本中添加了一个 doGet(e) 函数,并使我的脚本成为一个网络应用程序。现在,如果您从 doGet 或 doPost 中设置触发器,您的触发器将不会被禁用。至少在我测试时它没有被禁用。
最后,我使用了免费的 cronjob 服务,并在每周的第 N 天向我的网络应用 [DEPLOYMENT] URL 发送一个 GET 请求。不是一个理想的解决方案,但作为最后的手段,它还不错。
现在,如果您希望在完成工作后从您自己的脚本设置触发器,那么只需向您自己的脚本的 webapp URL 发出获取请求,它应该以相同的方式工作。
我有(除其他外)以下四个功能。
fallback()
newSubmission()
installSubmissionTrigger()
uninstallSubmissionTrigger()
我有一个触发器:
- 在表单提交时运行。
- 调用
fallback()
将内容发布到电子表格以供审阅。 fallback
呼叫installSubmissionTrigger()
.installSubmissionTrigger
每分钟创建一个基于时间的触发器 运行ning。- 触发器调用
newSubmission()
. newSubmission
做我想做的事并调用uninstallSubmissionTrigger()
.uninstallSubmissionTrigger
删除基于时间的触发器。
所有这些使用 Rhino 都可以正常工作,但是当我启用 V8 时,基于时间的触发器在应该 运行.
时由于未知原因而被禁用同样在使用 V8 时,如果我手动 运行 installSubmissionTrigger()
,触发器会触发。
如果我手动 运行 fallback()
,触发器也会触发。
触发器被禁用的未知原因可能是什么?
function fallback(event) {
...
installSubmissionTrigger();
...
}
function newSubmission() {
...
uninstallSubmissionTrigger();
...
}
function installSubmissionTrigger() {
var properties = PropertiesService.getScriptProperties();
if(!properties.getProperty("triggerID")) {
var trigger = ScriptApp.newTrigger('newSubmission').timeBased().everyMinutes(1).create();
properties.setProperty("triggerID", trigger.getUniqueId());
Logger.log("Creating newSubmission trigger: " + trigger.getUniqueId());
}
}
function uninstallSubmissionTrigger() {
var properties = PropertiesService.getScriptProperties();
properties.deleteProperty("triggerID");
// Loop over all triggers.
var allTriggers = ScriptApp.getProjectTriggers();
for (var i = 0; i < allTriggers.length; i++) {
// If the current trigger is the correct one, delete it.
if (allTriggers[i].getHandlerFunction() === 'newSubmission') {
ScriptApp.deleteTrigger(allTriggers[i]);
}
}
}
用例示例:
- 一位客户提交了新门报价请求。
- 然后他们还提交了一份报价请求,要求他们对房屋进行扩建。
- 这扇门很可能是扩建的一部分,因此理想情况下,我们会将此请求发送给处理房屋扩建和门的公司。
- 但如果门请求得到立即处理,它可能已被发送给专门处理门的专家。
您遇到的这个问题已被报告,它与 V8 运行时有关 [1]。您可以使用按预期工作的 DEPRECATED_ES5
运行时版本。
以下是我如何克服这个问题的。我在我的脚本中添加了一个 doGet(e) 函数,并使我的脚本成为一个网络应用程序。现在,如果您从 doGet 或 doPost 中设置触发器,您的触发器将不会被禁用。至少在我测试时它没有被禁用。
最后,我使用了免费的 cronjob 服务,并在每周的第 N 天向我的网络应用 [DEPLOYMENT] URL 发送一个 GET 请求。不是一个理想的解决方案,但作为最后的手段,它还不错。
现在,如果您希望在完成工作后从您自己的脚本设置触发器,那么只需向您自己的脚本的 webapp URL 发出获取请求,它应该以相同的方式工作。