GASでメールを自動送信する方法
MailAppとGmailAppの使い分け
GAS(Google Apps Script。Googleサービスを自動化するスクリプト)を使えば、問い合わせ返信や請求書送付を自動化できます。 最小限のコードで送れるMailAppと、下書き・返信まで扱えるGmailAppの使い分けを、動くコードで解説します。
Table of Contents
MailAppとGmailAppの違い
GASでメールを送る方法は主に2つあります。まずはどちらを使うかを整理しておきましょう。
MailApp(送信専用)
メールを送るだけの機能に絞ったサービス。宛先・件名・本文を渡すだけで送れ、必要な権限も「送信」のみと最小限。通知や自動返信ならこれで十分。
GmailApp(Gmail全般)
送信に加えて、下書き作成・受信検索・スレッド返信・ラベル付けなどGmailの操作全般ができる。その分、メールの読み取り権限も要求される。
送信の書き方(引数の並び)はほぼ共通です。まずは権限が少なくて済むMailAppから始め、下書きや返信が必要になった時点でGmailAppに切り替えるのがおすすめです。
MailApp.sendEmailで基本のメールを送る
一番シンプルな形はMailApp.sendEmail(宛先, 件名, 本文)の3つを渡すだけです。差出人はスクリプトを実行しているGoogleアカウント本人になります。改行は\nで入れます。
function sendBasicMail() {
const to = "customer@example.com";
const subject = "【Lustage】お問い合わせありがとうございます";
const body =
"この度はお問い合わせいただき、ありがとうございます。\n" +
"担当者より2営業日以内にご連絡いたします。";
MailApp.sendEmail(to, subject, body);
}初回実行時は「メールを送信する」権限の承認を求められます。承認すると、そのアカウントから実際にメールが送られます。
表示名・CC・返信先・HTMLメールを指定する
第4引数にオプションのオブジェクトを渡すと、差出人の表示名(name)、CC・BCC、返信先(replyTo)、装飾つきのhtmlBodyなどを細かく指定できます。
function sendHtmlMail() {
const to = "customer@example.com";
const subject = "【Lustage】ご案内";
MailApp.sendEmail(to, subject, "", {
name: "Lustage サポート窓口", // 差出人の表示名
cc: "sales@example.com", // カンマ区切りで複数指定可
replyTo: "support@example.com", // 返信先を分けたいとき
// HTMLを表示できない環境向けにテキスト版も添える
body: "詳細はメール本文(HTML)をご覧ください。",
htmlBody:
"<p>いつもお世話になっております。</p>" +
"<p>詳しくは<a href='https://example.com'>こちらのページ</a>をご覧ください。</p>",
});
}htmlBodyを指定するとメール本文はHTML版が優先表示されます。ただしHTMLを表示できないメール環境もあるため、テキスト版のbodyも一緒に渡しておくと安全です。
添付ファイルを付けて送る
添付ファイルはオプションのattachmentsに「Blob(ファイルの中身を表すデータのかたまり)」の配列を渡します。Googleドライブのファイルをそのまま添付したり、その場で作ったCSVを添付したりできます。
function sendMailWithAttachment() {
// Googleドライブのファイルを添付する
const file = DriveApp.getFileById("ここにファイルID");
// その場でテキストファイルを作って添付することもできる
const csv = Utilities.newBlob("氏名,金額\n山田,1000", "text/csv", "明細.csv");
MailApp.sendEmail("customer@example.com", "請求書の送付", "ご確認ください。", {
attachments: [file.getAs("application/pdf"), csv],
});
}スプレッドシートをPDF化して添付する具体的な手順は、スプレッドシートをPDF化してGmailで送る方法でも詳しく解説しています。
スプレッドシートから差し込みで一括送信する
宛先リストをスプレッドシートで管理すれば、1行1通の差し込みメールを一括送信できます。ポイントは「送信済み」の列を用意し、送れた行にだけ日時を書き込むことです。これでトリガーが重なっても二重送信を防げます。
function sendBulkFromSheet() {
const sheet = SpreadsheetApp.getActive().getSheetByName("送信リスト");
const data = sheet.getDataRange().getValues();
// 想定ヘッダー: A:氏名 B:メール C:本文 D:送信済み(日時)
for (let i = 1; i < data.length; i++) {
const row = data[i];
const name = row[0];
const email = row[1];
const message = row[2];
const sentAt = row[3];
if (!email || sentAt) continue; // 宛先なし・送信済みはスキップ
try {
MailApp.sendEmail(email, "【Lustage】ご案内", "", {
name: "Lustage",
htmlBody: name + " 様<br><br>" + message,
});
// 送信できた行にだけ日時を書き込む(二重送信防止)
sheet.getRange(i + 1, 4).setValue(new Date());
} catch (e) {
sheet.getRange(i + 1, 4).setValue("エラー: " + e.message);
}
}
}送信は1件ずつtry-catchで囲みます。1通の失敗で全体が止まらず、失敗した行だけをあとから追いかけられます。
1日の送信数上限(クォータ)に注意する
GASからのメール送信には1日あたりの上限(クォータ)があります。目安は無料のGmailで約100通、Google Workspaceの有料アカウントで約1,500通です。上限を超えると送信でエラーになります。
残り送信可能数はMailApp.getRemainingDailyQuota()で取得できます。大量送信の前にこの値を確認し、足りなければ送信を止める作りにしておきましょう。
function sendWithQuotaCheck(recipients) {
// 本日あと何通送れるかを確認する
const remaining = MailApp.getRemainingDailyQuota();
Logger.log("本日の残り送信可能数: " + remaining);
if (remaining < recipients.length) {
// 上限を超えそうなら送らず、通知だけ残す
Logger.log("送信数が上限に近いため中断しました。");
return;
}
recipients.forEach((to) => {
MailApp.sendEmail(to, "お知らせ", "本文です。");
});
}GmailAppで下書き作成・返信をする
「自動で送るのは不安。内容を人が確認してから送りたい」という場合は、GmailApp.createDraft()で下書きだけを作れます。受信メールへの返信もreply()で可能です。これらは送信専用のMailAppにはなく、GmailApp特有の機能です。
function createDraftForReview() {
// 送信せず下書きだけ作る(人が確認してから送る運用に)
GmailApp.createDraft("customer@example.com", "見積書の送付", "", {
htmlBody: "<p>お世話になっております。見積書を添付いたします。</p>",
});
}
function replyToLatestThread() {
// 特定の受信メールに返信する
const threads = GmailApp.search("subject:お問い合わせ is:unread", 0, 1);
if (threads.length === 0) return;
threads[0].reply("お問い合わせありがとうございます。確認いたします。");
}トリガーで定期送信を自動化する
毎朝のリマインドや月初の請求案内など、決まったタイミングで送るなら時間主導トリガーを使います。差し込み送信の関数を毎朝9時台に呼び出す例です。
function createDailyMailTrigger() {
ScriptApp.newTrigger("sendBulkFromSheet")
.timeBased()
.everyDays(1)
.atHour(9) // 毎朝9時台に実行
.create();
}トリガーの作成・削除をコードで管理する方法は、トリガーをコードで作成・削除・管理する方法で詳しく解説しています。
実務での注意点
1. テスト送信は自分宛てで行う
差し込み送信は一度実行すると取り消せません。宛先列を一時的に自分のアドレスに置き換えるか、少数の行に絞ってテストしてから本番のリストに向けましょう。
2. 差出人は「本人のアドレス」になる
任意の他人のアドレスを差出人にはできません。表示名はnameで変えられますが、送信元アカウントは実行者本人です。共用アドレスから送りたい場合は、その専用アカウントでスクリプトを持たせます。
3. 大量送信は迷惑メール扱いに注意
一斉配信は受信側でスパム判定されやすくなります。本文に配信停止の案内を入れる、宛先を絞る、送信間隔を空けるなど、届けたい相手にだけ丁寧に送る設計を心がけましょう。
まとめ
GASのメール送信は、送るだけならMailApp.sendEmailの3引数だけで始められます。オプションでHTML・CC・添付を足し、スプレッドシートの差し込みと「送信済み」フラグで二重送信を防ぎ、クォータ確認とトリガーを組み合わせれば、問い合わせ返信や請求案内を安全に自動化できます。下書きや返信が必要になったらGmailAppに切り替えましょう。
よくある質問
単純にメールを送るだけならMailAppで十分です。MailApp.sendEmailは宛先・件名・本文を渡すだけで送信でき、必要な権限も送信のみと最小限です。一方、下書きの作成や受信メールの検索、スレッドへの返信など送信以外のGmail操作が必要な場合はGmailAppを使います。GmailApp.sendEmailはMailAppとほぼ同じ書き方で送信もできます。
スクリプトを実行しているGoogleアカウント本人のアドレスが差出人になります。任意の他人のアドレスを勝手に差出人にすることはできません。組織(Google Workspace)で設定済みのエイリアスがあれば、GmailAppのsendEmailでfromオプションに指定して切り替えられます。表示名だけを変えたい場合はnameオプションを使います。
あります。無料のGmailアカウントは1日あたり約100通、Google Workspaceの有料アカウントは約1,500通が目安です。残り送信可能数はMailApp.getRemainingDailyQuota()で取得できます。大量送信の前にこの値をチェックし、上限に近づいたら送信を止める作りにしておくと安全です。
送れます。sendEmailの第4引数のオプションでhtmlBodyを指定すると、太字・色・リンク・表などを含むHTMLメールを送信できます。htmlBodyを指定した場合も、HTMLを表示できない環境向けにbody(プレーンテキスト)を一緒に渡しておくのがおすすめです。
スプレッドシートに「送信済み」の列を用意し、送信が成功した行にフラグや送信日時を書き込みます。次回実行時はそのフラグが立っている行をスキップすれば、トリガーが重なっても二重送信を防げます。送信とフラグ書き込みの間でエラーが起きないよう、1件ずつtry-catchで囲むのがポイントです。
GAS開発・業務Webシステムを
相談する。
メール自動送信のほか、フォーム連携・帳票のPDF出力・Gmail通知など、日々の業務を自動化するGAS開発をご相談いただけます。