【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を指定します。

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

コメント

タイトルとURLをコピーしました