GASでメールを一斉送信すると何が楽になるか
取引先への案内メールや、毎月の請求のお知らせなど、本文はほぼ同じで宛名だけ違うメールを 1 通ずつ手で送っていると、時間がかかるうえに送り忘れや宛名の間違いが起きます。
Google Apps Script (GAS) を使うと、スプレッドシートに並べた宛先へ、宛名を差し込んだメールを自動で送れます。追加のソフトや有料のサービスは要らず、Google アカウントがあれば今日から使えます。
手で送る場合
- 1 通ずつコピーして宛名を書き換える
- 誰に送ったかを別に記録する
- 送る時刻に席にいる必要がある
GASで送る場合
- 宛名はシートから自動で差し込む
- 送った行に日時が自動で残る
- 決まった時刻にトリガーで送れる
準備するスプレッドシート
新しいスプレッドシートを作り、シートの名前を「送信リスト」に変えて、1 行目に次の見出しを入れます。2 行目から宛先を 1 行に 1 件ずつ書きます。
送信リストのシートの形
| A | B | C | D | |
|---|---|---|---|---|
| 1 | メールアドレス | 氏名 | 会社名 | 送信状態 |
| 2 | tanaka@example.com | 田中 | 株式会社サンプル | |
| 3 | suzuki@example.com | 鈴木 | サンプル商事 |
D 列の「送信状態」が空の行だけを送る作りにします。こうしておくと、途中でエラーが出て止まっても、もう一度実行したときに送った相手へ二重に送らずに済みます。
コピーして使えるコード
スプレッドシートの上部のメニューから [拡張機能] > [Apps Script] を開き、最初から入っているコードを消して、次のコードを貼り付けて保存します。
const SHEET_NAME = "送信リスト";
const SENDER_NAME = "株式会社サンプル 営業部";
const SUBJECT = "11月の定例会のご案内";
const BODY_TEMPLATE = `{company}
{name} 様
いつもお世話になっております。
11月の定例会のご案内をお送りします。
日時: 11月20日 15:00〜16:00
場所: オンライン (URL は前日にお送りします)
どうぞよろしくお願いいたします。`;
function sendMails() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME);
const lastRow = sheet.getLastRow();
if (lastRow < 2) return;
const rows = sheet.getRange(2, 1, lastRow - 1, 4).getValues();
let remaining = MailApp.getRemainingDailyQuota();
rows.forEach((row, index) => {
const [email, name, company, status] = row;
if (!email || status) return;
if (remaining < 1) return;
const body = BODY_TEMPLATE.replace("{company}", company).replace("{name}", name);
GmailApp.sendEmail(email, SUBJECT, body, { name: SENDER_NAME });
const sentAt = Utilities.formatDate(new Date(), "Asia/Tokyo", "yyyy/MM/dd HH:mm");
sheet.getRange(index + 2, 4).setValue(`送信済み ${sentAt}`);
remaining -= 1;
});
}
コードの中で書き換えるのは、上の 4 行の SHEET_NAME (シート名)、SENDER_NAME (差出人として表示される名前)、SUBJECT (件名)、BODY_TEMPLATE (本文) だけです。本文の {company} と {name} の部分に、C 列の会社名と B 列の氏名が入ります。
コードがしていること
sendMails の流れ
- AIシートを読む2 行目から最終行まで
- AI送る行を選ぶ宛先があり D 列が空の行
- AI宛名を差し込んで送信GmailApp.sendEmail
- AID 列に送信日時を記録二重送信を防ぐ
送信には GmailApp.sendEmail(宛先, 件名, 本文, オプション) を使っています。公式リファレンスによると、オプションには差出人名の name のほか、cc・bcc・返信先の replyTo・HTML の本文の htmlBody・添付ファイルの attachments などを指定できます。件名は 250 文字までです。
MailApp.getRemainingDailyQuota() は、その日にあと何人へ送れるかを返す関数です (公式リファレンス)。上限に届いたら送らずに止め、残りの行は D 列が空のまま残るので、翌日にもう一度実行すれば続きから送れます。
実行して動きを確かめる
宛先を自分だけにして試す
最初は送信リストの 2 行目に自分のメールアドレスだけを入れ、届いたメールの宛名と本文の改行を確かめます。
関数を選んで実行する
Apps Script の画面の上部で
sendMailsを選び、[実行] を押します。初回だけアクセスを許可する
初めて実行すると、Gmail とスプレッドシートへのアクセスの許可を求める画面が出ます。自分のアカウントを選んで許可します。
GmailAppはメールの送信にhttps://mail.google.com/の権限を使います。D 列と送信済みフォルダを確かめる
D 列に「送信済み」と日時が入り、Gmail の送信済みフォルダにメールが残っていれば成功です。確認できたら本番の宛先を並べて実行します。
送る前に下書きで確かめる
宛先が多いと、本文の誤字や差し込みのずれに送ったあとで気づいても取り消せません。最初の数回は、送信ではなく Gmail の下書きを作る形にしておくと安心です。
先ほどのコードの GmailApp.sendEmail の行を、次のように GmailApp.createDraft に置き換えます。引数の形は同じです。
GmailApp.createDraft(email, SUBJECT, body, { name: SENDER_NAME });
公式リファレンスによると、createDraft は送信せずに下書きのメールを作る関数で、sendEmail と同じオプションを指定できます。実行すると Gmail の下書きフォルダに相手ごとのメールが並ぶので、何通か開いて宛名と本文を確かめ、問題なければ下書きから送ります。
sendEmail
- 実行するとすぐ送られる
- 送ったあとは取り消せない
- 慣れて内容が固まったら使う
createDraft
- 下書きフォルダに作るだけ
- 目で確かめてから送れる
- 初回や宛先が多いときに向く
下書きの形にするときは、D 列に書き込む文字を「下書き作成済み」に変えておくと、送ったものと区別できます。
HTMLメールや添付ファイルを付けて送る
sendEmail の 4 番目の引数 (オプション) を足すと、文字の太さや色を付けた HTML のメールや、ファイルを添付したメールも一斉に送れます。
const pdf = DriveApp.getFileById("添付するファイルのID").getBlob();
GmailApp.sendEmail(email, SUBJECT, body, {
name: SENDER_NAME,
htmlBody: `<p>${company}<br>${name} 様</p><p><b>11月の定例会</b>のご案内です。</p>`,
attachments: [pdf],
});
sendEmail で指定できる主なオプション
| オプション | できること |
|---|---|
name | 差出人として表示する名前 |
cc / bcc | CC・BCC の宛先 (カンマ区切り) |
replyTo | 返信先のアドレス |
htmlBody | HTML の本文。HTML を表示できるメールソフトでは body の代わりに使われる |
attachments | 添付するファイルの配列 |
from | 送信元のアドレス。getAliases() が返すアドレスだけ使える |
noReply | 返信不可の汎用アドレスから送る。Google Workspace のアカウントだけで使える |
htmlBody を指定しても、3 番目の引数の body は省けません。HTML を表示できない環境ではこちらが出るので、同じ内容の文章を入れておきます。
毎日決まった時刻に自動で送る
毎朝の連絡や、リストに追加された相手へ定期的に送る用途なら、時間主導型のトリガーを付けると手で実行しなくても送られます。公式ガイドの手順は次のとおりです。
- Apps Script の画面の左側で [トリガー] (時計のアイコン) を開く
- 右下の [トリガーを追加] を押す
- 実行する関数に
sendMails、イベントのソースに「時間主導型」を選び、日付ベースのタイマーと時刻を選ぶ - [保存] を押す
時刻は分単位では決まりません。公式ガイドによると、たとえば 9 時に設定すると 9 時から 10 時の間で実行の時刻が選ばれ、以後は毎日その時刻に動きます。「9 時ちょうどに届けたい」用途には向かないので、時間帯で指定するものと考えてください。
送信数の上限と注意点
GAS から送れるメールの数には 1 日の上限があります。上限は宛先の人数で数えるので、1 通に 3 人を入れれば 3 と数えます。
1 日に送れるメールの宛先の数
公式の割り当ての一覧では、ほかにも次の上限が決まっています。
自動送信で気にしたい上限
| 項目 | 個人のアカウント | Google Workspace |
|---|---|---|
| 1 日に送れる宛先の数 | 100 | 1,500 |
| 1 回の実行時間 | 6 分 | 6 分 |
| トリガーの合計実行時間 (1 日) | 90 分 | 6 時間 |
| 1 つのスクリプトのトリガーの数 | 20 | 20 |
数百件を超える一斉配信や、開封率の計測が必要なメールマガジンには、GAS より専用の配信サービスが向いています。GAS は、取引先への案内や社内の通知のように、相手が決まっていて数が限られるメールに使うのが現実的です。
また、送信は自分の Gmail アカウントから行われます。退職や異動でアカウントが止まるとトリガーも動かなくなるため、業務で使うなら共用のアカウントで作っておくと引き継ぎが楽です。
自分で作るのが難しいときは
ここで紹介したコードは、宛名を差し込んで送るだけの最小の形です。実際の業務では「添付ファイルを相手ごとに変えたい」「フォームの回答が来たらすぐ返信したい」「送る前に上長の承認を挟みたい」といった条件が加わり、作り込むほど手間がかかります。
自分で直すのが難しい、止まったときに直せる人が社内にいない、という場合は、作る部分だけを外部に任せるのも一つの方法です。シートナビでは、GAS での自動化やスプレッドシートで回している業務の作り直しの相談を受け付けています。お困りのときは相談フォームからお気軽にご連絡ください。
よくある質問
GmailApp と MailApp はどちらを使えばよいですか?
どちらもメールを送れます。GmailApp は Gmail の受信トレイの検索やラベルの操作もできる分、Gmail 全体へのアクセスの許可を求めます。メールを送るだけなら MailApp.sendEmail でも同じ形で書け、公式リファレンスによると求める権限もメールの送信 (script.send_mail) だけになります。この記事のコードは GmailApp.sendEmail を MailApp.sendEmail に書き換えても動きます。
1 日の上限より多い宛先に一斉送信したいときは?
この記事のコードは MailApp.getRemainingDailyQuota() で残りの数を確かめ、上限に届いたらそれ以上送りません。送れなかった行は D 列が空のまま残るので、翌日に同じ関数を実行するか、毎日のトリガーを付けておけば、数日に分けて続きから送れます。
送信元のアドレスを別のアドレスにできますか?
from のオプションで変えられますが、指定できるのは Gmail の設定で「別のアドレスからメールを送信する」に登録済みのアドレスだけです。公式リファレンスでは、GmailApp.getAliases() が返すアドレスのどれかである必要があると説明されています。


