0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GASのトリガー完全ガイド【定期実行・フォーム送信・編集時の使い分け】

0
Posted at

はじめに

GASでコードを書いたのに動かない——その原因の多くはトリガーの設定ミスです。

GASは「コードを書いただけ」では自動実行されません。「いつ実行するか」を指定するトリガーの設定が必須です。この記事では、GASのトリガーの種類と使い分け、そしてつまずきやすいポイントを整理して解説します。

トリガーとは

トリガーは「この条件になったらこの関数を実行する」という予約設定です。

例)毎朝9時になったら       → sendDailyReport() を実行
  フォームが送信されたら   → onFormSubmit() を実行
  シートが編集されたら     → onEdit() を実行

トリガーの種類

GASのトリガーは大きく2種類あります。

種類 説明 主な用途
時間主導型 決まった時刻・間隔で実行 定期レポート、定時通知、バッチ処理
イベント駆動型 何かが起きたときに実行 フォーム送信、シート編集、ファイル起動

① 時間主導型トリガー(定期実行)

「毎日9時」「1時間ごと」など、時間で自動実行します。

設定手順

  1. Apps Scriptエディタの左メニュー「トリガー(時計アイコン)」
  2. 右下「+トリガーを追加」
  3. 以下のように設定
項目 設定値
実行する関数 実行したい関数名
イベントのソース 時間主導型
時間ベースのトリガーのタイプ 日付ベース / 時間ベース / 分ベース など
時刻 実行したい時間帯

実行間隔の選択肢

分ベース: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を使った業務自動化のご相談

「定期処理を組みたい」「フォームや他システムと連携させたい」などのご相談を受け付けています。

🌐 https://datarou.com

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?