はじめに
GASでコードを書いたのに動かない——その原因の多くはトリガーの設定ミスです。
GASは「コードを書いただけ」では自動実行されません。「いつ実行するか」を指定するトリガーの設定が必須です。この記事では、GASのトリガーの種類と使い分け、そしてつまずきやすいポイントを整理して解説します。
トリガーとは
トリガーは「この条件になったらこの関数を実行する」という予約設定です。
例)毎朝9時になったら → sendDailyReport() を実行
フォームが送信されたら → onFormSubmit() を実行
シートが編集されたら → onEdit() を実行
トリガーの種類
GASのトリガーは大きく2種類あります。
| 種類 | 説明 | 主な用途 |
|---|---|---|
| 時間主導型 | 決まった時刻・間隔で実行 | 定期レポート、定時通知、バッチ処理 |
| イベント駆動型 | 何かが起きたときに実行 | フォーム送信、シート編集、ファイル起動 |
① 時間主導型トリガー(定期実行)
「毎日9時」「1時間ごと」など、時間で自動実行します。
設定手順
- Apps Scriptエディタの左メニュー「トリガー(時計アイコン)」
- 右下「+トリガーを追加」
- 以下のように設定
| 項目 | 設定値 |
|---|---|
| 実行する関数 | 実行したい関数名 |
| イベントのソース | 時間主導型 |
| 時間ベースのトリガーのタイプ | 日付ベース / 時間ベース / 分ベース など |
| 時刻 | 実行したい時間帯 |
実行間隔の選択肢
分ベース:1分/5分/10分/15分/30分おき
時間ベース:1時間/2時間/4時間/6時間/8時間/12時間おき
日付ベース:毎日、指定した時間帯
週ベース:毎週◯曜日
月ベース:毎月◯日
注意: 時刻は「9時ちょうど」ではなく「午前9〜10時の間」のように幅で指定されます。GASは負荷分散のため、指定時間帯の中で実行タイミングが変動します。分単位の正確さが必要な処理には向きません。
コード例:毎朝レポートを送る
/**
* 毎朝、前日の売上サマリーをメールで送信する
* ※ 時間主導型トリガー(日付ベース・午前8〜9時)で設定
*/
function sendDailyReport() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('売上');
const data = sheet.getDataRange().getValues();
// 昨日の日付
const yesterday = new Date();
yesterday.setDate(yesterday.getDate() - 1);
const target = Utilities.formatDate(yesterday, 'Asia/Tokyo', 'yyyy/MM/dd');
// 昨日分を集計
let total = 0;
let count = 0;
for (let i = 1; i < data.length; i++) {
const date = Utilities.formatDate(new Date(data[i][0]), 'Asia/Tokyo', 'yyyy/MM/dd');
if (date === target) {
total += Number(data[i][2]);
count++;
}
}
MailApp.sendEmail({
to: 'your@email.com',
subject: `【売上速報】${target}`,
body: `${target} の売上\n\n件数: ${count}件\n合計: ${total.toLocaleString()}円`,
});
}
② フォーム送信トリガー
Googleフォームに回答があったときに実行します。
設定手順
| 項目 | 設定値 |
|---|---|
| 実行する関数 |
onFormSubmit など |
| イベントのソース | スプレッドシートから または フォームから |
| イベントの種類 | フォーム送信時 |
「スプレッドシートから」と「フォームから」の違い
これが最もつまずくポイントです。受け取れるデータの形が違います。
// ── フォーム本体のスクリプトの場合 ──
function onFormSubmit(e) {
// e.response でフォームの回答オブジェクトを取得
const items = e.response.getItemResponses();
items.forEach(item => {
console.log(item.getItem().getTitle() + ': ' + item.getResponse());
});
}
// ── スプレッドシートのスクリプトの場合 ──
function onFormSubmit(e) {
// e.namedValues で「質問: 回答」の連想配列を取得(こちらが扱いやすい)
const responses = e.namedValues;
for (const [question, answers] of Object.entries(responses)) {
console.log(`${question}: ${answers.join(', ')}`);
}
// e.values で回答を配列で取得
console.log(e.values);
}
**おすすめは「スプレッドシートから」**です。e.namedValues が使えて処理が書きやすく、回答も自動的にシートに蓄積されます。
③ 編集時トリガー(onEdit)
スプレッドシートのセルが編集されたときに実行します。
/**
* セルが編集されたときに実行される
* ※ 「値の変更時」トリガーで設定
*/
function onEdit(e) {
const sheet = e.source.getActiveSheet();
const range = e.range;
// B列が編集されたときだけ処理する
if (range.getColumn() !== 2) return;
// 編集された行のA列に更新日時を自動入力
sheet.getRange(range.getRow(), 1).setValue(new Date());
}
シンプルトリガーとインストーラブルトリガー
onEdit という名前の関数は、トリガーを設定しなくても自動で動きます(シンプルトリガー)。ただし制限があります。
| シンプルトリガー | インストーラブルトリガー | |
|---|---|---|
| 設定 | 不要(関数名で自動認識) | 手動で設定が必要 |
| メール送信 | ❌ できない | ✅ できる |
| 他ファイルへのアクセス | ❌ 制限あり | ✅ できる |
| 実行時間上限 | 30秒 | 6分 |
メール送信や外部APIを呼びたい場合は、必ずトリガー画面から手動設定してください。(関数名は onEdit 以外にすると混乱しません)
④ その他のトリガー
| トリガー | タイミング | 用途例 |
|---|---|---|
| 起動時(onOpen) | ファイルを開いたとき | カスタムメニューの追加 |
| 変更時(onChange) | 行・列の追加削除、シート追加など | 構造変更の検知 |
| カレンダー更新時 | 予定が変更されたとき | スケジュール連携 |
つまずきやすいポイント
① トリガーを設定したのに動かない
- 関数名が一致しているか確認(大文字小文字も区別されます)
- 権限の承認が完了しているか確認(初回は手動実行して承認する必要あり)
- 実行ログを確認:左メニュー「実行数」でエラー内容が見られます
② 「承認が必要です」から進めない
初回設定時、「このアプリはGoogleで確認されていません」という警告が出ます。自作スクリプトなら「詳細」→「(プロジェクト名)に移動」で進めて問題ありません。
③ 実行時間の上限に注意
GASは1回の実行が6分(無料アカウント)を超えるとタイムアウトします。大量データを処理する場合は、
// 処理を分割して、続きは次回のトリガーで処理する
const props = PropertiesService.getScriptProperties();
let startRow = Number(props.getProperty('lastRow') || 1);
// ... 処理 ...
props.setProperty('lastRow', String(endRow)); // 進捗を保存
のように進捗を保存して分割実行する設計が必要です。
④ トリガーの数にも上限がある
1つのスクリプトに設定できるトリガーは20個までです。不要になったトリガーは削除しましょう。
まとめ
- GASはトリガーを設定しないと自動実行されない
- 時間主導型:定期レポート、バッチ処理向け(実行時刻は幅で指定される)
-
フォーム送信時:「スプレッドシートから」がおすすめ(
e.namedValuesが使える) - 編集時:メール送信するならシンプルトリガーではなく手動設定が必要
- 動かないときは「実行数」画面でエラーログを確認する
トリガーの仕組みを理解すると、GASでできることの幅が一気に広がります。
GASを使った業務自動化のご相談
「定期処理を組みたい」「フォームや他システムと連携させたい」などのご相談を受け付けています。