GAS(Google Apps Script)のトリガーとは、「ファイルを開いた」「決まった時刻になった」といったきっかけで、関数を自動で実行する仕組みです。 決まった名前の関数を書くだけで動くシンプルトリガーと、画面またはコードで登録するインストール型トリガーの2種類があり、毎日決まった時刻に動かす時間主導型はインストール型に含まれます。

この記事は時間主導型とトリガーの管理に絞り、毎日動かすための2通りのコード(作成・重複防止・削除つき)、種類の一覧、2種類の違いと選び方、公式の割り当て(数や実行時間の上限)をまとめます。

確認環境(確認日 2026-10-06):メソッド名・引数・説明・割り当ての数値は Google 公式の Apps Script ドキュメントで確認し、型定義パッケージ @types/google-apps-script 2.0.13 とも照らし合わせました。コードの構文と、重複防止・次回日時の計算の動きは、ScriptApp を置き換えた簡易スタブを使い Node.js 22.22(タイムゾーン Asia/Tokyo)で実行しています。

この記事の結論

やりたいこと 書き方 実行される時刻
毎日おおよその時刻に動かす timeBased().atHour(9).everyDays(1) 9時台のどこか(毎日同じ時刻)
分まで指定して毎日動かす timeBased().at(日時) を実行のたびに翌日分として作り直す at に渡した日時
同じトリガーが増えないようにする 作る前に getProjectTriggers() で同じ関数のものを deleteTrigger() で消す ―
  • 権限が要る処理や時刻での実行はインストール型、ファイルを開いたときのメニュー追加のような軽い処理はシンプルトリガーが向いています。
  • トリガーは 1ユーザー・1スクリプトあたり20個まで、トリガーによる実行時間の合計は 1日90分(Google Workspace は6時間)までです。

GASトリガーの種類一覧

分類 きっかけ 書き方 使える場所
シンプル ファイルを開いた function onOpen(e) スプレッドシート・ドキュメント・スライド・フォーム
シンプル セルの値を変えた function onEdit(e) スプレッドシート
シンプル 選択範囲を変えた function onSelectionChange(e) スプレッドシート
シンプル アドオンをインストールした function onInstall(e) エディタ アドオン
シンプル ウェブアプリに GET が届いた function doGet(e) ウェブアプリ
シンプル ウェブアプリに POST が届いた function doPost(e) ウェブアプリ
インストール型 時間主導(時刻・間隔) newTrigger(関数名).timeBased()…create() すべてのスクリプト
インストール型 スプレッドシートを開いた・編集した・変更した・フォームが送信された newTrigger(関数名).forSpreadsheet(ss).onOpen() / onEdit() / onChange() / onFormSubmit() スプレッドシート
インストール型 フォームを開いた・送信された newTrigger(関数名).forForm(form).onOpen() / onFormSubmit() フォーム
インストール型 ドキュメントを開いた newTrigger(関数名).forDocument(doc).onOpen() ドキュメント
インストール型 カレンダーの予定が更新された newTrigger(関数名).forUserCalendar(メールアドレス).onEventUpdated() カレンダー

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「GASトリガーの設定方法と種類一覧|毎日決まった時刻に動かす」

画面からトリガーを設定する手順

公式ガイドの手順は次の5つです。

  1. Apps Script のプロジェクトを開く。
  2. 左側の「トリガー」(時計のアイコン)をクリックする。
  3. 右下の「トリガーを追加」をクリックする。
  4. 作りたいトリガーの種類を選んで設定する。
  5. 「保存」をクリックする。
決め方 向いている場面
画面から設定する 自分だけが使う。設定を1回すれば変えない
コードから作る 配布先の人にも同じ設定をしてもらう。分まで指定したい。設定内容をコードとして残したい

毎日おおよその時刻に動かす(atHour と everyDays)

毎日9時台に動けば足りる処理は、この形がいちばん短く書けます。 setDailyTrigger を手動で1回実行すると登録されます。

function setDailyTrigger() {
  deleteTriggersOf('dailyJob');
  ScriptApp.newTrigger('dailyJob')
    .timeBased()
    .atHour(9)
    .everyDays(1)
    .inTimezone('Asia/Tokyo')
    .create();
}

function dailyJob() {
  console.log('毎日の処理を実行');
}

// 指定した関数のトリガーをすべて削除する
function deleteTriggersOf(functionName) {
  ScriptApp.getProjectTriggers()
    .filter(t => t.getHandlerFunction() === functionName)
    .forEach(t => ScriptApp.deleteTrigger(t));
}

押さえておきたい点は3つです。

  • 最後の create() を呼ぶまで登録されません。
  • atHour(9) は「9時ちょうど」ではありません。公式ガイドは、時刻は少しずらされることがあり、たとえば毎日9時のトリガーなら9時から10時の間の時刻が選ばれ、その後は毎日同じ時刻に実行されると説明しています。
  • 先に deleteTriggersOf を呼んでいるので、setDailyTrigger を何度実行してもトリガーは1つのままです。

スタブで setDailyTrigger を3回続けて実行した後の登録内容は、次のとおり1件でした。

setDailyTrigger を3回実行 → [ 'dailyJob: atHour(9).everyDays(1).inTimezone("Asia/Tokyo")' ]

分まで指定して毎日動かす(at で翌日分を作り直す)

「毎日8時30分」のように分まで指定したいときは、日時を1つ指定する at(date) を使い、実行のたびに次回分を作り直します。 at で作るトリガーは1回分なので、処理の最後に次の日時で作り直すことで毎日の実行になります。

const RUN_HOUR = 8;
const RUN_MINUTE = 30;

// 最初に1回だけ手動で実行する
function startExactJob() {
  scheduleExactJob();
}

function exactJob() {
  try {
    console.log('分まで指定した処理を実行');
  } finally {
    scheduleExactJob(); // 処理がエラーで止まっても次回分を作る
  }
}

function scheduleExactJob() {
  deleteTriggersOf('exactJob');
  ScriptApp.newTrigger('exactJob')
    .timeBased()
    .at(nextRunDate(new Date(), RUN_HOUR, RUN_MINUTE))
    .create();
}

// now より後で、いちばん近い「時:分」の日時を返す
function nextRunDate(now, hour, minute) {
  const next = new Date(now.getFullYear(), now.getMonth(), now.getDate(), hour, minute, 0);
  if (next.getTime() <= now.getTime()) {
    next.setDate(next.getDate() + 1);
  }
  return next;
}

(deleteTriggersOf は前の節のものを使います。)

このコードが守っていることは次の3つです。

工夫 理由
finally の中で次回分を作る 本体の処理が例外で止まっても、翌日のトリガーが残る
作る前に同じ関数のトリガーを消す 手動で実行し直しても、トリガーが増えていかない
次回日時を「今より後でいちばん近い時刻」で計算する 朝に登録すれば当日、指定時刻を過ぎていれば翌日になる

nextRunDate に 8時30分を指定したときの計算結果です。

2026-10-06 07:00 → 2026-10-06 08:30
2026-10-06 08:30 → 2026-10-07 08:30
2026-10-06 21:15 → 2026-10-07 08:30
2026-10-31 09:00 → 2026-11-01 08:30
2026-12-31 23:59 → 2027-01-01 08:30

月末や年末も setDate が繰り上げてくれます。スタブで startExactJob の後に exactJob を2回実行しても、exactJob のトリガーは1件のままでした。

2通りの選び方

条件 選ぶもの
1時間の幅の中で動けばよい atHour().everyDays(1)
開始時刻を分まで決めたい at(日時) を毎回作り直す
設定をできるだけ単純にしたい atHour().everyDays(1)
曜日や日付によって次回の時刻を変えたい at(日時)(次回日時を計算する関数を変える)

timeBased のメソッド早見表

ScriptApp.newTrigger(関数名).timeBased() の後に続けて書くメソッドです。説明は公式リファレンス(ClockTriggerBuilder)の記載に沿っています。

メソッド 意味 例 補足
everyMinutes(n) n 分ごと .everyMinutes(10) n は 1・5・10・15・30 のいずれか
everyHours(n) n 時間ごと .everyHours(6) ―
everyDays(n) n 日ごと .everyDays(1) ―
everyWeeks(n) n 週ごと .everyWeeks(1) ―
atHour(hour) 実行する「時」を指定 .atHour(9).everyDays(1) 頻度を指定するメソッドと組み合わせる
nearMinute(minute) 実行する「分」のおおよそを指定 .atHour(9).nearMinute(30).everyDays(1) 前後15分の幅がある。頻度を指定するメソッドと組み合わせる
onWeekDay(day) 曜日を指定 .onWeekDay(ScriptApp.WeekDay.MONDAY).atHour(9) ―
onMonthDay(day) 月の中の日を指定 .onMonthDay(1).atHour(9) ―
at(date) 実行する日時を Date で指定 .at(new Date(2026, 9, 7, 8, 30)) 1回分
atDate(year, month, day) 実行する日を指定 .atDate(2026, 10, 7) 既定では午前0時ごろ(前後15分)。month は 1〜12
after(durationMilliseconds) 今から指定ミリ秒より後に実行 .after(10 * 60 * 1000) 指定した長さより短くなることはない
inTimezone(timezone) 日時のタイムゾーンを指定 .inTimezone('Asia/Tokyo') ―
create() トリガーを作る .create() 最後に必ず呼ぶ

よく使う組み合わせをまとめます。

// 10分ごと
ScriptApp.newTrigger('job').timeBased().everyMinutes(10).create();

// 6時間ごと
ScriptApp.newTrigger('job').timeBased().everyHours(6).create();

// 毎週月曜の9時台
ScriptApp.newTrigger('job').timeBased().onWeekDay(ScriptApp.WeekDay.MONDAY).atHour(9).create();

// 毎月1日の9時台
ScriptApp.newTrigger('job').timeBased().onMonthDay(1).atHour(9).create();

// 10分後より後に1回
ScriptApp.newTrigger('job').timeBased().after(10 * 60 * 1000).create();

new Date(2026, 9, 7, 8, 30) の月は0から数えるので 9 が10月、atDate(2026, 10, 7) の月は1から数えるので 10 が10月です。同じ「月」でも数え方が違う点に気をつけます。

シンプルトリガーとインストール型トリガーの違い

観点 シンプルトリガー インストール型トリガー
作り方 onOpen など決まった名前の関数を書く 画面の「トリガー」か ScriptApp.newTrigger で登録する
権限 承認が必要なサービスは使えない 承認が必要なサービスを呼び出せる
実行ユーザー ファイルを操作した人の操作をきっかけに動く トリガーを作った人のアカウントで動く
使えるサービス 紐づいているファイルは変更できるが、ほかのファイルにはアクセスできない メール送信やほかのファイルの操作など、承認したサービスを使える
実行時間 30秒まで 1回の実行は6分まで(スクリプトの実行時間の上限)
スクリプトの置き場所 スプレッドシートなどに紐づいたスクリプト、またはアドオン 単独のスクリプトでも使える
時刻での実行 できない 時間主導型で実行できる
コードからの管理 関数を消せば止まる 一覧・削除のメソッドで管理する

どちらにも共通する点として、閲覧専用(閲覧・コメントのみ)で開いたファイルでは動かず、スクリプトや API による変更はきっかけになりません。たとえばスクリプトがセルを書き換えても onEdit は動きません。

条件 選ぶもの
開いたときにメニューを足す、編集したセルの隣に日時を入れる シンプルトリガー
メールを送る、ほかのファイルを読む、外部の URL を呼ぶ インストール型トリガー
決まった時刻・間隔で動かす インストール型(時間主導型)
30秒を超える処理 インストール型トリガー
編集した人が誰であっても、決まった1人の権限で処理したい インストール型トリガー

インストール型は作った人のアカウントで動くため、誰が作ったトリガーなのかをチームで共有しておくと、担当が替わったときの引き継ぎがなめらかになります。公式ガイドには、あるアカウントからほかのアカウントのトリガーは見えないとも書かれています。

トリガーの一覧表示と削除

// このプロジェクトで自分が作ったトリガーを一覧表示する
function listTriggers() {
  ScriptApp.getProjectTriggers().forEach(t => {
    console.log(`${t.getHandlerFunction()} / ${t.getEventType()} / ${t.getUniqueId()}`);
  });
}

// すべて削除する
function deleteAllTriggers() {
  ScriptApp.getProjectTriggers().forEach(t => ScriptApp.deleteTrigger(t));
}
メソッド 戻り値 内容
ScriptApp.getProjectTriggers() Trigger の配列 現在のプロジェクトと現在のユーザーに関連づけられたインストール型トリガー
ScriptApp.deleteTrigger(trigger) なし 渡したトリガーを削除し、以後は実行されなくなる
trigger.getHandlerFunction() 文字列 実行される関数の名前
trigger.getEventType() EventType きっかけの種類(CLOCK、ON_OPEN、ON_EDIT、ON_FORM_SUBMIT、ON_CHANGE、ON_EVENT_UPDATED)
trigger.getTriggerSource() TriggerSource きっかけの発生元
trigger.getUniqueId() 文字列 トリガーを区別する ID

getProjectTriggers が返すのは「現在のユーザー」の分です。ほかの人が作ったトリガーは、その人自身が削除することになります。

トリガーの数と実行時間の割り当て一覧

Google 公式の Quotas ページに載っている、トリガーに関係する値です(2026-10-06 に確認)。

項目 無料の Google アカウント Google Workspace
トリガーによる実行時間の合計 90分/日 6時間/日
トリガーの数 20個/ユーザー/スクリプト 20個/ユーザー/スクリプト
スクリプトの実行時間 6分/1回の実行 6分/1回の実行
カスタム関数の実行時間 30秒/1回の実行 30秒/1回の実行
同時に実行できる数(ユーザーあたり) 30 30
同時に実行できる数(スクリプトあたり) 1,000 1,000

同じページには、割り当てはユーザーごとで、最初のリクエストから24時間後にリセットされるとあります。

間隔を決めるときは、1回の実行時間 × 1日の回数を合計の枠と見比べます。次の表は Python で計算した値で、「1日90分」の枠で1回あたりに使える時間の目安です。

間隔 1日の回数 1回あたりに使える時間(90分の枠)
1分ごと 1,440回 約3.75秒
5分ごと 288回 約18.75秒
10分ごと 144回 37.5秒
30分ごと 48回 約112秒
1時間ごと 24回 225秒
1日1回 1回 6分(1回の実行時間の上限が先に来る)
間隔  1日の回数   1回あたりに使える時間(90分の枠)
1分ごと    1440    3.75秒
5分ごと    288 18.75秒
10分ごと   144 37.5秒
30分ごと   48  112.5秒
1時間ごと   24  225秒

確かめて分かったこと

  • atHour(9) は9時ちょうどを意味しません。 公式ガイドの例では、9時から10時の間で時刻が選ばれ、その後は毎日同じ時刻になります。
  • nearMinute も前後15分の幅を持ちます。 公式リファレンスの説明は「指定した分の前後15分」で、分をぴったり合わせるメソッドではありません。
  • everyMinutes に渡せる値は 1・5・10・15・30 の5つと公式リファレンスに明記されています。3分ごとや20分ごとにしたいときは、近い間隔で動かして関数の中で実行するかどうかを判断します。
  • 1分ごとのトリガーは、1回あたり約3.75秒で90分の枠を使い切る計算になります。間隔を短くするほど、1回の処理を軽くする必要があります。
  • 重複防止の関数を入れておくと、登録用の関数を3回実行してもトリガーは1件のままでした(スタブで確認)。
  • Date の月は0始まり、atDate の月は1始まりです。

よくある質問

Q. GASのトリガーとは何ですか? A. 特定のきっかけで関数を自動実行する仕組みです。関数名で決まるシンプルトリガーと、登録して使うインストール型トリガーがあり、時刻で動かせるのはインストール型の時間主導型です。

Q. トリガーが指定した時刻ちょうどに動かないのはなぜですか? A. 時間主導型は実行時刻に幅を持つ仕様だからです。atHour は指定した1時間の中、nearMinute は前後15分の幅で動きます。開始時刻を分まで決めたいときは、at(日時) で1回分のトリガーを作り、実行のたびに次回分を作り直します。

Q. トリガーを削除できないときは何を確かめますか? A. そのトリガーを作ったアカウントで操作しているかを確かめます。getProjectTriggers が返すのは現在のユーザーのトリガーだけなので、ほかの人が作ったものは一覧に出てきません。作った人に削除を依頼します。

Q. onEditとインストール型の編集トリガーの違いは何ですか? A. 使える権限と実行時間が違います。シンプルトリガーの onEdit は承認が必要なサービスを使えず30秒までで、インストール型はトリガーを作った人の権限で動き、メール送信なども行えます。

まとめ

  • トリガーはシンプルトリガーとインストール型トリガーの2種類です。
  • 毎日おおよその時刻なら atHour().everyDays(1)、分まで指定するなら at(日時) を毎回作り直す形にします。
  • 作る前に同じ関数のトリガーを削除して、重複を防ぎます。
  • 権限が要る処理・時刻での実行・30秒を超える処理はインストール型を選びます。
  • インストール型は作った人のアカウントで動きます。
  • トリガーは1ユーザー・1スクリプトあたり20個、実行時間の合計は1日90分(Workspace は6時間)までです。
  • 間隔を決めるときは、1回の実行時間 × 1日の回数を枠と見比べます。

参考・出典

  • Google Apps Script「Simple Triggers」 https://developers.google.com/apps-script/guides/triggers
  • Google Apps Script「Installable Triggers」 https://developers.google.com/apps-script/guides/triggers/installable
  • Google Apps Script リファレンス「Class ClockTriggerBuilder」 https://developers.google.com/apps-script/reference/script/clock-trigger-builder
  • Google Apps Script リファレンス「Class ScriptApp」 https://developers.google.com/apps-script/reference/script/script-app
  • Google Apps Script「Quotas for Google Services」 https://developers.google.com/apps-script/guides/services/quotas

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「GASトリガーの設定方法と種類一覧|毎日決まった時刻に動かす」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?