Программно удалить основанный на времени триггер Google Apps Script по имени триггера?

Как программно удалить временной триггер Сценария Google Apps по имени триггерной функции, а не по идентификатору triggerarray?

Я создаю триггер и позже я хочу удалить триггер по имени. Я попробовал это:

ScriptApp.deleteTrigger("myfunction");

Но это не работает. Я не хочу использовать этот метод:

var triggers = ScriptApp.getProjectTriggers();
    ScriptApp.deleteTrigger(triggers[0]);

Поскольку у меня есть более одного триггера одновременно, и я могу удалить неправильный! Так как же удалить триггер по его имени вместо идентификатора массива триггеров?

function demo(){
  ScriptApp.newTrigger("myfunction")
    .timeBased()
    .everyMinutes(1)
    .create(); 
  }

  function myfunction(){
    // do some stuff here then stop the trigger by name
    ScriptApp.deleteTrigger("myfunction");
  }
}

7 ответов

Если вы перебираете все триггеры, вы можете получить доступ к имени функции обработчика с помощью:

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

... как показано в документах.

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]);
 }

Из документов

Вы можете удалить его именно при срабатывании триггера на основе уникального идентификатора и кода, например:

      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

Переберите триггеры, ища любые, которые соответствуют функции-обработчику, затем удалите их.

Хотя в 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;}
    );
}

Смотрите документацию по ScriptApp и Trigger.

На основании ответа Брайана П, но с кодом.

Перейдите в "Правка"> "Триггеры текущего проекта". Здесь все ваши триггеры хранятся и управляются. Функция handlerFunction отражает имя "Выполнить" в "Триггерах текущего проекта". По моему опыту, Google смешивает их, поэтому вам нужно циклически пройтись, найти триггер по функции handler, а затем удалить. Если у вас есть несколько триггеров с одним и тем же именем "Выполнить", возможно, вам придется разорвать цикл и стать более креативным. Но у меня работает следующее.

function Delete() {
  var Triggers = ScriptApp.getProjectTriggers();
  for (var i = 0; i < Triggers.length; i++) {
    if (Triggers[i].getHandlerFunction() == "'Run' Name") {
      ScriptApp.deleteTrigger(Triggers[i])
    }
  }
}

getHandlerFunction() возвращает функцию полностью как текст (имя, скобки, аргументы, тело).

Общее решение: используйте indexOf.

Например,

  1. цикл через триггеры
  2. if triggers.getHandlerFunction().indexOf(name)!= -1
  3. удалить триггер

Но будьте осторожны, потому что в этом случае вы можете получить другой триггер по тексту в теле. Чтобы избежать этой проблемы, вы можете:

  1. добавьте скобки, параметры или некоторые уникальные символы в indexOf - .indexOf(name + "(){") и отформатируйте свой код.
  2. или / и создайте новую функцию с уникальным именем, например 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;
    }
}}
      function setTrigger() {

deleteTriggers();  
scheduledTrigger(14,58);
}

function scheduledTrigger(hours,minutes){

var today_D = new Date();
var year = today_D.getFullYear();
var month = today_D.getMonth();
var day = today_D.getDate();

pars = [year,month,day,hours,minutes];

var scheduled_D = new Date(...pars);
var hours_remain=Math.abs(scheduled_D - today_D) / 36e5;
ScriptApp.newTrigger("orderFromSheet")
.timeBased()
.after(hours_remain * 60 *60 * 1000)
.create()
}

function deleteTriggers() {

var triggers = ScriptApp.getProjectTriggers();
for (var i = 0; i < triggers.length; i++) {
  if (   triggers[i].getHandlerFunction() == "orderFromSheet") {
    ScriptApp.deleteTrigger(triggers[i]);
  }
}
}
Другие вопросы по тегам