プロジェクト内のすべてのトリガーを削除する場合
function deleteTrigger() {
var allTriggers = ScriptApp.getProjectTriggers();
for (var i = 0; i < allTriggers.length; i++) {
ScriptApp.deleteTrigger(allTriggers[i]);
}
}
triggerのIdを指定して削除する場合
function deleteTrigger(triggerId) {
var allTriggers = ScriptApp.getProjectTriggers();
for (var i = 0; i < allTriggers.length; i++) {
if (allTriggers[i].getUniqueId() == triggerId) {
ScriptApp.deleteTrigger(allTriggers[i]);
break;
}
}
}
triggerの名前を指定して削除する場合
function deleteTrigger(functionName) {
var allTriggers = ScriptApp.getProjectTriggers();
for (var i = 0; i < allTriggers.length; i++) {
if (allTriggers[i].getHandlerFunction() == functionName) {
ScriptApp.deleteTrigger(allTriggers[i]);
break;
}
}
}
おまけ
試したこと
シートにトリガーを登録する
- スクリプトでトリガーを作成する
- シートにトリガーの日付けとIDを書き込む
トリガーを削除する
- 登録されたトリガーの日付けが現在日時よりも古ければ削除する
- シートに書き込まれたデータも削除する
本当は同じことをPropertiesServiceで実装しようとしましたが
いろいろと試しているうちに頭がくしゃくしゃになってきたので
別の方法としてシートに書き出す方法から試してみることにしました
ちなみにトリガーで実行するmyFunctionはログを出すだけです
コード.gs
var SS_URL = "URL";
function myFunction() {
Logger.log("success");
}
function createTrigger() {
var date = new Date("2017/10/29/19:54");
var trigger = ScriptApp.newTrigger('myFunction')
.timeBased()
.at(date)
.create();
var trigger_id = trigger.getUniqueId();
set_values(date, trigger_id);
}
function set_values(date, trigger_id) {
var ss = SpreadsheetApp.openByUrl(SS_URL);
var sh = ss.getSheets()[0];
var row = get_last_data_row(ss, sh);
sh.getRange(row, 1).setValue(date);
sh.getRange(row, 2).setValue(trigger_id);
}
function get_past_data() {
var ss = SpreadsheetApp.openByUrl(SS_URL);
var sh = ss.getSheets()[0];
var row = get_last_data_row(ss, sh);
var past_data = [];
for (var i = 0; i < row; i++) {
var date = sh.getRange((i + 2), 1).getValue();
var id = sh.getRange((i + 2), 2).getValue();
if (date < new Date()) {
past_data.push(id);
sh.deleteRow(i + 2);
}
}
return past_data;
}
function deleteTrigger() {
var past_data = get_past_data();
var allTriggers = ScriptApp.getProjectTriggers();
for (var i = 0; i < allTriggers.length; i++) {
for (var j = 0; j < past_data.length; j++) {
if (allTriggers[i].getUniqueId() == past_data[j]) {
ScriptApp.deleteTrigger(allTriggers[i]);
}
}
}
}
function get_last_data_row(ss, sh) {
var values = sh.getRange("A:A").getValues();
for (var i = values.length - 1; i >= 0; i--) {
if (values[i] != "") {
break;
}
}
var last_row = i + 2;
return last_row;
}
|
意訳.gs
スプレッドシートのURLを設定する
この処理は以下を実行する
設定したテキストをログに出す
この処理は以下を実行する
新しい日付けを設定する
指定した処理(例ではmyFunction)をトリガーに設定する
時間主導型で
指定した日付けで
トリガーを作成する
作成したトリガーのIDを取得する
set_valuesに日付けとトリガーのIDを渡す
この処理は以下を実行する
スプレッドシートを取得する
0番目のシートを取得する
データを入力する行を取得する
その行の1列目のに日付けを入力する
その行の1列目にトリガーのIDを入力する
この処理は以下を実行する
スプレッドシートを取得する
0番目のシートを取得する
データが入力されている最終行(の次)を取得する
past_dataという入れ物を用意する
最終行になるまで2行目から以下を繰り返す
1列目のi+2行目の値を取得する(日付)
2列目のi+2行目の値を取得する(trigger_id)
もし日付けが現在日時よりも前なら
past_dataにtrigger_idを追加して
i+2行目を削除する
past_dataを返す
この処理は以下を実行する
past_dataを取得する
現在のプロジェクトのトリガーをすべて取得する
その数の分だけ以下を繰り返す
past_dataに入っている個数分以下を繰り返す
もしallTriggersのi番目とpast_dataのj番目のトリガーIDが同じなら
そのトリガーを削除する
この処理は以下を実行する
指定されたシートのA列の値をすべて取得する
一番下から上に向かって以下を繰り返す
もし値が空でなければ
繰り返しから抜ける
値が入っている最終行の次の行番号を
返す
|
試してみる
トリガーを登録する
createTrigger()の中の
var date = new Date("2017/10/29/19:54");
この日時を変えていくつか登録します
例として以下の日時を設定して
createTrigger()を5回実行します
- 2017/10/29 20:51
- 2017/10/29 20:52
- 2017/10/29 20:53
- 2017/10/30 20:00
- 2017/10/31 20:00
編集>現在のプロジェクトのトリガーを選択します
createTrigger()を実行して登録した5つのトリガーが
現在のプロジェクトのトリガーに表示されていると思います
var SS_URL = "URL";
で設定したスプレッドシートを開くと
A列に日付け
B列にトリガーのID
が書き込まれています
トリガーを削除する
deleteTrigger()を実行すると
現在日時よりも前に設定さているトリガーが削除されます
シートからも削除されます