如何通过触发函数的名称以编程方式删除Google Apps脚本基于时间的触发器,而不是使用triggerarray id?
我正在创建一个触发器,稍后我想按名称删除触发器。我试过这个:
ScriptApp.deleteTrigger("myfunction");
但它不起作用。我不想使用这种方法:
var triggers = ScriptApp.getProjectTriggers();
ScriptApp.deleteTrigger(triggers[0]);
由于我同时有多个触发器,可能会删除错误的触发器! 那么如何通过名称而不是触发器数组ID来删除触发器?
function demo(){
ScriptApp.newTrigger("myfunction")
.timeBased()
.everyMinutes(1)
.create();
}
function myfunction(){
// do some stuff here then stop the trigger by name
ScriptApp.deleteTrigger("myfunction");
}
}
答案 0 :(得分:10)
如果遍历所有触发器,则可以使用以下命令访问处理函数名称:
var triggers = ScriptApp.getProjectTriggers();
for ( var i in triggers ) {
var funcName = triggers[i].getHandlerFunction()
}
...作为shown in the docs。
答案 1 :(得分:3)
// Deletes all triggers in the current project.
var triggers = ScriptApp.getProjectTriggers();
for (var i = 0; i < triggers.length; i++) {
ScriptApp.deleteTrigger(triggers[i]);
}
答案 2 :(得分:2)
遍历触发器,以查找与处理函数匹配的所有触发器,然后将其删除。
尽管OP仅提及了一个触发器,但多个触发器有可能针对同一个处理函数,因此以下代码段可满足一次或多次匹配。
function myfunction(){
// do some stuff here then stop the trigger(s) by name
var triggers = getProjectTriggersByName('myfunction');
for (var i = 0; i < triggers.length; ++i)
ScriptApp.deleteTrigger(triggers[i]);
}
function getProjectTriggersByName(name) {
return ScriptApp.getProjectTriggers().filter(
function(s) {return s.getHandlerFunction() === name;}
);
}
基于 Bryan P 的回答,但带有代码。
答案 3 :(得分:2)
转到“编辑”>“当前项目触发器”。在此存储和管理所有触发器。 handlerFunction在“当前项目的触发器”中反映“运行”名称。 Google根据我的经验将这些混合在一起,因此您必须循环浏览,通过handlerFunction查找触发器,然后再删除。如果您有多个具有相同“运行”名称的触发器,则可能必须打破循环并获得更多创造力。但是以下对我有用。
function Delete() {
var Triggers = ScriptApp.getProjectTriggers();
for (var i = 0; i < Triggers.length; i++) {
if (Triggers[i].getHandlerFunction() == "'Run' Name") {
ScriptApp.deleteTrigger(Triggers[i])
}
}
}
答案 4 :(得分:1)
getHandlerFunction()完全以文本(名称,方括号,参数,正文)返回函数。
常见解决方案:使用 indexOf 。
例如
但是要小心,因为在这种情况下,您可以通过正文中的文本获得另一个触发信号。为避免此问题,您可以:
- 将括号,参数或一些唯一的字符添加到indexOf-.indexOf(name +“(){”))并设置代码格式。
- 或/并创建具有唯一名称的新函数,例如triggerMyFunction,将其称为myFunction。然后你可以删除 通过名称“ triggerMyFunction”触发
样品
此函数按名称删除所有匹配的触发器
function deleteTriggersByName(name){
var triggers = ScriptApp.getProjectTriggers();
for (var i = 0; i < triggers.length; i++){
if (triggers[i].getHandlerFunction().indexOf(name) != -1)
{
ScriptApp.deleteTrigger(triggers[i]);
}
}}
此函数按名称删除首次匹配的触发器
function deleteTriggerByName(name){
var triggers = ScriptApp.getProjectTriggers();
for (var i = 0; i < triggers.length; i++){
if (triggers[i].getHandlerFunction().indexOf(name) != -1)
{
ScriptApp.deleteTrigger(triggers[i]);
break;
}
}}
答案 5 :(得分:0)
您可以根据唯一的ID(例如:
function trigger4SendMediaGroup(event) {
try {
var triggerUid = event.triggerUid;
var triggers = ScriptApp.getProjectTriggers();
if(triggers && triggers.length > 0){
triggers.forEach(item=>{
if(item.getUniqueId() == triggerUid){
ScriptApp.deleteTrigger(item);
}
})
}
//other process