Google Apps Scriptで定期実行する方法。時間主導トリガーの基本と実務向けサンプル
Google Apps Scriptで定期実行したいなら、使うのは時間主導トリガー(time-driven trigger)です。手動実行していた処理を「毎朝9時」「1時間ごと」「毎週月曜」のように自動化できます。
請求書の集計、定例レポートの更新、フォーム回答の後処理、ログ保存のような作業を、ブラウザを開かずに回したい場面で役立ちます。最初に押さえるべき点は3つです。単純トリガーではなくインストール型トリガーを使うこと、実行時刻はプロジェクトのタイムゾーンに影響されること、作成者の権限で動くことです。
- できること: 毎分、毎時、毎日、毎週、毎月の自動実行
- 向いている場面: 定例処理、ログ記録、通知、データ整形、バックアップ
- 先に知るべき注意点: 実行時刻は多少ずれることがあり、厳密な秒単位実行には向かない
ここがポイント: GASの定期実行は、関数を書いたあとに「トリガー」を設定して初めて動きます。
onOpen()のような関数名だけでは、定時実行にはなりません。
まず理解したい前提
この方法は、ブラウザ版のGoogle Apps Scriptエディタで使えます。2026年4月時点で確認しやすい公式情報として、GoogleのApps Scriptドキュメントでは時間主導トリガーをインストール可能トリガーの一種として案内しています。
実務で混同しやすいのは、次の違いです。
- 単純トリガー:
onOpen(e)やonEdit(e)のように予約済み関数名で動く - インストール可能トリガー: 画面またはコードで作成して使う
- 定期実行に使うのは後者: 時間主導トリガーはインストール可能トリガーとして設定する
さらに、時間主導トリガーには次の性質があります。
- トリガーは作成したGoogleアカウントの権限で実行される
- プロジェクトのタイムゾーン設定に従って時刻が解釈される
- 毎日9時指定でも、9:00ちょうど固定ではなく少し幅を持って実行されることがある
- トリガー数や総実行時間には上限がある
手動で定期実行を設定する手順
まずは画面から設定する方法が一番わかりやすいです。
設定の流れ
- Apps Scriptプロジェクトを開く
- 左側の「トリガー」を開く
- 「トリガーを追加」を押す
- 実行する関数を選ぶ
- イベントのソースで「時間主導型」を選ぶ
- 実行間隔を「日付ベースのタイマー」「時間ベースのタイマー」などから選ぶ
- 保存して権限を許可する
どんな単位で動かせるか
代表的なのは次の設定です。
- 毎分または数分ごと
- 1時間ごと
- 毎日特定の時間帯
- 毎週特定の曜日
- 毎月特定の日
「毎朝9時ぴったり」と考えがちですが、公式ドキュメントでは、たとえば9時指定なら9時から10時の間で選ばれた時刻に継続して実行される仕組みが案内されています。時刻の厳密さより、定期バッチ向けの設計だと考えるとズレにくいです。
コードでトリガーを作る基本形
画面設定でも十分ですが、実務ではコードで作ると再設定しやすくなります。特に、同じプロジェクトを複数人で扱うときや、トリガーの二重登録を防ぎたいときに便利です。
毎朝9時台に実行するサンプル
以下は、毎日9時台に1回動くトリガーを作り、実行ログをスプレッドシートに追記する最小構成です。
const SHEET_ID = 'YOUR_SPREADSHEET_ID';
const SHEET_NAME = 'log';
const HANDLER_NAME = 'runDailyJob';
function setupDailyTrigger() {
const triggers = ScriptApp.getProjectTriggers();
for (const trigger of triggers) {
if (trigger.getHandlerFunction() === HANDLER_NAME) {
ScriptApp.deleteTrigger(trigger);
}
}
ScriptApp.newTrigger(HANDLER_NAME)
.timeBased()
.atHour(9)
.nearMinute(0)
.everyDays(1)
.create();
}
function runDailyJob(e) {
const sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName(SHEET_NAME);
const now = new Date();
const timezone = Session.getScriptTimeZone();
const triggerUid = e && e.triggerUid ? e.triggerUid : '';
sheet.appendRow([
Utilities.formatDate(now, timezone, 'yyyy-MM-dd HH:mm:ss'),
'定期実行OK',
timezone,
triggerUid,
]);
}
このコードでできること
setupDailyTrigger()を1回実行すると、毎日実行用トリガーを作る- 既存の同名トリガーを消してから作るので、二重登録を防げる
runDailyJob()は実行日時と結果をシートに残すe.triggerUidを残しておくと、複数トリガー運用時の切り分けに使いやすい
入力例
SHEET_ID: ログを書き込むスプレッドシートのIDSHEET_NAME:log- 実行頻度: 毎日1回、9時台
出力例
2026-04-25 09:03:14 | 定期実行OK | Asia/Tokyo | 4034124084959907503
実務では、この runDailyJob() の中身を入れ替えるだけで用途を変えられます。たとえば、CSVを整形する、Drive上のファイルを確認する、メール本文を組み立てる、といった処理に差し替えられます。
よくある使いどころ
定期実行は「毎回人が押している作業」を外すときに効果が出ます。
1. 毎朝のレポート更新
- 前日の売上を集計する
- シートの集計タブを更新する
- 結果を別シートへ保存する
朝会前に見たい数字があるなら、時間主導トリガーと相性がいい場面です。
2. 定期的な監視と通知
- 指定URLの応答を確認する
- Driveフォルダ内のファイル数を記録する
- 特定条件に一致したらメール送信する
手動確認をやめるだけで、見落としがかなり減ります。
3. フォームやシートの後処理
- 回答データの整形
- 不要行の削除
- 定期バックアップ
編集イベントだけに頼ると処理漏れが出ることがあります。1日1回の保守処理を入れると安定しやすいです。
つまずきやすい点
ここは初心者が止まりやすいところです。先に知っておくと、原因の切り分けが速くなります。
権限を許可していない
トリガー作成時や初回実行時に認可が必要です。GmailApp、DriveApp、SpreadsheetApp のようなサービスを使う場合、許可が通っていないと動きません。
タイムゾーンがずれている
Apps Scriptプロジェクトのタイムゾーンと、連携先のスプレッドシートのタイムゾーンが違うと、表示時刻が食い違います。特に日付またぎの処理では影響が大きいです。
9時ぴったりに動かない
これは不具合とは限りません。公式リファレンスでは nearMinute() を使っても±15分程度の幅がある仕様です。厳密な分単位制御が必要なら、Apps Script単体ではなく別の実行基盤も検討したほうが安全です。
トリガーを増やしすぎる
Apps Scriptの公式クォータでは、トリガー数は1ユーザーあたり1スクリプト20件までです。さらに、実行時間にも上限があり、1回のスクリプト実行は通常6分まで、トリガー経由の総実行時間にも日次制限があります。
エラーに気づけていない
インストール可能トリガーが失敗すると、Apps Scriptは失敗通知メールを送る仕組みがあります。放置すると「設定したのに動いていない」状態が続くので、通知メールは一度確認したほうがいいです。
NG例と改善例
NG例: 同じトリガーを何度も追加する
function setupTriggerBad() {
ScriptApp.newTrigger('runDailyJob')
.timeBased()
.everyDays(1)
.atHour(9)
.create();
}
この書き方だと、setupTriggerBad() を実行するたびにトリガーが増えます。結果として、同じ処理が1日に何回も走ることがあります。
改善例: 既存トリガーを消してから作る
function setupTriggerGood() {
for (const trigger of ScriptApp.getProjectTriggers()) {
if (trigger.getHandlerFunction() === 'runDailyJob') {
ScriptApp.deleteTrigger(trigger);
}
}
ScriptApp.newTrigger('runDailyJob')
.timeBased()
.atHour(9)
.nearMinute(0)
.everyDays(1)
.create();
}
定期実行では、重複登録を防ぐ処理を最初から入れておくのが実務向きです。
代替手段との使い分け
GASの定期実行は便利ですが、何でも向いているわけではありません。
GASが向くケース
- Google Workspaceと一緒に使う
- 小から中規模の定例処理
- 数分以内で終わる自動化
- ノーサーバーで始めたい
別手段を考えたいケース
- 秒単位で正確に実行したい
- 長時間バッチを回したい
- 同時実行や大量データ処理が多い
- 外部システム中心でGoogle連携が薄い
その場合は、Cloud Run、Cloud Functions、GitHub Actions、社内サーバーのcronなどのほうが運用しやすいことがあります。
実務で最初にやるべきチェック
最後に、設定直後の確認ポイントを短くまとめます。
- 関数を手動実行して、まず処理本体が成功するか確認する
- プロジェクトのタイムゾーンを確認する
- トリガー一覧で、同じ関数の重複登録がないか確認する
- 実行結果をシートやログへ残し、成功可否を見える化する
- 6分制限や日次実行時間上限に引っかからないか確認する
Google Apps Scriptで定期実行する方法は、難しい構文よりもトリガーの仕組みを正しく理解することが重要です。まずはログを書き出すだけの小さな関数で動作確認し、そこから集計や通知へ広げると失敗しにくくなります。次に見るべきポイントは、あなたの処理が「毎日1回でよいのか」「時刻のズレを許容できるのか」「誰の権限で動かすべきか」の3点です。
