GASでトリガーをコードで
作成・削除・管理する方法

トリガー(決まった条件で関数を自動実行する仕組み)を画面から手動設定するのではなく、ScriptAppでコード化する方法を解説します。作成・一覧・削除、そして重複を防ぐ作り直しパターンまで、動くコードで紹介します。

|対象: GAS / トリガー / ScriptApp

Table of Contents

なぜトリガーをコードで管理するのか

GASのトリガーは、エディタの「トリガー」画面から手動で登録できます。手軽ですが、次のような場面で困ります。

配布・複製で消える

スクリプトをコピーして配布すると、画面で設定したトリガーは引き継がれず、各自が手作業で再設定することになる

設定漏れ・二重登録

手動設定は付け忘れや同じトリガーの二重登録が起きやすく、原因の特定に時間がかかる

棚卸しがしにくい

今どのトリガーが何個動いているのかを、画面を開かないと把握できない

オン・オフの自動化

特定の期間だけ動かす、処理の中で自分自身のトリガーを付け替えるといった制御ができない

コードで管理すれば、セットアップ関数を1回実行するだけで誰の環境でも同じトリガーを再現でき、 一覧・削除・作り直しもすべてコードで完結します。

時間主導トリガーをコードで作成する

基本はScriptApp.newTrigger("関数名")から始めます。時間主導トリガー(時刻ベースで自動実行)はtimeBased()に続けて間隔を指定し、最後にcreate()で確定します。下のセットアップ関数を一度実行すれば、以後は毎朝自動で動きます。

// 毎日 朝7時台に dailyJob を実行するトリガーを作る
function createDailyTrigger() {
  ScriptApp.newTrigger("dailyJob")
    .timeBased()
    .everyDays(1)
    .atHour(7) // 7:00〜7:59 の間に実行される(分は指定不可)
    .create();
}

// 実際に動かしたい処理
function dailyJob() {
  Logger.log("毎朝の定期処理を実行しました");
}

atHour(7)は「7時台」の意味で、正確な分は指定できません。7:00ちょうどに動くとは限らず、7時台のどこかで実行されます。

実行間隔のバリエーション

時間主導トリガーは、時間おき・分おき・曜日指定・特定日時の1回実行など、目的に合わせて間隔を選べます。 代表的なパターンをまとめました。

// 1時間おきに実行
ScriptApp.newTrigger("hourlyJob").timeBased().everyHours(1).create();

// 15分おきに実行(指定できるのは 1・5・10・15・30 分)
ScriptApp.newTrigger("frequentJob").timeBased().everyMinutes(15).create();

// 毎週月曜の9時台に実行
ScriptApp.newTrigger("weeklyJob")
  .timeBased()
  .onWeekDay(ScriptApp.WeekDay.MONDAY)
  .atHour(9)
  .create();

// 特定の日時に1回だけ実行(例: 2026-08-01 の10時台)
ScriptApp.newTrigger("onceJob")
  .timeBased()
  .at(new Date(2026, 7, 1, 10, 0)) // 月は0始まり(7 = 8月)
  .create();

everyMinutes()に指定できるのは 1・5・10・15・30 のいずれかだけです。それ以外の値を渡すとエラーになります。 またnew Date(2026, 7, 1)の月は0始まりのため、7が8月を表す点に注意してください。

イベントトリガー(onEdit・onFormSubmit)を作る

「セルを編集したとき」「フォームが送信されたとき」に動かすイベントトリガーは、forSpreadsheet(ss)で対象を指定してから作ります。

// スプレッドシートの編集時に onEditHandler を実行
function createEditTrigger() {
  const ss = SpreadsheetApp.getActive();
  ScriptApp.newTrigger("onEditHandler")
    .forSpreadsheet(ss)
    .onEdit()
    .create();
}

// フォーム送信時に onFormSubmitHandler を実行
function createFormSubmitTrigger() {
  const ss = SpreadsheetApp.getActive();
  ScriptApp.newTrigger("onFormSubmitHandler")
    .forSpreadsheet(ss)
    .onFormSubmit()
    .create();
}

function onEditHandler(e) {
  // e.range で編集されたセルが取れる
  Logger.log("編集セル: " + e.range.getA1Notation());
}

関数名をonEditにすると設定なしで動く「簡易トリガー」になりますが、簡易トリガーはGmail送信や別ファイルへのアクセスなど権限が制限されます。 ほかのサービスを触るなら、上のようにコードで「インストール型トリガー」を作る必要があります。

登録済みトリガーを一覧で確認する

getProjectTriggers()で、今登録されているトリガーの配列を取得できます。関数名・種類・IDをログに出せば、コード上で棚卸しができます。

function listTriggers() {
  const triggers = ScriptApp.getProjectTriggers();

  triggers.forEach((t) => {
    Logger.log(
      "関数: " + t.getHandlerFunction() +
      " / 種類: " + t.getEventType() +
      " / ID: " + t.getUniqueId()
    );
  });

  Logger.log("登録トリガー数: " + triggers.length + " / 20");
}

取得できるのは「そのスクリプトで、実行ユーザー自身が作ったトリガー」だけです。ほかの人が作ったトリガーは含まれません。

トリガーを削除する

削除はScriptApp.deleteTrigger(トリガー)で行います。一覧を回して、条件に合うトリガーだけを消すのが基本形です。

// 指定した関数のトリガーだけをすべて削除する
function deleteTriggersByFunction(functionName) {
  const triggers = ScriptApp.getProjectTriggers();
  let deleted = 0;

  triggers.forEach((t) => {
    if (t.getHandlerFunction() === functionName) {
      ScriptApp.deleteTrigger(t);
      deleted++;
    }
  });

  Logger.log(functionName + " のトリガーを " + deleted + " 個削除しました");
}

// すべてのトリガーを削除したいとき
function deleteAllTriggers() {
  ScriptApp.getProjectTriggers().forEach((t) => ScriptApp.deleteTrigger(t));
}

関数名で絞って削除するdeleteTriggersByFunctionは、次のセクションの作り直しパターンでそのまま使い回します。

重複作成を防ぐ「リセット→作成」パターン

コードでトリガーを作るとき、一番やりがちな失敗が二重登録です。セットアップ関数を2回実行すると、 同じトリガーが2個できて処理も2回走ります。これを防ぐには、作成前に同じ関数のトリガーをすべて削除してから作り直します。

// 「同じ関数のトリガーを消してから作る」ので何度実行しても1個に保たれる
function resetDailyTrigger() {
  deleteTriggersByFunction("dailyJob"); // 先にリセット

  ScriptApp.newTrigger("dailyJob")
    .timeBased()
    .everyDays(1)
    .atHour(7)
    .create();

  Logger.log("dailyJob のトリガーを作り直しました");
}

この形にしておけば、resetDailyTriggerを何度実行してもトリガーは常に1個に保たれます。トリガーをコードで管理するときは、この「消してから作る」を基本形にすると安全です。

実務での注意点

1. トリガーは1スクリプト20個まで

1つのスクリプトにつき、1ユーザーあたり20個が上限です。上限を超えるとcreate()がエラーになります。処理ごとにトリガーを増やすのではなく、1つの関数の中で分岐させて個数を節約しましょう。

2. 短い間隔のトリガーは実行回数の割り当てに注意

1分おきなどの高頻度トリガーは、GASの1日あたりのトリガー実行時間の割り当てを消費します。 無料アカウントでは合計90分/日が目安のため、本当に必要な間隔だけに絞るのが安全です。

3. 存在しない関数名を指定しても作成時はエラーにならない

newTrigger("関数名")の関数名はタイプミスがあっても作成時は通り、実行時に静かに失敗します。トリガーが動かないときは、まず関数名の綴りを確認してください。

4. トリガー実行時は権限の再承認が必要になることがある

GmailやDriveなど新しいサービスを使うコードに変えたときは、一度手動で実行して権限を承認しておかないと、 トリガー実行が承認待ちで止まります。セットアップ後に1回手動実行しておくと確実です。

まとめ

GASのトリガーはScriptApp.newTriggerでコード化でき、getProjectTriggersで一覧、deleteTriggerで削除まで完結します。二重登録は「消してから作る」パターンで防ぎ、20個の上限を意識して個数を管理すれば、 配布・複製に強い自動化を組めます。手動設定に頼らず、トリガーもコードの一部として扱うのがおすすめです。

よくある質問

トリガー(決まった条件で関数を自動実行する仕組み)を画面から手動設定すると、スクリプトを配布・複製したときに設定が引き継がれません。ScriptApp.newTriggerでコードにしておけば、セットアップ関数を1回実行するだけで誰の環境でも同じトリガーを再現でき、削除や作り直しもコードで管理できます。

関数名を onEdit や onOpen にすると「簡易トリガー」として自動で動きますが、簡易トリガーは他ファイルへのアクセスやメール送信などの権限が制限されます。GmailやほかのスプレッドシートにアクセスするならforSpreadsheet().onEdit().create()でインストール型トリガーを作る必要があります。

セットアップ関数を実行するたびに新しいトリガーが追加されるためです。作成前にgetProjectTriggers()で同じ関数のトリガーをすべて削除してから作り直す「リセット→作成」パターンにすると、常に1個だけに保てます。記事内のresetDailyTriggerが実装例です。

1つのスクリプトあたり、1ユーザーにつき20個までが上限です。上限に達するとcreate()がエラーになります。不要になったトリガーはdeleteTriggerで削除し、1つの関数で複数の処理を分岐させるなどして個数を節約するのが実務的です。

できます。ScriptApp.getProjectTriggers()で現在登録されているトリガーの配列が取れます。各トリガーからgetHandlerFunction()で実行される関数名、getEventType()で種類、getUniqueId()で識別IDを取得できるので、Logger.logで一覧を出力して棚卸しできます。

GAS開発・業務Webシステムを
相談する。

定期実行・フォーム連携・Gmail自動化など、トリガーを軸にした業務自動化のGAS開発をご相談いただけます。

GAS開発の対応範囲を見る