GASのトリガーでスプレッドシートの集計・通知を自動化する方法|時間指定・フォーム送信を起点に動かす

スポンサーリンク

「毎朝、出社したらまず昨日の売上を集計してメールで共有する」「フォームに回答が来ても、誰かが気づくまで放置されてしまう」——スプレッドシートで業務を回していると、こうした定型作業に時間を取られますよね。

この記事では、Google Apps Script(GAS)のトリガーを使って、スプレッドシートの集計やメール通知を「自分が何もしなくても自動で動く」状態にする方法を解説します。トリガーとは、決まった時刻やユーザーの操作を引き金に、指定した関数を自動実行する仕組みのことです。

GASの基本的な書き方や実行ボタンの押し方は、シリーズ1本目で丁寧に解説しています。GASに初めて触る方は、先にこちらを読むとつまずきにくいですよ。

GAS入門|コピペで動くスプレッドシート自動化レシピ5選

なお、この記事で紹介する「毎朝9時に自動集計」「フォーム回答で自動通知」は、Microsoft の Power Automate でやるような自動化を、Google Workspace の無料環境で実現するイメージです。Microsoft 365 を使えない環境でも、GASのトリガーがあれば同じことができます。

GASのトリガーとは?|手動実行から自動実行への第一歩

GASのトリガーとは、「ある条件(時刻や操作)をきっかけに、指定した関数を自動で実行する仕組み」です。

通常、スプレッドシートで書いたGASのコードは、スクリプトエディタの「実行」ボタンを押さないと動きません。これが手動実行です。便利な処理を書いても、自分でボタンを押し続けるなら手作業とあまり変わりませんよね。

ここでトリガーの出番です。「毎朝9時になったら」「フォームに回答が届いたら」といった条件を設定しておけば、その瞬間に関数が自動で走ります。パソコンを開いていなくても、Googleのサーバー上で勝手に実行してくれるのが大きな特徴です。

トリガーで自動実行される関数のことを、この記事ではハンドラ関数と呼びます。トリガーが発火したときに呼び出される関数、という意味です。

項目手動実行トリガーによる自動実行
実行のきっかけ自分で実行ボタンを押す時刻・操作などの条件
パソコンの状態開いている必要あり閉じていてもGoogleが実行
向いている用途テスト・単発の処理定期処理・イベント対応

トリガーを覚えると、GASの活用範囲が一気に広がります。「同じ作業を毎日繰り返している」と感じている方ほど、効果を実感しやすいですよ。

シンプルトリガーとインストーラブルトリガーの違い

GASのトリガーには、実は2つの系統があります。最初にここを押さえておくと、後で「なぜか動かない」を避けられます。

  • シンプルトリガー: 関数名を onOpenonEdit のような決まった名前にするだけで、設定なしに自動発火するトリガーです。手軽ですが、メール送信や外部サービスへのアクセスができないという強い制約があります。
  • インストーラブルトリガー: スクリプトエディタの専用画面から設定するトリガーです。権限の承認を経るため、メール送信や定期実行など、制約のある操作も実行できます。

この記事で扱う「自動メール送信」「毎朝の定期実行」は、いずれもインストーラブルトリガーが必須です。シンプルトリガーの onEdit の中にメール送信を書いても動かないので、ここは混同しないようにしましょう。以降、この記事で単に「トリガー」と書く場合は、インストーラブルトリガーを指します。

GASのトリガーの種類と使い分け|時間主導型とイベント型

インストーラブルトリガーは、大きく時間主導型イベント型の2タイプに分かれます。どちらを選ぶかは、「いつ動かしたいか」で決まります。

やりたいこと選ぶトリガー具体例
決まった時刻・間隔で動かしたい時間主導型毎朝9時に集計、1時間おきに同期
何かが起きたら動かしたいイベント型フォーム回答時、セル編集時

判断はシンプルです。「スケジュールで動かす」なら時間主導型、「きっかけに反応して動かす」ならイベント型と覚えておきましょう。

時間主導型トリガーで指定できる間隔

時間主導型トリガーは、設定画面でかなり細かく実行タイミングを選べます。主な選択肢は次の通りです。

  • 特定の日時(一度だけ実行)
  • 分ベース(1分・5分・10分・15分・30分おき)
  • 時間ベース(1〜12時間おき)
  • 日ベース(毎日。実行する時間帯を選択)
  • 週ベース(曜日 + 時間帯)
  • 月ベース(日にち + 時間帯)

ここで1つ大事な仕様があります。時間帯はあくまで「その1時間の枠のどこか」で実行されるという点です。たとえば「午前9時〜10時」を選んでも、きっちり9時00分に動くとは限りません。9時5分や9時40分など、枠内のどこかで実行されます。「1分の誤差も許されない」という用途には向かないので、覚えておくと安心ですよ。

イベント型トリガーで反応できる操作

スプレッドシートやフォームに紐づくイベント型トリガーでは、次のような操作をきっかけにできます。

  • 起動時(スプレッドシートを開いたとき)
  • 編集時(セルの値が変わったとき)
  • 変更時(行・列の追加など構造が変わったとき)
  • フォーム送信時(リンクされたフォームに回答が届いたとき)

この記事では、最も実務ニーズが高い「時間主導型(毎朝の集計)」と「フォーム送信時(回答通知)」の2つを、完成コード付きで実装していきます。

GASのトリガーを設定する手順|スクリプトエディタからの操作

実際のコードに入る前に、トリガーをどこで設定するのかを押さえておきましょう。トリガーの設定画面は、コードを書く画面とは別の場所にあります。

スプレッドシートのメニューから 拡張機能Apps Script でスクリプトエディタを開いたら、次の手順で進みます。

  1. エディタの左側メニューにある時計のアイコン(トリガー)をクリック
  2. 画面右下の「トリガーを追加」ボタンをクリック
  3. 設定ダイアログで、実行する関数・イベントの種類などを選ぶ
  4. 「保存」をクリック
  5. 初回のみ権限の承認画面が表示されるので、自分のGoogleアカウントで承認する

設定ダイアログでは、主に次の項目を選びます。

設定項目選ぶ内容
実行する関数を選択自動実行したいハンドラ関数の名前
実行するデプロイを選択Head(基本はこのまま)
イベントのソースを選択時間主導型 または スプレッドシートから
イベントの種類を選択ソースに応じて表示される選択肢

承認画面で「このアプリはGoogleで確認されていません」という警告が出ますが、自作スクリプトでは正常な挙動です。「詳細」→「(プロジェクト名)に移動(安全ではないページ)」をクリックして、利用する権限を確認のうえ許可してください。権限承認の詳しい流れは入門記事でも解説しています。

GAS入門|コピペで動くスプレッドシート自動化レシピ5選

それでは、具体的なシナリオを2つ作っていきましょう。

【シナリオA】毎朝9時に前日の売上を集計してGmailに自動送信

最初のシナリオは、毎朝9時に前日分の売上を集計し、その結果をGmailで送るという時間主導型トリガーの実装です。朝イチの「昨日いくら売れた?」を、出社前に自動で用意しておくイメージです。

前提となるスプレッドシートの形

ここでは、次のような売上記録シート(シート名「売上」)を想定します。A列に日付、B列に商品名、C列に金額が入っている形です。

日付商品名金額
2026/05/26商品A12000
2026/05/26商品B8000
2026/05/27商品A5000

1行目はヘッダー、2行目以降が明細です。この中から「前日の日付」に一致する行だけを集めて、合計を出します。

コピペで動くサンプルコード

スクリプトエディタに以下を貼り付けて、'your-address@example.com' を自分の通知先メールアドレスに、'売上' を実際のシート名に書き換えてください。

// --- シナリオA: 前日分の売上を集計してGmailで送信 ---
function dailySalesReport() {
  try {
    // --- 設定(自分の環境に合わせて書き換える) ---
    const toAddress = 'your-address@example.com';
    const sheetName = '売上';

    // --- 前日の日付を求める ---
    const yesterday = new Date();
    yesterday.setDate(yesterday.getDate() - 1);
    const targetDateStr = Utilities.formatDate(
      yesterday,
      'Asia/Tokyo',
      'yyyy/MM/dd'
    );

    // --- シートのデータを2次元配列で取得 ---
    const sheet = SpreadsheetApp
      .getActiveSpreadsheet()
      .getSheetByName(sheetName);
    const values = sheet.getDataRange().getValues();

    // --- 前日分だけ合計する(1行目ヘッダーはスキップ) ---
    let total = 0;
    let count = 0;
    for (let i = 1; i < values.length; i++) {
      const cellDate = values[i][0]; // A列: 日付
      const amount = values[i][2];   // C列: 金額
      if (!(cellDate instanceof Date)) continue;
      const rowDateStr = Utilities.formatDate(
        cellDate,
        'Asia/Tokyo',
        'yyyy/MM/dd'
      );
      if (rowDateStr === targetDateStr) {
        total += Number(amount);
        count++;
      }
    }

    // --- メール本文を組み立てて送信 ---
    const subject = '[日報] ' + targetDateStr + ' の売上集計';
    const body =
      targetDateStr + ' の売上をお知らせします。nn' +
      '件数: ' + count + ' 件n' +
      '合計金額: ' + total.toLocaleString() + ' 円';
    GmailApp.sendEmail(toAddress, subject, body);
  } catch (err) {
    // --- エラー時はログに残す ---
    console.log('日報送信エラー: ' + err.message);
  }
}

コードのポイント解説

ポイントを順番に見ていきましょう。

  • new Date()setDate(...): 今日の日付から1日引いて前日を求めています。setDate(getDate() - 1) は月初でも正しく前月末に戻るので、月またぎを気にする必要はありません
  • Utilities.formatDate(...): 日付を yyyy/MM/dd の文字列にそろえる関数です。タイムゾーンに 'Asia/Tokyo' を指定して、日本時間でずれないようにしています
  • getDataRange().getValues(): シートの入力済み範囲をまとめて2次元配列で取り出します。1行ずつ読むより高速で、GASの定番パターンです
  • if (!(cellDate instanceof Date)) continue;: 日付セルが空欄や文字列だった場合に備えて、日付型でない行は飛ばしています
  • try/catch: トリガー実行中にエラーが出ても、処理を安全に終わらせるためのガードです

このコードを保存したら、まず手動で1回実行してみましょう。前日分の売上が入っていれば、自分宛にメールが届くはずです。動作を確認できたら、いよいよトリガーを設定します。

時間主導型トリガーを設定する

先ほどの手順でトリガー画面を開き、「トリガーを追加」から次のように設定します。

  1. 実行する関数: dailySalesReport
  2. イベントのソース: 時間主導型
  3. 時間ベースのトリガーのタイプ: 日付ベースのタイマー
  4. 時刻: 午前9時〜10時
  5. 「保存」をクリック

これで、毎朝9時台に前日の売上集計メールが自動で届くようになります。前述の通り、実行は「9時〜10時の枠内のどこか」で行われる点だけ覚えておきましょう。

なお、メールの本文をもっと作り込みたい場合は、HTML形式での送信や商品別の内訳追加なども可能です。差し込みメールのテクニックは、こちらの記事が参考になりますよ。

スプレッドシートからGmailを一括送信する方法|GASで差し込みメールを自動化

【シナリオB】フォーム回答があったら担当者にメール通知

次は、Googleフォームに回答が届いた瞬間に、担当者へメールで通知するというフォーム送信時トリガーの実装です。問い合わせや申込フォームの「気づかず放置」をなくせます。

フォーム送信時トリガーが使えるスプレッドシート

フォーム送信時トリガーを使うには、フォームの回答が流れ込むスプレッドシートが起点になります。フォーム編集画面の「回答」タブから「スプレッドシートにリンク」しておくと、回答のたびにスプレッドシートへ行が追加されます。

このリンク先スプレッドシートで 拡張機能Apps Script を開いて、コードを書いていきます。フォーム連携の基本をもっと詳しく知りたい方は、こちらの記事もあわせてどうぞ。

Googleフォーム×GASで回答を自動通知・集計する方法|コピペで動く3レシピ

コピペで動くサンプルコード

回答先スプレッドシートのスクリプトエディタに、以下を貼り付けます。'tantou@example.com' を担当者のメールアドレスに書き換えてください。

// --- シナリオB: フォーム回答を担当者にメール通知 ---
function notifyOnFormSubmit(e) {
  try {
    // --- 通知先(担当者のアドレスに書き換える) ---
    const toAddress = 'tantou@example.com';

    // --- 質問名をキーにした回答オブジェクト ---
    const namedValues = e.namedValues;

    // --- 「質問: 回答」の形に整形して連結 ---
    const body = Object.entries(namedValues)
      .map(function(entry) {
        return entry[0] + ': ' + entry[1].join(', ');
      })
      .join('n');

    // --- メールを送信 ---
    const subject = '[フォーム] 新しい回答が届きました';
    GmailApp.sendEmail(toAddress, subject, body);
  } catch (err) {
    console.log('フォーム通知エラー: ' + err.message);
  }
}

コードのポイント解説

フォーム送信時トリガーでは、ハンドラ関数がイベントオブジェクトを受け取れます。引数の e がそれで、トリガー発火時に「どんな回答が来たか」という情報が自動で渡されます。

  • e.namedValues: イベントオブジェクト e が持つプロパティで、質問テキストをキー、回答を配列値とするオブジェクトです。列の順番に依存しないため、後から質問を追加・並び替えしても壊れにくくなります
  • entry[1].join(', '): チェックボックスなど複数回答の場合に備えて、回答をカンマ区切りで結合しています
  • try/catch: エラー時もトリガーを安全に終わらせるためのガードです

フォーム送信時トリガーを設定する

コードを保存したら、トリガー画面で次のように設定します。

  1. 実行する関数: notifyOnFormSubmit
  2. イベントのソース: スプレッドシートから
  3. イベントの種類: フォーム送信時
  4. 「保存」をクリック

設定できたら、テスト用にフォームを1件送信してみましょう。担当者のメールアドレスに通知が届けば成功です。これで「回答が来たのに誰も気づかない」状態から抜け出せますよ。

GASのトリガーが動かない・二重実行するときの対処法

トリガーは便利な反面、「設定したのに動かない」「メールが2通来る」といったトラブルも起きがちです。よくあるパターンと対処法をまとめておきます。

トリガーが動かないとき

まず確認したいのは、実行ログです。スクリプトエディタ左メニューの「実行数」をクリックすると、トリガーが実際に走ったかどうかと、その結果(完了・失敗)を確認できます。ステータスが「失敗」になっていれば、クリックしてエラー内容を見てみましょう。

動かないときに多い原因は次の通りです。

  • シンプルトリガーでメール送信を書いている: onEdit などのシンプルトリガーではメール送信ができません。インストーラブルトリガーに設定し直す必要があります
  • 関数名やシート名のタイプミス: コード内の getSheetByName('売上') のシート名が、実際のシート名と1文字でも違うと動きません
  • 権限承認が完了していない: 初回の承認画面を途中で閉じてしまうと、トリガーは設定されても実行時に止まります

なお、インストーラブルトリガーで起動した関数がエラーになると、Googleからトリガー所有者宛にエラー通知メールが自動で届きます。try/catch でエラーを完全に握りつぶすと、この通知も来なくなり「気づかないうちに止まっている」状態になりやすいので、開発中は console.log でログを残しておくと安心です。

メールが2通来る・処理が二重に走るとき

同じ処理が2回実行される場合、トリガーを重複して登録しているのが原因のほとんどです。

トリガー画面で「トリガーを追加」を何度も押すと、同じ関数に複数のトリガーがぶら下がります。すると1回のイベントで関数が2回・3回と実行され、メールも同じ数だけ届いてしまいます。トリガー一覧を開いて、不要なトリガーは行末のメニューから削除しましょう。

実行回数・時間の上限に注意

GASには割り当て(quota)という1日あたりの上限があります。個人のGoogleアカウント(@gmail.com)の主な上限は次の通りです。

項目個人アカウントの上限
メール送信数(GmailApp)1日 100通
スクリプト1回の実行時間最大 6分
トリガーの合計実行時間1日 90分

「毎朝1通メールを送る」程度なら、この上限にはまったく届きません。ただし「1分おきのトリガーで毎回メールを送る」といった設計だと、あっという間に上限に達してしまいます。トリガーの頻度は、本当に必要な間隔だけにしておきましょう。

トリガーは作成した本人の権限で動く

もう1つ知っておきたいのが、トリガーは設定した本人のアカウント権限で実行されるという点です。スプレッドシートをチームで共有していても、トリガーは作成者として動き、メールは作成者のGmailから送られます。割り当て(1日100通など)も作成者のものが消費されます。チームで運用する場合は、誰のアカウントでトリガーを設定したかを把握しておくと、トラブルを避けられますよ。

まとめ|GASのトリガーで定型業務を自動化しよう

GASのトリガーを使えば、これまで手作業で繰り返していた集計や通知を、自分が何もしなくても自動で動かせます。最後に要点を整理しておきます。

  • トリガーには時間主導型とイベント型がある: スケジュールで動かすなら時間主導型、操作をきっかけに動かすならイベント型
  • メール送信や定期実行はインストーラブルトリガーが必須: シンプルトリガー(onEditなど)ではメール送信ができない
  • 時間主導型は「枠内のどこか」で実行される: 9時〜10時を指定しても9時00分ぴったりではない
  • 動かないときは実行ログ、二重実行は重複トリガーを疑う: まずは「実行数」画面を確認する
  • 割り当て(1日100通など)に注意: 高頻度トリガーは上限に届きやすい

「毎朝9時の自動集計」と「フォーム回答の自動通知」が動かせるようになれば、GASの自動化はぐっと実用的になります。今日紹介したコードはコピペで動くので、ぜひ自分の業務に合わせて書き換えて試してみてください。

GASの基礎を固め直したい方や、フォーム・メール連携をさらに掘り下げたい方は、シリーズの関連記事もあわせてどうぞ。

タイトルとURLをコピーしました