# GASのトリガーの使い方｜毎日決まった時刻・編集時に自動で実行する

Google Apps Script (GAS) のトリガーで、スクリプトを毎朝決まった時刻や、スプレッドシートが編集されたときに自動で動かす方法を解説します。画面での設定手順、コードでトリガーを作る・消す方法、onEdit などのシンプルトリガーとの違い、時刻のずれや1日の上限まで公式ドキュメントで確かめました。

<Points>

- トリガーは、GAS の関数を「毎日 9 時台」「シートが編集されたとき」などのきっかけで自動で動かす仕組み
- 画面で作るなら Apps Script の [トリガー] > [トリガーを追加]、コードで作るなら `ScriptApp.newTrigger` を使う
- 時刻の指定は 1 時間の幅で、たとえば 9 時を選ぶと 9 時から 10 時の間のどこかで動く。分単位でぴったりには動かない

</Points>

## GASのトリガーとは

GAS で集計やメール送信のスクリプトを作っても、毎回 [実行] を押していては手間は半分しか減りません。トリガーを付けると、決めたきっかけで関数が自動で動くようになり、人が何もしなくても処理が回ります。

トリガーには、関数の名前を決まった形にするだけで動く「シンプルトリガー」と、画面やコードで設定する「インストール型トリガー」の 2 種類があります。

<Compare>
<Column title="シンプルトリガー">

- 関数名を `onOpen` や `onEdit` にするだけ
- Gmail など許可が要る機能は使えない
- 30 秒までしか動けない

</Column>
<Column title="インストール型トリガー" tone="accent">

- 画面かコードで設定する
- 時間主導型・フォーム送信時などが使える
- メール送信など許可が要る処理も動く

</Column>
</Compare>

[公式ガイド](https://developers.google.com/apps-script/guides/triggers)によると、シンプルトリガーは許可が必要なサービスを使えず、30 秒を超えて動けません。メールを送る・別のファイルを書き換えるといった処理には、インストール型トリガーを使います。

## インストール型トリガーの種類

<Figure title="インストール型トリガーで使えるきっかけ" source="Apps Script ガイド「Installable triggers」">

| 種類 | 動くとき | 使いどころの例 |
|---|---|---|
| 時間主導型 | 決めた時刻・間隔 (1 分ごとから月 1 回まで) | 毎朝の集計、毎週の報告メール |
| 起動時 | 編集できる人がファイルを開いたとき | メニューの追加、表示の初期化 |
| 編集時 | シートの値が変更されたとき | 更新日時の記録、通知 |
| 変更時 | シートの追加や列の削除など構造が変わったとき | 構造の変化の検知 |
| フォーム送信時 | フォームに回答が送られたとき | 自動返信、担当者への通知 |
| カレンダー | 予定が作成・変更・削除されたとき | 予定の一覧の更新 |

</Figure>

## 画面でトリガーを設定する手順

[公式ガイド](https://developers.google.com/apps-script/guides/triggers/installable)の手順です。毎朝 9 時台に `dailyReport` という関数を動かす例で説明します。

<Steps>
<Step title="トリガーの画面を開く">

Apps Script の画面の左側で [トリガー] (時計のアイコン) を押します。

</Step>
<Step title="トリガーを追加する">

右下の [トリガーを追加] を押します。

</Step>
<Step title="関数ときっかけを選ぶ">

実行する関数に `dailyReport`、イベントのソースに「時間主導型」、タイプに「日付ベースのタイマー」、時刻に「午前 9 時〜10 時」を選びます。

</Step>
<Step title="保存する">

[保存] を押します。初めてのときは、スクリプトがアクセスする範囲の許可を求められるので、自分のアカウントで許可します。

</Step>
</Steps>

## コードでトリガーを作る・消す

トリガーはコードからも作れます。設定を作り直すたびに画面を操作しなくて済み、どんな設定にしたかがコードに残るので、引き継ぎにも向いています。

```js
const HANDLER = "dailyReport";

function setupTrigger() {
  ScriptApp.getProjectTriggers()
    .filter((trigger) => trigger.getHandlerFunction() === HANDLER)
    .forEach((trigger) => ScriptApp.deleteTrigger(trigger));

  ScriptApp.newTrigger(HANDLER)
    .timeBased()
    .atHour(9)
    .everyDays(1)
    .inTimezone("Asia/Tokyo")
    .create();
}

function dailyReport() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("ログ");
  sheet.appendRow([new Date(), "毎朝の処理が動きました"]);
}
```

`setupTrigger` を 1 回だけ手で実行すると、毎日 9 時台に `dailyReport` が動くトリガーができます。最初に同じ関数のトリガーを消してから作っているので、何度実行してもトリガーが重複しません。`dailyReport` の中身は、自分の処理に書き換えてください。

### よく使う時間の指定

<Figure title="時間主導型トリガーの書き方" source="Apps Script リファレンス「ClockTriggerBuilder」">

| やりたいこと | 書き方 |
|---|---|
| 15 分ごと | `.timeBased().everyMinutes(15)` |
| 6 時間ごと | `.timeBased().everyHours(6)` |
| 毎日 7 時台 | `.timeBased().atHour(7).everyDays(1)` |
| 毎週月曜 | `.timeBased().onWeekDay(ScriptApp.WeekDay.MONDAY)` |
| 毎月 15 日 | `.timeBased().onMonthDay(15)` |
| 決めた日時に 1 回 | `.timeBased().at(new Date(2026, 11, 1, 9, 0))` |

</Figure>

[公式リファレンス](https://developers.google.com/apps-script/reference/script/clock-trigger-builder)によると、`everyMinutes` に指定できるのは 1・5・10・15・30 のどれかです。`nearMinute(45)` を付けると、動く分を 45 分の前後 15 分の幅に寄せられます。

## 編集されたときに動かす (onEdit)

シートが編集されたときに処理をするだけなら、シンプルトリガーの `onEdit` が手軽です。スプレッドシートに紐づいたスクリプトに次の関数を書くだけで、トリガーの設定は要りません。

```js
function onEdit(e) {
  const range = e.range;
  const sheet = range.getSheet();
  if (sheet.getName() !== "案件" || range.getColumn() !== 3) return;

  sheet.getRange(range.getRow(), 4).setValue(new Date());
}
```

この例では、「案件」シートの C 列 (状況) が書き換えられたら、同じ行の D 列に更新日時を入れます。`e.range` は編集されたセルの範囲です。

<Note tone="caution">

公式ガイドのとおり、スクリプトや API から値を書き換えても `onEdit` は動きません。手で編集したときだけ動きます。また、編集時にメールを送るなど許可が必要な処理をしたいときは、`onEdit` ではなく、画面かコードで「編集時」のインストール型トリガーを作ります。

</Note>

## 動かないとき・止まったときの確認点

<Figure title="トリガーで気にしたい上限" caption="2026年11月11日時点の公式ページの値です。" source="Apps Script「Quotas for Google Services」">

| 項目 | 個人のアカウント | Google Workspace |
|---|---|---|
| 1 つのスクリプトのトリガーの数 (1 人あたり) | 20 | 20 |
| トリガーの合計実行時間 (1 日) | 90 分 | 6 時間 |
| 1 回の実行時間 | 6 分 | 6 分 |

</Figure>

- **時刻がずれる**: 公式ガイドによると、9 時の設定は 9 時から 10 時の間のどこかで動き、以後は毎日ほぼその時刻に動きます。ぴったりの時刻が必要な用途には向きません。
- **失敗したかを知りたい**: トリガーの処理が失敗すると、作った人に「Summary of failures for Apps Script」という件名のメールが届きます。Apps Script の画面の左側の [実行数] で、失敗の内容を確かめられます。
- **人が変わったら動かない**: インストール型トリガーは、作った人のアカウントで動きます。作った人が退職してアカウントが止まると動かなくなるため、業務では共用のアカウントで作っておきます。
- **ほかの人のトリガーが見えない**: 別のアカウントが作ったトリガーは自分の画面には出ませんが、動いてはいます。同じ処理が二重に動いていないか、作った人に確かめます。

公式の[割り当ての一覧](https://developers.google.com/apps-script/guides/services/quotas)のとおり、個人のアカウントでは 1 日のトリガーの実行時間が合計 90 分までです。15 分ごとに数分かかる処理を回すと、すぐに上限に届くので、間隔は必要な分だけにします。

## 自分で作るのが難しいときは

トリガーを付ければ、毎朝の集計や通知を人の手から離せます。ただ、処理が増えると「どのトリガーが何を動かしているか誰もわからない」「作った人の異動で止まっていたのに気づかなかった」といったことが起きやすくなります。

止まったときに通知する仕組みや、複数の処理をまとめて管理する形まで含めて作り直したい場合は、シートナビの[相談フォーム](/contact/)からお気軽にご相談ください。

## よくある質問

### Q. トリガーを止めたいときはどうすればよいですか？

Apps Script の画面の [トリガー] で、止めたいトリガーの右側のメニューから削除します。公式ガイドによると、`onOpen` などのシンプルトリガーはこの画面に出ないので、止めたいときは関数を消すか名前を変えます。

### Q. フォームに回答が来たらすぐにメールを送れますか？

できます。インストール型の「フォーム送信時」トリガーを付けると、回答が送られたときに関数が動きます。メールの送り方は [GASでGmailを自動送信する方法](/gas-send-gmail/) で説明しています。

### Q. 1 分ごとに動かしても問題ありませんか？

`everyMinutes(1)` で設定はできますが、1 日のトリガーの合計実行時間の上限 (個人のアカウントで 90 分) に届きやすくなります。新しい行があるかを確かめるだけの処理でも、5 分や 15 分ごとで足りないかを先に考えてください。
