Возможно ли дублировать триггеры в Google App Maker? - PullRequest
0 голосов
/ 21 января 2019

Мне было интересно, когда кто-то создает триггер с определенным обработчиком, должны ли мы сначала посмотреть, существует ли триггер с этой определенной функцией-обработчиком?Если это так, удалите его и добавьте новый триггер.

Или каждый раз, когда создается триггер (скажем, случайно кнопка с функцией, которая создает триггер, дважды щелкают), старый переопределяется?

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Вы можете сделать что-то вроде этого:

function createTrigger(handlername) {
  var triggersA=ScriptApp.getProjectTriggers();
  var found=false;
  for(var i=0;i<triggersA.length;i++){
    if(triggersA[i].getHandlerFunction()==handlername){
      found=true;
      break;
    }
  }
  if(!found){
    //Create trigger here
  }
}
0 голосов
/ 21 января 2019

При создании триггера метод возвращает новый экземпляр класса Trigger .Это означает, что невозможно дублировать триггеры, поскольку каждый из них будет иметь уникальный идентификатор, который вы можете получить, вызвав метод getUniqueId () .

Итак, в вашем примере:

скажем, случайно кнопка с функцией, которая создает триггер, была нажата дважды

Будет создано два триггера, выполняющих одну и ту же вещь.Поэтому в идеале лучше всего создать триггер и сохранить уникальный идентификатор в свойстве скрипта apps , используя уникальное имя.Например:

var emailTrigger = ScriptApp.newTrigger("sendEmailReport").timeBased().everyHours(2).create();
var triggerId = emailTrigger.getUniqueId();
PropertiesService.getScriptProperties().setProperty("emailTriggerId", triggerId)

Конечно, вам нужно будет реализовать способ проверить, существует ли свойство со значением.Если это так, то вы пропустите создание нового.Если этого не произойдет, вы приступите к созданию нового.Итак, в итоге, это должно выглядеть примерно так:

function createNewTrigger() {  
  var existingTrigger = PropertiesService.getScriptProperties().getProperty("emailTriggerId");
  if(!existingTrigger){
    var emailTrigger = ScriptApp.newTrigger("sendEmailReport").timeBased().everyHours(2).create();
    var triggerId = emailTrigger.getUniqueId();
    PropertiesService.getScriptProperties().setProperty("emailTriggerId", triggerId);
  } else {
    //return "Trigger alredy exists";
    //throw new Error("Trigger alredy exists");
  }    
}

БОНУС : чтобы удалить триггер , вам придется проверить, существует ли он уже,Что-то вроде этого должно привести вас в правильном направлении:

function deleteTrigger(){
  var existingTrigger = PropertiesService.getScriptProperties().getProperty("emailTriggerId");
  if(existingTrigger){
    var allTriggers = ScriptApp.getProjectTriggers();
    for(var i=0; i<allTriggers.length; i++){
      if(allTriggers[i].getUniqueId() === existingTrigger){
        ScriptApp.deleteTrigger(allTriggers[i]);
        break;
      }
    }
  } else {
    //return "Trigger does not exists";
    //throw new Error("Trigger does not exists";
    //createNewTrigger();
  }
}
...