毎日スプレッドシートに行を追加するたびに担当者へ手動でメールを送っていて、地味に時間を奪われていませんか。
行を追加した瞬間に自動でメールが飛べば、伝え漏れや送り忘れを減らしつつ、確認作業の負担も軽くできます。
この記事では、スプレッドシートへの行追加をきっかけに、GAS(Google Apps Script)でメールを自動送信する方法を、初心者でも設定できるレベルまでかみ砕いて解説します。
・スプレッドシートの行追加をきっかけにメールを送る全体像
・GASでメール送信スクリプトを書く具体的なサンプルコード
・インストール型トリガーを使った安全な自動化の設定方法
・つまずきやすいエラーとメールが送られすぎる問題の対策
スプレッドシートの行追加でメール送信を自動化する基本
スプレッドシートで「新しい行が追加されたら担当者にメールしたい」というニーズは、現場でとても多いです。
問い合わせ管理、申請の受付、タスク登録など、行が増える=何かが発生した合図になる場面が多いためです。
ここでは、できるだけシンプルな構成で、自動メール送信の基本パターンを整理します。
結論:最短でメール自動送信を実現する方法
最短の構成は、次の三つを組み合わせる方法です。
- 対象のスプレッドシートに、メールアドレスや本文を入れる列を用意する
- GASで「行が整ったときにメールを送る関数」を作る
- インストール型の編集トリガーを使って、その関数を「編集時」に自動実行する
スプレッドシートのセルが編集されると、編集イベントをきっかけに関数を自動で動かすことができます。
このしくみは「トリガー」と呼ばれており、編集・フォーム送信・時間など様々なタイミングを指定できます。(Google for Developers)
メール送信のように権限が必要な操作は、一般的にはインストール型トリガーを使う必要があります。
インストール型トリガーは、最初に一度だけ権限を許可すれば、以降は自動でメールを送る処理を実行できます。(DEV Community)
たとえば次のようなイメージです。
「スプレッドシートに新しい問い合わせを1行追加すると、担当者に『新しい問い合わせが来ました』というメールが自動で届く」
こうした仕組みを一度作ってしまえば、毎日の手動メールにかけていた時間を大きく減らせます。
事前準備と前提条件を確認する
この方法を使うには、次のような前提があります。
- Googleアカウントを持っている
- Gmailを利用できる(社内ドメインの場合は管理ポリシーも要確認)
- 対象のスプレッドシートを編集できる権限がある
シート側の準備としては、最低限次のような列を用意しておくと分かりやすくなります。
- A列:登録日時(任意)
- B列:名前などの内容
- C列:メールアドレス
- D列:メール本文やメモ
- E列:送信済みフラグ(後で使えるよう空欄で用意)
判断基準としては、どの列が埋まったら「行が完成した」と見なすかをはっきり決めておくことが重要です。
行が半端な状態のままトリガーが動くと、中途半端な内容でメールが送られてしまうことがあります。
現場では「最後に入力する列(例:D列)が編集されたタイミングで送信する」ように決めておくケースが多いです。
GASスクリプトを作成する手順
ここでは、次のようなルールでメールを送る例を紹介します。
- シート名「シート1」を監視する
- 2行目以降(1行目はヘッダー)を対象にする
- D列(本文列)が編集されたときにメールを送る
- C列のメールアドレス宛てに送信する
手順は次のとおりです。
- 対象のスプレッドシートを開く
- メニューから「拡張機能」→「Apps Script」を開く
- 自動で作成されたコードをすべて削除する
- 次のサンプルコードを貼り付ける
const SHEET_NAME = 'シート1';
const START_ROW = 2; // データ開始行(1行目はヘッダー)
const EMAIL_COL = 3; // C列:メールアドレス
const TEXT_COL = 4; // D列:メール本文など
function sendMailOnNewRow(e) {
const sheet = e.source.getActiveSheet();
if (sheet.getName() !== SHEET_NAME) return;
const range = e.range;
const row = range.getRow();
const col = range.getColumn();
// ヘッダー行より上は無視
if (row < START_ROW) return;
// 「行が整った」とみなす列だけをトリガーにする(ここではD列)
if (col !== TEXT_COL) return;
const email = sheet.getRange(row, EMAIL_COL).getValue();
const body = sheet.getRange(row, TEXT_COL).getValue();
// メールアドレスが空の場合は送らない
if (!email) return;
const subject = 'スプレッドシートに新しい行が追加されました';
MailApp.sendEmail(email, subject, body || '新しい行が追加されました。');
}
このコードでは、編集イベントの情報を表すe(イベントオブジェクト)を使って、どのセルが編集されたかを判断しています。(Google for Developers)
実務では、「特定シートのみ」「特定列のみ」「ヘッダーより下だけ」という条件を組み合わせて、意図したときだけメールが送られるようにすることが多いです。
トリガーの設定手順
コードを書いただけでは自動では動きません。
インストール型トリガーを設定して、編集時に先ほどの関数が呼ばれるようにします。
- Apps Scriptエディタの左側メニューから「トリガー(時計アイコン)」をクリックする
- 右下の「トリガーを追加」ボタンをクリックする
- 「実行する関数を選択」で
sendMailOnNewRowを選ぶ - 「イベントのソースを選択」で「スプレッドシートから」を選ぶ
- 「イベントの種類を選択」で「編集時」を選ぶ
- 保存すると、初回だけ権限確認の画面が表示されるので内容を確認して許可する
インストール型トリガーを使うことで、メール送信などの権限が必要な処理も安全に自動実行できます。(Google for Developers)
現場では、このトリガー設定を忘れて「コードは合っているのに動かない」というケースがよくあります。
動作確認のポイント
設定が終わったら、次のように動作確認をします。
- テスト用のメールアドレスをC列に入力する
- D列にテスト用の本文(例:「テスト行です」)を入力する
- 数秒待って、Gmailにメールが届くか確認する
メールが届かない場合は、次の点を順に確認すると原因を絞り込みやすくなります。
- シート名がコードの
SHEET_NAMEと一致しているか - 編集したのがD列か(別の列を変えても送信されないようにしている)
- トリガーに
sendMailOnNewRowが設定されているか - トリガー一覧でエラー表示が出ていないか
たとえば、問い合わせ管理の現場では、次のような流れで使われることが多いです。
「担当者がスプレッドシートに新規の問い合わせを1行追加すると、D列に簡単なメモを入れたタイミングでお客様にも自動返信メールが飛び、担当者にも通知が届く」
こうした動きが確認できれば、基本設定は完了です。
つまずきやすいポイントと運用のコツ
一度動くようになっても、実際の運用に乗せると「メールが送られない」「逆に送りすぎる」といった問題がよく起きます。
ここでは、現場でつまずきやすいポイントと、トラブルを避けるための考え方を整理します。
「なんとなく動いた」状態から「安心して任せられる」状態にブラッシュアップするイメージです。
よくあるエラーと対処法
代表的なつまずきポイントは次のようなものです。
権限エラーでメールが送れない場合
- 症状:トリガー実行ログにエラーが出ていて、メールが送られていない
- 原因:インストール型トリガーの権限を正しく許可していない、または権限が失効している
- 対処:トリガー画面から対象のトリガーを一度削除し、再度追加して権限許可をやり直す
特に、単純なonEditのような簡易トリガーでは、メール送信など外部サービスを使う処理に制限があることがあります。(Google for Developers)
インストール型トリガーを使うことで、この制限を回避しやすくなります。
トリガー自体が動いていない場合
- トリガー一覧に「失敗」がたくさん並んでいる
- トリガーが「無効」になっている
この場合は、コードのエラーだけでなく、スプレッドシートが削除・コピーされていないか、トリガーの紐づけ先が変わっていないかも確認します。
運用現場では、シートを丸ごとコピーして増やした結果、元のトリガーだけが動いていて、新しいシートの更新には反応しない、というケースが多いです。
想定外にメールが増える場合の対策
「動作はしているが、ちょっとセルを直しただけでもメールが飛んでしまう」という相談もよくあります。
これは、条件を絞らずに「編集時」にトリガーをかけていると起こりやすい問題です。
対策としては、次のような絞り込みをいくつか組み合わせるのが一般的です。
- シート名で絞る(例:
if (sheet.getName() !== '受付') return;) - 列で絞る(例:D列が編集されたときだけ送る)
- 行で絞る(ヘッダー行や集計行は対象外にする)
- 「送信済み」フラグ列を使い、既に送信した行はスキップする
たとえば、次のようなイメージです。
「担当者が内容を修正したときにはメールを送りたくないので、『送信済みフラグが空の行で、D列が初めて入力されたタイミングだけメールを送る』ように条件を工夫する」
判断基準としては、人の操作に近いルール(いつならメールしたいか)を、コードの条件として具体化できているかが重要です。
曖昧なままだと、「本当は送らなくてよかったメール」が増えやすくなります。
権限や共有設定で困ったとき
インストール型トリガーは、基本的に「トリガーを作成したユーザーの権限」で動作します。(Google for Developers)
そのため、共有スプレッドシートで複数人が編集するケースでは、次の点に注意が必要です。
- トリガーを作成した人が組織から抜けると、トリガーが動かなくなる場合がある
- 共有ドライブ上のファイルでは、組織のポリシーによってはトリガーが制限されることがある
- メールの送信元アドレスは、原則としてトリガー作成者のアカウントになる
運用の現場では、次のような運用ルールを決めておくパターンが多いです。
- 共通の「システム用アカウント」でトリガーを作成する
- トリガー作成者が変わるときは、権限移行と合わせてトリガーの作り直しも行う
- 組織の管理者に、GASの利用ポリシーや制限を事前に確認しておく
こうした前提を押さえておくと、「ある日突然、メールが飛ばなくなった」というトラブルを減らせます。
失敗を防ぐためのチェックリスト
運用前に次のポイントを確認しておくと、トラブルをかなり減らせます。
- テスト用のシートと本番用のシートを分けているか
- テスト用のメールアドレスで動作確認を繰り返しているか
- どの列・どの行がトリガー条件なのかをチームで共有しているか
- 「送信済み」フラグなどで二重送信を避けているか
- トリガーの設定画面を確認し、不要なトリガーを残していないか
- 誰がトリガーの管理者か(作成者)は明確か
現場では、最初にシンプルなルールで動かしてみて、少しずつ条件を追加していく進め方が多いです。
いきなり複雑な条件を組み込むと、原因の切り分けが難しくなります。
よくある質問
Q. 行の追加と既存行の編集をきれいに分けて判定できますか。
完全に分けるのは難しい場合が多いです。
一般的には、「最後に入力される列」や「送信済みフラグ」などを組み合わせて、「この条件を満たしたら新規扱い」とルール化します。
Q. Googleフォームの回答から行が追加されたときにも使えますか。
フォームの回答をスプレッドシートに保存している場合は、フォーム送信トリガー(onFormSubmit)を使う方法もあります。(Google for Developers)
ただし、フォームそのものの設定や組織の制限にも影響されるため、テスト用フォームで十分に動作確認することが大切です。
Q. メールの件名や本文を自由に変えたいのですが。
スクリプト内で、件名や本文を列の内容から組み立てれば柔軟に変更できます。
たとえば、「【新規問い合わせ】B列の名前さんから」というように、テンプレート文字列にシートの値を埋め込む使い方が一般的です。
Q. メールが送信されなかった場合に、どこを見れば原因が分かりますか。
Apps Scriptエディタの「トリガー」画面から、各トリガーの実行履歴とエラー内容を確認できます。
ログやエラー文を見ながら、条件分岐や権限設定を一つずつ見直していくと、原因を特定しやすくなります。
スプレッドシートで行追加時にGASでメール送信するまとめ
・スプレッドシートの行追加をトリガーにメール自動送信を行える
・GASとインストール型トリガーを組み合わせて自動化を実現する
・どの列が埋まったら行が完成かを事前に決めておく
・特定のシート名と列番号に処理対象を絞ると安全に運用しやすい
・編集イベントの情報から行番号と列番号を取得して条件判定する
・MailAppなどのメール送信機能はインストール型トリガーで使う
・トリガー設定画面で関数とイベント種別を正しく選ぶことが重要
・テスト用メールアドレスとテスト用シートで事前検証を繰り返す
・メール送信条件を厳しめに設定し想定外の大量送信を防ぐ
・送信済みフラグ列を用意して二重送信を抑制する
・トリガーが動かないときは権限設定とエラー履歴を確認する
・共有シートではトリガー作成者の権限や異動リスクに注意する
・シート複製時はトリガーの紐づけ先が変わらないかを確認する
・運用ルールと条件をチーム内で文章化し認識をそろえる
・シンプルなルールから始めて必要に応じて条件を追加していく
・Gmailの添付ファイルをGoogleドライブに自動保存する設定ガイド
・スプレッドシートとGASでGoogleフォーム集計を自動化する
・GoogleフォームをSlack連携し即時通知するZapier設定
・ChatGPTにログインできないときの原因と対処完全ガイド
・WordPressで画像をアップロードできないときの原因と対処まとめ
・Canvaでダウンロードできない原因と今すぐできる対処法
・WindowsでZoomのマイクが認識されないときの対処法
・Google Meetで音声が聞こえないときの設定見直しガイド
・Googleドライブにアップロードできない原因と対処法まとめ
・Slackでメンション通知がこないときの原因と今すぐできる対処法
・iPhoneでSlack通知が来ないときの原因と設定の直し方
・Notionで共有できないときに試したい権限設定チェック
・Notionにログインできない原因と今すぐ試せる対処法
・Web会議ツールはどれがいい?ZoomかMeetかTeamsか徹底比較
