通过触发器名称以编程方式删除基于时间的Google Apps脚本触发器?

时间:2015-10-17 15:46:56

标签: google-apps-script triggers

如何通过触发函数的名称以编程方式删除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");
  }
}

6 个答案:

答案 0 :(得分:10)

如果遍历所有触发器,则可以使用以下命令访问处理函数名称:

var triggers = ScriptApp.getProjectTriggers();
for ( var i in triggers ) {
  var funcName = triggers[i].getHandlerFunction()
}

...作为shown in the docs

答案 1 :(得分:3)

@code-guy

 // Deletes all triggers in the current project.
 var triggers = ScriptApp.getProjectTriggers();
 for (var i = 0; i < triggers.length; i++) {
   ScriptApp.deleteTrigger(triggers[i]);
 }

From Docs

答案 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;}
    );
}

请参阅有关ScriptAppTrigger的文档。

基于 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

例如

  1. 通过触发器循环
  2. 如果triggers.getHandlerFunction()。indexOf(name)!= -1
  3. 删除触发器
  

但是要小心,因为在这种情况下,您可以通过正文中的文本获得另一个触发信号。为避免此问题,您可以:

     
      
  1. 将括号,参数或一些唯一的字符添加到indexOf-.indexOf(name +“(){”))并设置代码格式。
  2.   
  3. 或/并创建具有唯一名称的新函数,例如triggerMyFunction,将其称为myFunction。然后你可以删除   通过名称“ triggerMyFunction”触发
  4.   

样品

此函数按名称删除所有匹配的触发器

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