- API
GASトリガーの設定方法と種類一覧|毎日決まった時刻に動かす
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つです。
- Apps Script のプロジェクトを開く。
- 左側の「トリガー」(時計のアイコン)をクリックする。
- 右下の「トリガーを追加」をクリックする。
- 作りたいトリガーの種類を選んで設定する。
- 「保存」をクリックする。
| 決め方 | 向いている場面 |
|---|---|
| 画面から設定する | 自分だけが使う。設定を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期連続の黒字決算。