18
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[GAS]スクリプトからトリガーをセットする話

Posted at

スクリプトからトリガーをセットする話(事業台帳ベストプラクティス)

スクリプトからトリガーをセットしたい場合ってありますよね。
まぁ、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を使わない理由

onFormSubmitonOpenという関数名にして、Simple Triggerを設定するという方法がありますし、使える状況であればこちらを使うことを推奨します。
ですが、事業台帳時代にいつのタイミングかわからないですが、onOpenがうんともすんとも言わなくなってしまった・・・という悲しい過去があります。
onFormSubmitもフォームをいっぱいつなぎこんだりしていたせいなのか・・・うまく動作せず、営業活動を一時的にストップさせてしまったりしました。
これがトラウマで、スクリプトで明示的に一つひとつ設定するのを習慣にしています。

トリガーを削除できる

トリガーを削除できるというのも実は一つ大きなポイントでした。
手動で付けると、他の人がトリガー設定したときにわけわかんなくなちゃったり、ちょっと実行時間変えよ~と思ったとき関数探してー・・・みたいなことをしなくてはいけないので。

  • トリガー設定ダブリを防ぐ
  • 付与してはいけない人に付与しない(そして勝手に持ってたら削除するため)
  • 後々の運用の手間を減らす

という理由でトリガー削除と特定の人のみの付与を行っていました。

参考

Class TriggerBuilder
Class SpreadsheetTriggerBuilder
Class FormTriggerBuilder
Class ClockTriggerBuilder

18
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?