スクリプトからトリガーをセットする話(事業台帳ベストプラクティス)
スクリプトからトリガーをセットしたい場合ってありますよね。
まぁ、Qiitaとかにも載ってると思うんですが、さらっとまとめておきました。
サンプルコード
// スプレッドシートkey
var book = SpreadsheetApp.openById("<spreadshet_key>");
var sheet = book.getSheetByName("<sheet_name>");
// フォームkey
var form = FormApp.openById("<form_key>");
function setTrigger(){
// 実行者が持っているこのスクリプトでのトリガーを全削除
var allTriggers = ScriptApp.getProjectTriggers();
for( var i = 0; i < allTriggers.length; ++i ){
ScriptApp.deleteTrigger(allTriggers[i]);
}//for_i
// これを実行している人のメールアドレス
var email = Session.getActiveUser().getEmail();
if( email === "<mail_address>"){
// 正常処理
// Slackにでも投げておこう
send_slack("トリガーセットしたよ~");
}else{
// 異常検知処理
// slackにでも投げておこう
send_slack(email+"がトリガー欲しいってさ。断ったけどね。");
return ;
}//if
// スプレッドシートが開かれたとき
ScriptApp
.newTrigger("<function_name>")
.forSpreadsheet(lib.bookForms)
.onOpen()
.create();
// フォーム送信時
ScriptApp
.newTrigger("<function_name>")
.forForm(form)
.onFormSubmit()
.create();
//夜1時に作動
ScriptApp
.newTrigger("<function_name>")
.timeBased()
.atHour(1)
.everyDays(1)
.create();
//毎週日曜_9:00
ScriptApp
.newTrigger("<function_name>")
.timeBased()
.atHour(9)
.everyWeeks(1)
.onWeekDay(ScriptApp.WeekDay.SUNDAY)
.create();
return ;
}//func_setTrigger
スクリプトで設定した経緯
事業台帳時には、1つのスクリプトで10個弱のトリガーを保有するという鬼のようなことをしておりまして、
- 手動で設定するのはめんどくさい
- 手動で設定すると絶対間違える
- なにより、スクリプトが重いかつ複雑すぎてエラーでトリガーが度々吹っ飛ぶ
という理由から、スクリプトで行っておりました。
onFormSubmit や onOpenを使わない理由
onFormSubmit
やonOpen
という関数名にして、Simple Triggerを設定するという方法がありますし、使える状況であればこちらを使うことを推奨します。
ですが、事業台帳時代にいつのタイミングかわからないですが、onOpen
がうんともすんとも言わなくなってしまった・・・という悲しい過去があります。
onFormSubmit
もフォームをいっぱいつなぎこんだりしていたせいなのか・・・うまく動作せず、営業活動を一時的にストップさせてしまったりしました。
これがトラウマで、スクリプトで明示的に一つひとつ設定するのを習慣にしています。
トリガーを削除できる
トリガーを削除できるというのも実は一つ大きなポイントでした。
手動で付けると、他の人がトリガー設定したときにわけわかんなくなちゃったり、ちょっと実行時間変えよ~と思ったとき関数探してー・・・みたいなことをしなくてはいけないので。
- トリガー設定ダブリを防ぐ
- 付与してはいけない人に付与しない(そして勝手に持ってたら削除するため)
- 後々の運用の手間を減らす
という理由でトリガー削除と特定の人のみの付与を行っていました。
参考
Class TriggerBuilder
Class SpreadsheetTriggerBuilder
Class FormTriggerBuilder
Class ClockTriggerBuilder