GASでメール自動送信|スプレッドシートからGmail一斉送信する方法

「スプレッドシートの名簿から一斉メールを送りたいけど、1通ずつ手作業はつらい…」そんな悩みをGAS(Google Apps Script)で一発解決しましょう!
Google Apps Script(GAS)を使えば、スプレッドシートの宛先リストからGmailを自動送信できます。テンプレートに名前や日付を差し込んだパーソナライズメールも、コピペだけで実現可能です。
この記事では、基本の1通送信から、テンプレート差し込み一斉送信、トリガーによる定期実行まで、実務で使えるコード付きで徹底解説します。
- GASでGmailを自動送信する基本コード
- スプレッドシートのデータを差し込んで一斉送信する方法
- CC/BCC・添付ファイル・HTML形式メールの送り方
- トリガーで毎日・毎週の定期送信を自動化する手順
- 送信エラーの原因と対処法
この記事の目次
「実行」ボタンを押すと、スプレッドシートからデータを読み取ってメールを送信するGASの動作をシミュレーション体験できます。(実際にはメールは送信されません)
| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | メールアドレス | 宛名 | 件名 | 本文 | 送信済 |
| 2 | tanaka@example.com | 田中太郎 | 会議のご案内 | 明日の会議… | 済 |
| 3 | suzuki@example.com | 鈴木花子 | 報告書送付 | お疲れ様… | 済 |
| 4 | sato@example.com | 佐藤一郎 | お知らせ | ご確認く… | 済 |
GASでメール自動送信とは?できることと全体像
GAS(Google Apps Script)は、Googleが提供する無料のスクリプト環境です。スプレッドシート・Gmail・Googleドライブなど、Google Workspaceの各サービスをプログラムで操作できます。
メール自動送信の基本的な流れは次のとおりです。
- スプレッドシートに宛先・件名・本文のデータを用意する
- GASでデータを読み取り、GmailApp.sendEmail() でメールを送信する
- 必要に応じてトリガーを設定し、定期実行する
GASの基本的な使い方をまだ知らない方は、先にGAS入門ガイドをご覧ください。
GmailApp vs MailApp — 2つのメール送信クラスの違い
GASにはメール送信用のクラスが2つあります。結論から言うと、実務ではGmailAppを使うのがおすすめです。
GmailApp:Gmailに特化。送信者名の変更、CC/BCC、HTML形式、インライン画像など高機能。残り送信可能数の取得も可能。
MailApp:シンプルなメール送信向け。機能は限定的だが、Gmailへのアクセス権限が不要(送信のみの権限で動作)。
この記事では、より高機能なGmailAppクラスを中心に解説します。
メール自動送信でできること一覧
GASのメール送信では、以下のようなことが実現できます。
- 一斉送信:スプレッドシートの宛先リストへまとめて送信
- テンプレート差し込み:宛名・日付・金額など、行ごとに異なる内容を挿入
- HTML形式メール:装飾付きのリッチなメール送信
- CC/BCC指定:上司をCCに入れるなどの運用
- 添付ファイル:Googleドライブのファイルを自動添付
- 定期送信:トリガーで毎日・毎週の自動実行
- フォーム連携:Googleフォーム回答時に自動返信
準備編|スプレッドシートとスクリプトエディタの設定
送信リスト用スプレッドシートの作成
まず、メール送信用のスプレッドシートを作成します。シート名は「送信リスト」とし、以下の列構成にしてください。
A列:宛先メールアドレス
B列:宛名(氏名)
C列:件名
D列:本文
E列:送信済みフラグ(送信後に「済」と記入される列)
1行目はヘッダー行とし、2行目以降にデータを入力します。テスト時は自分のメールアドレスを入れておきましょう。
スクリプトエディタの開き方
スプレッドシートのメニューから「拡張機能」→「Apps Script」を選択すると、スクリプトエディタが開きます。
最初から記載されている function myFunction() {} は削除して、以降のコードを貼り付けてください。GASの基本操作に不安がある方は、GAS入門ガイドで詳しく解説しています。
Gmail送信の権限承認
GASからメールを送信するには、初回実行時にGmailへのアクセスを承認する必要があります。
- スクリプトを実行すると「承認が必要です」ダイアログが表示される
- 「権限を確認」をクリック
- Googleアカウントを選択
- 「詳細」→「(プロジェクト名)に移動」をクリック
- 「許可」をクリックして完了
「このアプリは確認されていません」という警告が出ますが、自分で作成したスクリプトなので問題ありません。
基本編|1通ずつメールを送信するコード
最もシンプルなメール送信コード
まずはGASでメールを1通送るだけの最小コードです。動作確認に使ってください。
function sendSimpleEmail() {
// 宛先・件名・本文を指定して送信
const to = 'example@gmail.com'; // ← 自分のアドレスに変更
const subject = 'GASテストメール';
const body = 'これはGoogle Apps Scriptから送信したテストメールです。';
GmailApp.sendEmail(to, subject, body);
// 送信完了をログに出力
Logger.log('メール送信完了: ' + to);
}
GmailApp.sendEmail() の引数は「宛先, 件名, 本文」の3つだけ。これだけでGmailからメールが送られます。
スプレッドシートのデータを読み取って送信
次に、スプレッドシートの送信リストからデータを取得し、各行ごとにメールを送信するコードです。
function sendEmailsFromSheet() {
// アクティブなスプレッドシートの「送信リスト」シートを取得
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('送信リスト');
const data = sheet.getDataRange().getValues();
// 2行目以降をループ(1行目はヘッダー)
for (let i = 1; i < data.length; i++) {
const to = data[i][0]; // A列: メールアドレス
const name = data[i][1]; // B列: 宛名
const subject = data[i][2]; // C列: 件名
const body = data[i][3]; // D列: 本文
// メールアドレスが空の行はスキップ
if (!to) continue;
// メール送信
GmailApp.sendEmail(to, subject, body);
Logger.log('送信完了: ' + to);
}
}
getDataRange().getValues() でシート全体を二次元配列として取得し、forループで1行ずつ処理しています。
送信済みフラグで二重送信を防止
誤って同じスクリプトを2回実行しても、二重送信を防ぐ仕組みを入れましょう。E列に「済」フラグを書き込む方式が簡単で確実です。
function sendEmailsWithFlag() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('送信リスト');
const data = sheet.getDataRange().getValues();
for (let i = 1; i < data.length; i++) {
const to = data[i][0];
const name = data[i][1];
const subject = data[i][2];
const body = data[i][3];
const sent = data[i][4]; // E列: 送信済みフラグ
// メールアドレスが空、または送信済みの行はスキップ
if (!to || sent === '済') continue;
try {
GmailApp.sendEmail(to, subject, body);
// E列に「済」と送信日時を記入
sheet.getRange(i + 1, 5).setValue('済');
sheet.getRange(i + 1, 6).setValue(new Date());
Logger.log('送信完了: ' + to);
} catch (e) {
// エラー時はE列に「エラー」と記入
sheet.getRange(i + 1, 5).setValue('エラー');
sheet.getRange(i + 1, 6).setValue(e.message);
Logger.log('送信失敗: ' + to + ' - ' + e.message);
}
}
}
try-catchでエラーハンドリングも入れているので、1件のエラーで全体が止まることを防げます。
Q: GASのsendEmailで1日に送れるメール数に上限はありますか?
A: はい、無料のGoogleアカウントでは1日100通、Google Workspaceアカウントでは1日1,500通が上限です。MailApp.getRemainingDailyQuota()で残り送信数を確認できるので、一斉送信前にチェックするコードを入れておくと安心です。
実務では、まずテスト用に自分のメールアドレスだけのリストで動作確認してから本番リストに切り替えています。一斉送信は取り消せないため、送信前にLogger.logで宛先と本文を出力して目視チェックする「ドライラン」工程を必ず挟むのがおすすめです。この習慣で誤送信事故をゼロに保っています。
応用編|テンプレート差し込みで一斉送信
テンプレート変数の差し込み方法(${name}方式)
メール本文に ${name} や ${date} のような変数を埋め込み、行ごとに異なる内容を差し込むことができます。
function sendBulkEmailWithTemplate() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('送信リスト');
const data = sheet.getDataRange().getValues();
// メールテンプレート
const subjectTemplate = '【ご案内】${name}様へのお知らせ';
const bodyTemplate =
'${name} 様\n\n' +
'いつもお世話になっております。\n\n' +
'${date} の会議についてご連絡いたします。\n' +
'場所: ${place}\n' +
'時間: ${time}\n\n' +
'ご確認のほど、よろしくお願いいたします。';
for (let i = 1; i < data.length; i++) {
const to = data[i][0];
const sent = data[i][4];
if (!to || sent === '済') continue;
// テンプレート変数を置換
const values = {
name: data[i][1],
date: data[i][2],
place: data[i][3],
time: data[i][4]
};
let subject = subjectTemplate;
let body = bodyTemplate;
for (const key in values) {
const regex = new RegExp('\\$\\{' + key + '\\}', 'g');
subject = subject.replace(regex, values[key]);
body = body.replace(regex, values[key]);
}
GmailApp.sendEmail(to, subject, body);
sheet.getRange(i + 1, 6).setValue('済');
Logger.log('送信完了: ' + to);
}
}
テンプレートの変数名とスプレッドシートの列を対応させることで、柔軟な差し込みメールが実現できます。
HTML形式のメール送信
HTMLメールを送信するには、sendEmail() の第4引数にオプションオブジェクトを渡し、htmlBody プロパティを指定します。
function sendHtmlEmail() {
const to = 'example@gmail.com';
const subject = 'HTML形式のテストメール';
// プレーンテキスト(HTMLに非対応のメーラー向けフォールバック)
const plainBody = 'このメールはHTML形式です。';
// HTML本文
const htmlBody =
'<div style="font-family: sans-serif; max-width: 600px;">' +
' <h2 style="color: #1a73e8;">お知らせ</h2>' +
' <p>いつもご利用いただきありがとうございます。</p>' +
' <table style="border-collapse: collapse; width: 100%;">' +
' <tr style="background: #f1f3f4;">' +
' <th style="padding: 8px; border: 1px solid #ddd;">項目</th>' +
' <th style="padding: 8px; border: 1px solid #ddd;">内容</th>' +
' </tr>' +
' <tr>' +
' <td style="padding: 8px; border: 1px solid #ddd;">日時</td>' +
' <td style="padding: 8px; border: 1px solid #ddd;">2026年3月15日 14:00</td>' +
' </tr>' +
' <tr>' +
' <td style="padding: 8px; border: 1px solid #ddd;">場所</td>' +
' <td style="padding: 8px; border: 1px solid #ddd;">会議室A</td>' +
' </tr>' +
' </table>' +
' <p style="margin-top: 16px;">ご確認をお願いいたします。</p>' +
'</div>';
GmailApp.sendEmail(to, subject, plainBody, {
htmlBody: htmlBody
});
Logger.log('HTMLメール送信完了');
}
htmlBody を指定すると、HTML対応メーラーではリッチな表示になり、非対応メーラーでは第3引数のプレーンテキストが表示されます。
CC・BCCの設定方法
CC(カーボンコピー)やBCC(ブラインドカーボンコピー)は、オプションオブジェクトで指定します。
function sendEmailWithCcBcc() {
const to = 'recipient@example.com';
const subject = 'CC・BCC付きメール';
const body = 'このメールにはCCとBCCが設定されています。';
GmailApp.sendEmail(to, subject, body, {
cc: 'manager@example.com, leader@example.com', // 複数はカンマ区切り
bcc: 'archive@example.com',
name: '山田 太郎', // 送信者名を変更
replyTo: 'support@example.com' // 返信先を変更
});
Logger.log('CC/BCC付きメール送信完了');
}
複数のCC/BCCアドレスを指定する場合は、カンマ区切りの文字列で渡します。name で送信者の表示名、replyTo で返信先も変更可能です。
添付ファイル付きメール送信
Googleドライブのファイルを添付してメール送信するコードです。PDFやExcelファイルなど、あらゆるファイル形式に対応しています。
function sendEmailWithAttachment() {
const to = 'recipient@example.com';
const subject = '添付ファイル付きメール';
const body = '請求書を添付いたします。ご確認ください。';
// Googleドライブからファイルを取得(ファイルIDで指定)
const fileId = 'ここにGoogleドライブのファイルIDを入力';
const file = DriveApp.getFileById(fileId);
// スプレッドシートをPDFに変換して添付する場合
// const ss = SpreadsheetApp.openById(fileId);
// const pdf = ss.getAs('application/pdf');
GmailApp.sendEmail(to, subject, body, {
attachments: [file.getAs(MimeType.PDF)],
name: '経理部'
});
Logger.log('添付ファイル付きメール送信完了');
}
ファイルIDは、Googleドライブでファイルを右クリック →「リンクを取得」で表示されるURLの /d/ と / の間の文字列です。複数ファイルを添付する場合は、attachments 配列に追加してください。
Q: HTML形式メールとプレーンテキストメール、どちらを使うべきですか?
A: 社内連絡ならプレーンテキストで十分ですが、顧客向けの案内メールやニュースレターならHTML形式が効果的です。ただしHTML形式はhtmlBodyオプションで指定し、body引数にはフォールバック用のテキストも必ず設定しましょう。HTMLメールを表示できない環境への対策になります。
GASのメール自動送信を本番運用する際は、送信ログ用のシートを別途用意して「送信日時・宛先・ステータス」を記録するようにしています。月次で500通以上送るプロジェクトでは、この送信ログが障害調査やクレーム対応時の証跡として何度も役立ちました。また、GASの実行時間制限(6分)があるため、100件以上の一斉送信ではUtilities.sleep(500)を挟んでAPI負荷を分散させるのが安定運用のコツです。
自動化編|トリガーで定期送信を設定
ここまでは手動で実行するコードでしたが、トリガーを使えば毎日・毎週の定期送信やフォーム回答時の自動返信も実現できます。SNS投稿の自動化に興味がある方は、SNS予約投稿ツールの作り方もぜひご覧ください。
時間主導型トリガー(毎日・毎週)
GUIでトリガーを設定する手順は以下のとおりです。
- スクリプトエディタ左メニューの「トリガー」(時計アイコン)をクリック
- 「トリガーを追加」をクリック
- 実行する関数を選択(例:
sendEmailsWithFlag) - イベントのソース:「時間主導型」を選択
- タイプ:「日付ベースのタイマー」→ 時間帯を指定
- 「保存」をクリック
コードでトリガーを設定することも可能です。
function createDailyTrigger() {
// 既存の同名トリガーを削除(重複防止)
const triggers = ScriptApp.getProjectTriggers();
triggers.forEach(trigger => {
if (trigger.getHandlerFunction() === 'sendEmailsWithFlag') {
ScriptApp.deleteTrigger(trigger);
}
});
// 毎日午前9時に実行するトリガーを作成
ScriptApp.newTrigger('sendEmailsWithFlag')
.timeBased()
.everyDays(1)
.atHour(9)
.create();
Logger.log('日次トリガーを作成しました');
}
フォーム送信トリガー(自動返信メール)
Googleフォームの回答が送信されたときに、自動で確認メールを返信するコードです。フォームと連携したスプレッドシートのスクリプトエディタに記述します。
function onFormSubmit(e) {
// フォームの回答データを取得
const responses = e.namedValues;
const email = responses['メールアドレス'][0];
const name = responses['お名前'][0];
const subject = '【自動返信】お問い合わせを受け付けました';
const body =
name + ' 様\n\n' +
'お問い合わせいただきありがとうございます。\n' +
'以下の内容で受け付けました。\n\n' +
'---\n' +
'お名前: ' + name + '\n' +
'メールアドレス: ' + email + '\n' +
'---\n\n' +
'担当者より2営業日以内にご連絡いたします。';
GmailApp.sendEmail(email, subject, body);
Logger.log('自動返信送信: ' + email);
}
// フォーム送信トリガーをコードで設定
function createFormTrigger() {
ScriptApp.newTrigger('onFormSubmit')
.forSpreadsheet(SpreadsheetApp.getActive())
.onFormSubmit()
.create();
Logger.log('フォーム送信トリガーを作成しました');
}
フォームの質問項目名(「お名前」「メールアドレス」)は、実際のフォームに合わせて変更してください。
トリガーの管理と削除
不要なトリガーは放置するとスクリプトが意図せず実行され続けます。以下の方法で管理しましょう。
GUIで削除:スクリプトエディタ →「トリガー」→ 対象トリガーの「…」→「トリガーを削除」
コードで全トリガーを削除:
function deleteAllTriggers() {
const triggers = ScriptApp.getProjectTriggers();
triggers.forEach(trigger => {
ScriptApp.deleteTrigger(trigger);
});
Logger.log(triggers.length + '件のトリガーを削除しました');
}
エラー対処とベストプラクティス
「日次の送信数上限に達しました」エラー
GASのメール送信にはGoogleアカウントごとに日次クォータ(送信上限)があります。
- 無料Googleアカウント:1日100通
- Google Workspace:1日1,500通
残りの送信可能数は以下のコードで確認できます。
function checkQuota() {
const remaining = MailApp.getRemainingDailyQuota();
Logger.log('本日の残り送信可能数: ' + remaining + '通');
}
上限を超える場合は、送信を複数日に分割するか、Google Workspaceへのアップグレードを検討してください。
「承認が必要です」エラーの解決
以下のケースで承認エラーが発生します。
- 初回実行時:前述の権限承認手順を実施してください
- コード変更後:新しいAPIを使い始めた場合、再承認が必要になることがあります
- トリガー実行時:手動で1回実行して承認を済ませてからトリガーを設定してください
組織のGoogle Workspaceで「内部アプリのみ許可」設定がある場合は、管理者に確認が必要です。
メールが迷惑メールに振り分けられる場合
GASから送信したメールが迷惑メールフォルダに入る場合、以下を確認しましょう。
- 送信者名を設定する:
nameオプションで正式な名前を指定 - 件名を工夫する:スパムと判定されやすい表現(「無料」「緊急」など)を避ける
- HTML形式の場合:画像だけのメールにせず、テキストも含める
- 一度に大量送信しない:短時間に大量送信するとスパム判定されやすい
- 受信者に連絡帳登録を依頼:送信元アドレスを連絡先に追加してもらう
VBAとGASのメール送信比較
Excel VBAでもOutlookと連携してメール送信は可能です。ここでは両者を比較し、それぞれの適したシーンを解説します。Excelの高機能な検索関数についてはXLOOKUP関数の使い方も参考にしてください。
VBA(Outlook連携)のコード例
参考として、VBAでOutlookからメールを送信するコードを紹介します。
Sub SendEmailVBA()
' Outlookアプリケーションを起動
Dim olApp As Object
Set olApp = CreateObject("Outlook.Application")
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("送信リスト")
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
Dim i As Long
For i = 2 To lastRow
' 送信済みチェック
If ws.Cells(i, 5).Value <> "済" Then
Dim mail As Object
Set mail = olApp.CreateItem(0)
With mail
.To = ws.Cells(i, 1).Value ' 宛先
.Subject = ws.Cells(i, 3).Value ' 件名
.Body = ws.Cells(i, 4).Value ' 本文
.Send
End With
' 送信済みフラグ
ws.Cells(i, 5).Value = "済"
ws.Cells(i, 6).Value = Now
End If
Next i
MsgBox "送信完了しました"
End Sub
VBAの場合はローカルにOutlookがインストールされている必要があり、PCが起動していないと実行できません。
GASとVBAの機能比較表
| 比較項目 | GAS(Gmail) | VBA(Outlook) |
|---|---|---|
| 環境 | ブラウザのみ(クラウド) | Excel + Outlook(ローカル) |
| 費用 | 無料 | Microsoft 365ライセンスが必要 |
| 定期実行 | トリガーで自動実行(PCオフでもOK) | タスクスケジューラ(PC起動が必要) |
| 送信上限 | 100通/日(無料)、1,500通/日(Workspace) | Outlook/Exchange側の制限に依存 |
| HTML形式 | 対応 | 対応 |
| 添付ファイル | Googleドライブから取得 | ローカルファイルを指定 |
| おすすめシーン | Googleサービス中心の業務 | Microsoft中心の社内業務 |
Googleサービスを中心に使っている環境なら、GASのほうが圧倒的に手軽です。PCの電源を入れなくても定期実行できるのが最大のメリットです。
よくある質問(FAQ)
無料のGoogleアカウントでは1日100通、Google Workspaceでは1日1,500通まで送信できます。残り送信可能数は MailApp.getRemainingDailyQuota() で確認できます。
GmailAppクラスではGmailアドレスのみですが、エイリアス設定済みのアドレスからは送信可能です。Gmailの「設定」→「アカウントとインポート」→「他のメールアドレスを追加」でエイリアスを登録してください。
自分のメールアドレスを送信リストに入れてテスト送信するのが最も確実です。本番前に少数でテストしましょう。Logger.log() でデバッグ出力を確認するのも有効です。
GASの利用自体は無料です。Gmailの送信クォータ内であれば追加費用はかかりません。Google Workspaceは月額料金が発生しますが、GAS単体の追加課金はありません。
BCCは受信者に他の宛先が見えない利点がありますが、GASなら個別差し込みで1通ずつパーソナライズできます。大量送信はGAS推奨です。宛名の差し込みや送信ログの管理もGASのほうが優れています。
GASのメール自動送信を活用すれば、日常業務のメール作業を大幅に効率化できます。まずはシンプルな1通送信から試して、徐々にテンプレート差し込みやトリガー設定に進んでみてください。
LINEでExcelを気軽に学べる
「メール送信の自動化をもっと本格的にやりたい」「既存の業務フローに組み込みたい」という方は、ぜひご相談ください。
