Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

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

s_maeda_fukui
目指せ!カイゼンマスター!(マーケティング・エンジニア営業企画もどき) 高専・電子情報卒→大学文転→CRMマーケター(スクラムマスター取れた。)
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away