【GAS】Gmailを使って宛先ごとに内容を変えてメール一斉送信

メンバーごとにIDなど各々異なる内容をメールで通知したい場合、数百名もいると人力では大変ですし送信ミスも起きてしまいがちです。

そこでGASを使えば、ドキュメントにテンプレートを作っておき、スプレッドシートにメールアドレスとそれぞれに送る内容を入力しておけば、それをGmailで一斉送信することができます。

Google Apps Scriptを使ってGmailでメルマガみたいに一斉送信する方法

こちらの記事を主に参考にしました。

スポンサーリンク

スプレッドシートとドキュメントの準備

シチュエーションとしては、キャプテンの赤木くんが各メンバーに背番号を伝えるというものです。

他のメンバーはどうしたとスラムダンクファンから怒られそうですが、動作確認さえできればいいので気にしないでください。

メールアドレスはサンプル用に作ったものでこの投稿がアップされている頃にはもう使えません。

ドキュメントにテンプレートを作ります。

{名前}と{背番号}のところは、スプレッドシートの名前列と背番号列のデータが入り、これらは宛先となるメールアドレスによって内容が異なります。

そして実際に届いたメールがこちら。名前と背番号のところがスプレッドシートに入力した通りの内容になっています。

他のメールアドレスについても、それぞれ対応した名前と背番号が入力された状態で届いていました。

送信が成功していれば送信チェック列に1が入力されます。

これは後述する1日の送信上限回数に関連します。

プログラミング (GAS)

function sendMail() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const lastRow = sheet.getLastRow();
  const values = sheet.getRange(1, 1, lastRow, 4).getValues();
  const doc = DocumentApp.openById('******'); //ドキュメントIDを入力
  const docText = doc.getBody().getText();
  const subject = '背番号のお知らせ';        //メールの件名
  const fromName = '赤木 剛憲';            //送信者
  const options = {name: fromName};

  for(let i=1; i<values.length; i++){
    if(values[i][3]!=1){
      const mailAddress = values[i][0];     //メールアドレス
      const memberName = values[i][1];      //名前
      const uniformNumber = values[i][2];   //背番号
      const body = docText
        .replace('{'+values[0][1]+'}', memberName)
        .replace('{'+values[0][2]+'}', uniformNumber);
      GmailApp.sendEmail(mailAddress, subject, body, options);
      sheet.getRange(i+1, 4).setValue(1);   //送信チェックに入力
      Logger.log(i);
    }
  }
}

4行目では二次元配列に格納する範囲を指定しています。第4引数は列の数だけ指定する必要があります。

5行目のドキュメントIDは、テンプレートを作成したドキュメントのURLにあるID(ハッシュ化されてる部分)を入れれば、そのドキュメントを参照しにいきます。

19行目は送信チェックの値を確認し、1が入力されている場合は送信済みということで送信処理を行いません。1ではない場合は未送信として、送信処理を行い27行目で送信チェックに1を入力します。

24・25行目は、テンプレートのドキュメントに入力されている{名前}と{背番号}を、スプレッドシートに入力された値に置換しています。置換対象となるワードはスプレッドシートの1行目の値を使って指定しています。

1日の上限回数について

GASのメール送信は実行上限に注意!残り回数確認と上限以上のメールを送る方法

こんな便利な機能が無制限に使えるはずがなく、無料のGoogleアカウントの場合だと100件までしか送れません。GWSだと1500件までいけます。

宛先が100件以上ある場合だと何日かに分けて送ることになるのですが、どの宛先に送ったかどうかを記憶するのが面倒くさいので、送信チェックの列を設けました。

これで日をまたいで実行すれば送信チェックに1が入力されていないところから送信が行われます。

送信可能の残数をチェックするには下記のスクリプトを実行します。

function mailCount() {
  Logger.log(MailApp.getRemainingDailyQuota());
}

エイリアスを使って送信元を任意のメールアドレスにする

このスクリプトを実行したアカウントのGmailから送信されるのですが、見知らぬGmailから送られてくると不審です。

企業等のドメインから送るにはエイリアスを登録して、送信元のメールアドレスを指定する必要があります。

Gmailの設定から、アカウントとインポート→名前の項目で「他のメールアドレスを追加」をクリック。

送信者の名前と任意のドメインで作成したメールアドレスを入れます。

SMTPサーバーは、今回登録するメールアドレスを管理するメールサーバーのものを入力します。

ユーザー名はメールアドレス、そのメールアドレスにログインするためのパスワードを入力します。

これで画面を進めると認証の画面になります。このメールアドレス宛に認証コードが届くので、それを入力すればOK。

できました。一応デフォルトにしていますが、エイリアスが登録されていればデフォルトにする必要もたぶんないです。

プログラミング (GAS)

こちらの記事を参考にしています。

function sendMail() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const lastRow = sheet.getLastRow();
  const values = sheet.getRange(1, 1, lastRow, 4).getValues();
  const doc = DocumentApp.openById('******'); //ドキュメントIDを入力
  const docText = doc.getBody().getText();
  const subject = '背番号のお知らせ';        //メールの件名

  // エイリアスの設定
  const fromAddress = '****@example.com';  //送信メールアドレス
  const fromName = '赤木 剛憲';            //送信者
  const aliases = GmailApp.getAliases();
  if(aliases.indexOf(fromAddress) === -1) {
    return;
  }
  const options = {from: fromAddress, name: fromName};

  for(let i=1; i<values.length; i++){
    if(values[i][3]!=1){
      const mailAddress = values[i][0];     //メールアドレス
      const memberName = values[i][1];      //名前
      const uniformNumber = values[i][2];   //背番号
      const body = docText
        .replace('{'+values[0][1]+'}', memberName)
        .replace('{'+values[0][2]+'}', uniformNumber);
      GmailApp.sendEmail(mailAddress, subject, body, options);
      sheet.getRange(i+1, 4).setValue(1);   //送信チェックに入力
      Logger.log(i);
    }
  }
}

9~16行目が主な変更点です。

fromAddressに作成したエイリアスのメールアドレスを入力します。

12~15行目は、エイリアスが存在するかを判定して、無い場合は処理を中止するというもの。

16行目のoptionsのfromにfromAddressを指定します。

任意のメールアドレスから送信されました。これで良さげです。

コメント

  1. 由香里 より:

    コメント失礼します。
    他のアドレスを追加して複数アカウントからGASで一斉送信した場合、一日100件以上送信できるのでしょうか?
    たとえば、AさんとBさんがそれぞれab.co.jpというアドレスを自身のgmailアカウントに追加して、GASを利用して送信した場合、合わせて200件送信することはできますか?

    • しめひつ より:

      試したことはありませんが、アカウントに対して100件ですので、複数のアカウントを用意すれば可能かと思います。

  2. 由香里 より:

    ありがとうございます。
    今度試してみます^ – ^

  3. GAS初心者 より:

    はじめまして、
    大変参考になる記事を投稿いただき、ありがとうございます。

    一点お教えいただきたいのですが、「エイリアスを使用して送信元アドレスを指定して送信する」所だけ上手くできません。

    下記【****@example.com】の部分をgmail以外の送信したいアドレスに変更するという認識で合ってますでしょうか?

    // エイリアスの設定
    const fromAddress = ‘****@example.com’; //送信メールアドレス
    const fromName = ‘赤木 剛憲’; //送信者

    上記で正しい場合なのですが、スクリプトを実行してもエラーにならず、完了しますが、一向に受信できない状態です。(迷惑メールにもなし)

    gmailからエイリアス設定したアドレスを送信元にして送付した場合は問題なく受信できたので、エイリアスの設定は問題なく済んでいると思われます。

    色々と調べましたが、解決できなかったので解消方法等があれば、ご教授いただきたいです。
    よろしくお願いいたします。

    • しめひつ より:

      どこが原因で処理ができていないのかを切り分けて確認する必要があるのですが、エイリアスの設定がうまくいっていないのであれば、記事の本文にもある通り12~15行目でエイリアスが存在するかどうかの判定で処理を中止していることが考えられます。
      14行目のreturnの直前にconsole.logなどで分岐がどうなっているかを確認するとよいかと思います。
      また、エイリアスの設定なしでの実行時は送信はできますか? スプレッドシート上で宛先を取得できていない場合はエイリアスの設定ができていても送信処理は行われずに終了します。

      • GAS初心者 より:

        ご返事ありがとうございます。

        記事内容等を読み返したり、色々試した結果なのですが、エイリアスなしで実行した後にそのまま送信チェックに1が入力されたまま、エイリアスありにコードを追記して実行していたため、メールが飛んでなかったようでした。

        お騒がせいたしました。

コメントする前にお読みください

迷惑コメント防止のために初回のコメント投稿は承認制のため、投稿が反映されるまで少し時間がかかります。もちろん荒らしは承認しません。

教えて君やクレクレ君に対しては回答しませんのでご了承ください。