我想知道当有人使用某个处理程序创建触发器时,我们是否应该首先查看是否具有该特定处理程序功能的触发器?如果确实如此,则将其删除,然后添加新触发器。
还是每次创建触发器(让我们不小心按下具有创建触发器功能的按钮两次),旧的按钮都会被覆盖?
答案 0 :(得分:0)
创建触发器后,方法returns是Trigger类的新实例。这意味着不可能重复触发器,因为每个触发器都有唯一的ID,您可以通过调用方法getUniqueId()来获得。
在您的示例中:
让我们不小心说两次单击具有创建触发器功能的按钮
将创建两个执行相同操作的触发器。因此,理想情况下,最好的办法是创建一个触发器,并使用唯一名称将唯一ID保存到apps script property中。例如:
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");
}
}
奖励:要delete the trigger,您必须检查它是否已经存在。这样的事情应该可以指引您正确的方向:
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();
}
}
答案 1 :(得分:0)
您可以执行以下操作:
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
}
}