Программно удалить основанный на времени триггер 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()
}
... как показано в документах.
// 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.
Например,
- цикл через триггеры
- if triggers.getHandlerFunction().indexOf(name)!= -1
- удалить триггер
Но будьте осторожны, потому что в этом случае вы можете получить другой триггер по тексту в теле. Чтобы избежать этой проблемы, вы можете:
- добавьте скобки, параметры или некоторые уникальные символы в 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;
}
}}
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]);
}
}
}