GAS(Google Apps Script)において、トリガーのセットは非常に重要ですよね。onEditやonOpen等のトリガーなしで動作する関数を使用しないシーンや、手動で関数を実行せずに自動化したいシーン等では、基本的にトリガーのセットはマストになります。

トリガーは一度セットすれば自動で削除されることはありませんが、トリガーがセットされた状態のスプレッドシート及びGASを複製しても、トリガーのセット状態は複製されずに初期状態になります。

これが困る場合があります。それは、一つのスプレッドシートをマスター用に用意して、それを繰り返し複製して利用する場合です。

例えばマスターに別ファイルとの同期処理スクリプトを実装し、そのスクリプトの自動実行をトリガーにセットしていたとします。このマスターを複製すると、トリガーは初期化されているので、トリガーをセットし直す必要があります。

関係者全員がある程度GASを利用できるリテラシーを保有していれば、複製の度にトリガーをセットし直すことも可能ではありますが、そのようなチームは多くはありません。いや、そのようなチームだとしても、複製の度にトリガーをセットし直すというルーティンを守るのはけっこう億劫です。

そのような場合には、新規のGASを利用する際に必ず実行が必要な「スクリプトの承認作業」と一緒にトリガーのセットも自動化してしまうという技が重宝されます。

それでは、トリガーを自動でセットするサンプルコードをご紹介いたします。

私が作成したサンプルコードの主な仕様は以下の通りです。

<サンプルコードの仕様>

・トリガーの重複セットを防止するため、既存の同一名のトリガーがない場合にのみ新規でトリガーをセットします。
・"セットする関数名をココに入力"の部分を、トリガーにセットされたい実際の関数名に差し替えてください。
・結果に応じて、トリガーをセットしたか、既存のトリガーがセット済みであったかメッセージが表示されます。

onOpen関数でグローバルメニューに追加したカスタムメニュー内に導入するといったカスタマイズを行えば更に便利にご利用いただけるかと思いますので、ぜひ、ご自由にお使いください!

※ご質問にはお答えできませんので予めご承知おきくださいませ。

コード

function autoCreateTrigger() {
  const functionName = "セットする関数名をココに入力";
  const triggers = ScriptApp.getProjectTriggers();
  
  // 既存のトリガーの有無をチェックする
  const existingTrigger = triggers.find(trigger => 
    trigger.getHandlerFunction() === functionName && 
    trigger.getEventType() === ScriptApp.EventType.ON_EDIT
  );
  
  // 既存のトリガーが無い場合のみ新規でトリガーを作成する
  if (!existingTrigger) {
    const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    ScriptApp.newTrigger(functionName)
      .forSpreadsheet(spreadsheet)
      .onEdit()
      .create();

    Browser.msgBox("トリガーを設定しました!");
  } else {
    Browser.msgBox("トリガーは既に設定済みです。");
  }
}