「毎朝、出社したらまず昨日の売上を集計してメールで共有する」「フォームに回答が来ても、誰かが気づくまで放置されてしまう」——スプレッドシートで業務を回していると、こうした定型作業に時間を取られますよね。
この記事では、Google Apps Script(GAS)のトリガーを使って、スプレッドシートの集計やメール通知を「自分が何もしなくても自動で動く」状態にする方法を解説します。トリガーとは、決まった時刻やユーザーの操作を引き金に、指定した関数を自動実行する仕組みのことです。
GASの基本的な書き方や実行ボタンの押し方は、シリーズ1本目で丁寧に解説しています。GASに初めて触る方は、先にこちらを読むとつまずきにくいですよ。
なお、この記事で紹介する「毎朝9時に自動集計」「フォーム回答で自動通知」は、Microsoft の Power Automate でやるような自動化を、Google Workspace の無料環境で実現するイメージです。Microsoft 365 を使えない環境でも、GASのトリガーがあれば同じことができます。
GASのトリガーとは?|手動実行から自動実行への第一歩
GASのトリガーとは、「ある条件(時刻や操作)をきっかけに、指定した関数を自動で実行する仕組み」です。
通常、スプレッドシートで書いたGASのコードは、スクリプトエディタの「実行」ボタンを押さないと動きません。これが手動実行です。便利な処理を書いても、自分でボタンを押し続けるなら手作業とあまり変わりませんよね。
ここでトリガーの出番です。「毎朝9時になったら」「フォームに回答が届いたら」といった条件を設定しておけば、その瞬間に関数が自動で走ります。パソコンを開いていなくても、Googleのサーバー上で勝手に実行してくれるのが大きな特徴です。
トリガーで自動実行される関数のことを、この記事ではハンドラ関数と呼びます。トリガーが発火したときに呼び出される関数、という意味です。
| 項目 | 手動実行 | トリガーによる自動実行 |
|---|---|---|
| 実行のきっかけ | 自分で実行ボタンを押す | 時刻・操作などの条件 |
| パソコンの状態 | 開いている必要あり | 閉じていてもGoogleが実行 |
| 向いている用途 | テスト・単発の処理 | 定期処理・イベント対応 |
トリガーを覚えると、GASの活用範囲が一気に広がります。「同じ作業を毎日繰り返している」と感じている方ほど、効果を実感しやすいですよ。
シンプルトリガーとインストーラブルトリガーの違い
GASのトリガーには、実は2つの系統があります。最初にここを押さえておくと、後で「なぜか動かない」を避けられます。
- シンプルトリガー: 関数名を
onOpenやonEditのような決まった名前にするだけで、設定なしに自動発火するトリガーです。手軽ですが、メール送信や外部サービスへのアクセスができないという強い制約があります。 - インストーラブルトリガー: スクリプトエディタの専用画面から設定するトリガーです。権限の承認を経るため、メール送信や定期実行など、制約のある操作も実行できます。
この記事で扱う「自動メール送信」「毎朝の定期実行」は、いずれもインストーラブルトリガーが必須です。シンプルトリガーの 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 でスクリプトエディタを開いたら、次の手順で進みます。
- エディタの左側メニューにある時計のアイコン(トリガー)をクリック
- 画面右下の「トリガーを追加」ボタンをクリック
- 設定ダイアログで、実行する関数・イベントの種類などを選ぶ
- 「保存」をクリック
- 初回のみ権限の承認画面が表示されるので、自分のGoogleアカウントで承認する
設定ダイアログでは、主に次の項目を選びます。
| 設定項目 | 選ぶ内容 |
|---|---|
| 実行する関数を選択 | 自動実行したいハンドラ関数の名前 |
| 実行するデプロイを選択 | Head(基本はこのまま) |
| イベントのソースを選択 | 時間主導型 または スプレッドシートから |
| イベントの種類を選択 | ソースに応じて表示される選択肢 |
承認画面で「このアプリはGoogleで確認されていません」という警告が出ますが、自作スクリプトでは正常な挙動です。「詳細」→「(プロジェクト名)に移動(安全ではないページ)」をクリックして、利用する権限を確認のうえ許可してください。権限承認の詳しい流れは入門記事でも解説しています。
それでは、具体的なシナリオを2つ作っていきましょう。
【シナリオA】毎朝9時に前日の売上を集計してGmailに自動送信
最初のシナリオは、毎朝9時に前日分の売上を集計し、その結果をGmailで送るという時間主導型トリガーの実装です。朝イチの「昨日いくら売れた?」を、出社前に自動で用意しておくイメージです。
前提となるスプレッドシートの形
ここでは、次のような売上記録シート(シート名「売上」)を想定します。A列に日付、B列に商品名、C列に金額が入っている形です。
| 日付 | 商品名 | 金額 |
|---|---|---|
| 2026/05/26 | 商品A | 12000 |
| 2026/05/26 | 商品B | 8000 |
| 2026/05/27 | 商品A | 5000 |
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回実行してみましょう。前日分の売上が入っていれば、自分宛にメールが届くはずです。動作を確認できたら、いよいよトリガーを設定します。
時間主導型トリガーを設定する
先ほどの手順でトリガー画面を開き、「トリガーを追加」から次のように設定します。
- 実行する関数:
dailySalesReport - イベントのソース:
時間主導型 - 時間ベースのトリガーのタイプ:
日付ベースのタイマー - 時刻:
午前9時〜10時 - 「保存」をクリック
これで、毎朝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: エラー時もトリガーを安全に終わらせるためのガードです
フォーム送信時トリガーを設定する
コードを保存したら、トリガー画面で次のように設定します。
- 実行する関数:
notifyOnFormSubmit - イベントのソース:
スプレッドシートから - イベントの種類:
フォーム送信時 - 「保存」をクリック
設定できたら、テスト用にフォームを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の基礎を固め直したい方や、フォーム・メール連携をさらに掘り下げたい方は、シリーズの関連記事もあわせてどうぞ。
