GASでメールを自動送信する方法
MailAppとGmailAppの使い分け

GAS(Google Apps Script。Googleサービスを自動化するスクリプト)を使えば、問い合わせ返信や請求書送付を自動化できます。 最小限のコードで送れるMailAppと、下書き・返信まで扱えるGmailAppの使い分けを、動くコードで解説します。

|対象: GAS / メール送信 / 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開発をご相談いただけます。

GAS開発の対応範囲を見る