[GAS]Googleスプレッドシートのメールアドレスリストへメール一斉送信

Google Apps Script メール一斉送信 GAS

Google Apps Scriptで、Googleスプレッドシート上のアドレスと名前のリストへ、メールを個別に一斉送信する方法です。スクリプトが分からない初心者でも簡単にできるよう丁寧に解説します。

困っている人
困っている人

相手の名前を本文に組み込んで、メールを一気に送りたいのですが楽な方法はありませんか?

シップ
シップ

GASを使えばメールアドレスのリストへ個別に宛先や名前を変えて一斉送信できますよ。

概要

手元にはメールアドレスと名前のリストがあり、宛先と本文中の宛名部分だけを変えて一斉配信したいときに役立つスクリプトです。Google Apps Scriptを利用するため、すべて無料で実現できます。

必要なもの
  • 名前とメールアドレスをリスト化したGoogleスプレッドシート
  • 件名をファイル名にし、本文を記入したGoogleドキュメント

サイドバーに表示したフォームで件名や本文を指定したり、添付ファイルを送信できるもう少し豪華なバージョンはこちら

Googleドキュメントでメールの件名と本文を用意

  1. Googleドキュメントを新規作成します。
  2. 「無題のドキュメント」という名前を変更して件名を入力します。
  3. メールの本文として送信したい内容を文章中に入力します。

件名や宛先の中で実際の名前に置き換えて送信したい部分を{name}で記入しておきます。

件名と本文をGoogleドキュメントで作成した例

Googleスプレッドシートで名前とメールアドレスのリストを用意

  1. Googleスプレッドシートを作成します。
  2. 1列目は項目名として、A1セルに「名前」、B1セルに「メールアドレス」とします。
  3. 2行目から実際のデータを記入していきます。
    1. A列に送信先の名前、B列にメールアドレスを入力します。

Googleスプレッドシートにスクリプトを追加

  1. メニューの「ツール」→「スクリプトエディタ」からApps Scriptを開きます。
  2. コード.gsを選択し(最初から選択されています)最初から入力されている関数は消して、次のコードをコピペします。
var googleDocs = 'ここにURLを入力'; //メール本文を記入したGoogleドキュメントのURLかID

var sheetIndex = [
  "name","mail"
]; //リストの列順番

//送信者名を表示させたい場合は記入
var senderName = '';

//送信元メールアドレスを変更する場合は記入
//記入したアドレスは実行するGoogleアカウントのエイリアスとして設定されている必要があります
var senderMail = '';


//スプレッドシート起動時に実行(メニューの登録)
function onOpen() {
  SpreadsheetApp
    .getActiveSpreadsheet()
    .addMenu('メール', [
      {name: '一斉送信', functionName: 'sendMail'},
    ]);
}

//メール送信
function sendMail(){
  var docId = getDocIdFromUrl(googleDocs);  //GoogleDocsURLからDocIDを取得
  if(docId==null || docId==""){  //ドキュメントIDが記入されていなければ
    SpreadsheetApp.getActiveSpreadsheet().toast('メール本文を記入したGoogleドキュメントのURLをスクリプトのgoogleDocs変数へ記入してください', 'エラー', 3);
    return
  }

  var doc = DocumentApp.openById(docId);  //ドキュメントIDからドキュメントを取得
  if(doc==null){
    SpreadsheetApp.getActiveSpreadsheet().toast('Googleドキュメントが見つかりません。', 'エラー', 3);
    return
  }

  var subject = doc.getName();  //ドキュメントの名前を件名として取得
  var body = doc.getBody().getText(); //ドキュメント本文テキストをメール本文として取得

  if(subject==""){  //件名に記入がない場合エラー
    SpreadsheetApp.getActiveSpreadsheet().toast('ドキュメントの名前に件名を入力してください。', 'エラー', 3);
    return
  }
  if(body==""){ //本文の記入がない場合エラー
    SpreadsheetApp.getActiveSpreadsheet().toast('ドキュメントに本文を入力してください', 'エラー', 3);
    return
  }

  //送信元メールアドレスが、メールエイリアスとして登録されているかチェック
  if(senderMail!=""){
    let aliases = GmailApp.getAliases();
    if(aliases.indexOf(senderMail) === -1 && Session.getActiveUser().getUserLoginId() != senderMail) {
      SpreadsheetApp.getActiveSpreadsheet().toast('送信元メールアドレス'+senderMail+'はメールエイリアスとして設定されていません。', 'エラー', 3);
      return;
    }
  }
  
  var regexp = /^[A-Za-z0-9]{1}[A-Za-z0-9_.-]*@{1}[A-Za-z0-9_.-]{1,}\.[A-Za-z0-9]{1,}$/; //メールアドレスの正規表現
  var mySheet = SpreadsheetApp.getActiveSheet();  //アクティブシートを取得
  var selectedRow = mySheet.getRange(2, 1, mySheet.getLastRow() - 1, sheetIndex.length ).getValues(); //アクティブな行全体を取得
  var sended = [];  //送信済みリスト
  var errors = [];  //エラーリスト
  for(var i=0; i<selectedRow.length; i++){
    if(selectedRow[i][getsheetIndex("mail")]!="" && selectedRow[i][getsheetIndex("name")]!="" ){  //名前とメールアドレスが記入されていれば
      var subj = subject.replace(/{name}/gi,selectedRow[i][getsheetIndex("name")]); //件名中の{name}を実際の名前に置き換える
      var message = body.replace(/{name}/gi,selectedRow[i][getsheetIndex("name")]); //本文中の{name}を実際の名前に置き換える
      var mail = selectedRow[i][getsheetIndex("mail")].trim();  //メールアドレスの前後から余計な空白を取り除く
      if(regexp.test(mail)){  //メールアドレスの形式が正しいことをチェックして送信先リストへ追加
        mailData = {
          "mail" : selectedRow[i][getsheetIndex("name")]+" <"+mail+">",
          "subject": subj,
          "body" : message,
        }
        sended.push(mailData);
      }else{
        errors.push(selectedRow[i][getsheetIndex("name")]); //メールアドレスの形式が正しくない場合はエラーリストへ追加
      }
    }
  }

  if(errors.length > 0){  //正しくないメールアドレスが含まれていた場合
    SpreadsheetApp.getActiveSpreadsheet().toast('次のメールアドレスが正しくありません:'+errors.join(','), 'エラー', 5);
    console.log('次のメールアドレスが正しくありません:'+errors.join(','));
  }

  if(sended.length > MailApp.getRemainingDailyQuota()){ //送信予定数が残りの一日の送信可能数を超える場合
    SpreadsheetApp.getActiveSpreadsheet().toast('一日の送信可能数を超えるため送信できません。本日残り可能送信数:'+MailApp.getRemainingDailyQuota(), 'エラー', 5);
    return
  }

  if(sended.length > 0){  //送信するメールがあれば
      SpreadsheetApp.getActiveSpreadsheet().toast(sended.length+"件のメールを送信中です・・", '処理中', 0);
  }

  for(var i=0; i<sended.length; i++){ //送信先リストからメール送信
    var options = {}
    if(senderMail!=""){
      options["from"] = senderMail;
    }
    if(senderName!=""){
      options["name"] = senderName;
    }
    GmailApp.sendEmail(sended[i]["mail"], sended[i]["subject"], sended[i]["body"], options); //Gmail送信
  }
  
  if(sended.length > 0){  //送信したメールがあれば
    SpreadsheetApp.getActiveSpreadsheet().toast(sended.length+"件のメールを送信しました。本日残り可能送信数:"+MailApp.getRemainingDailyQuota(), '成功', 3);
    console.log('次にメールを送信しました。:');
    for(var i=0; i<sended.length; i++){
      console.log(sended[i]["mail"]);
    }
  }else{
    SpreadsheetApp.getActiveSpreadsheet().toast("送信先がありません。", 'エラー', 3);
  }
}

//URLからDocIDを返す
function getDocIdFromUrl(googleDocs){
  if(googleDocs.indexOf('/')==-1){
    return googleDocs;
  }
  var regexp = /d\/([^\/]+)/i;
  var found = googleDocs.match(regexp);
  if(found){
    return found[1];
  }
  return null;
}
//カラムインデックスを返す row: カラム名
function getsheetIndex(row){
  return sheetIndex.indexOf(row)
}
  1. 一行目に、先ほどメール本文を入力したGoogleドキュメントのURLを記入します。
//「ここにURLを入力」の部分を消して、URLに置き換えます。シングルコーテーションは消さないように注意してください。
var googleDocs = 'ここにURLを入力';

//例えばURLが「https://script.google.com/home/projects/8ZDJDqJjb8g6FZHQJGXblKEQ/edit」の場合、次のようになります。
var googleDocs = 'https://script.google.com/home/projects/8ZDJDqJjb8g6FZHQJGXblKEQ/edit';

4. 「無題のプロジェクト」という名前をわかりやすい名前に変更し、「プロジェクトを保存」ボタンをクリックしてスクリプトを保存します。

送信者名を変更する

送信者名を指定しないとメールアドレスが送信者名として表示されますが、名前で表示したい場合は下記の行を変更して送信者名を記入してください。

//この行を探します
var senderName = '';

//例として田中太郎を送信者名としたい場合
var senderName = '田中太郎';

送信者名を指定した場合としない場合の見え方の違い

使用するメーラーやメールサービスによって表示は異なりますが、送信者名を指定するとその名前が差出人として表示されたりアドレスと併記されるため、メールアドレスだけの場合より誰からのメールなのか分かりやすくなります。

送信元メールアドレスを変更したい場合

送信元メールアドレスは後ほど説明するスクリプト実行者のGmailアドレスとなりますが、Gmailの設定でメールエイリアスの設定がされている場合は、その別のアドレスに設定することができます。

//この行を探して変更します。
var senderMail = '';

//送信元メールアドレスを「sender@example.com」にしたい場合
var senderMail = 'sender@example.com';

勝手に人のメールアドレスを名乗れないように、Gmailでメールエイリアスの設定がなされているアドレスのみ送信元メールアドレスに設定できます。

メールエイリアスの追加はGmailの設定画面で「アカウントとインポート」タブを開き、
名前:の欄の「他のメール アドレスを追加」リンクから、送信元として使用したい別のメールアドレスを追加してください。

スクリプトの実行

  1. Googleスプレッドシートを再読み込みします。
  2. メニューに「メール」が追加されているので、「メール」→「一斉送信」をクリックします。
  3. 初回の場合はスクリプトにGoogleアカウントへのアクセスを許可する操作を行います。

初回のアクセス許可

1.「承認が必要」のダイアログで「続行」をクリックします。

2.「アカウントの選択」で、送信元メールアドレスのGoogleアカウントを選択します。リストにない場合は「別のアカウントを使用」より送信元メールアドレスのGoogleアカウントでログインを行ってください。

3.「このアプリはGoogleで確認されていません」と表示が出るので、「詳細」をクリックし、「(先ほど指定したプロジェクト名)に移動」をクリックします。

4.「(プロジェクト名)がGoogleアカウントへのアクセスをリクエストしています」と表示されるので「許可」をクリックします。

5.許可が完了したら再度「メール」→「一斉送信」よりメール送信を行ってください。

実行時に表示されるメッセージ

〇件のメールを送信中です・・・

メール送信が開始されるときに表示されます。

〇件のメールを送信しました。本日残り可能送信数:〇

メール送信が完了した際に表示されます。実際に送信したメール内容はGmailを開いて送信済みフォルダから確認できます。

エラーメッセージが表示される場合

送信元メールアドレス〇〇はメールエイリアスとして設定されていません。

指定した送信元メールアドレスがメールエイリアスとして設定されていない場合に表示されます。スクリプトを実行しているGoogleアカウントのGmailのメールエイリアスに、送信元メールアドレスを追加してください。

次のメールアドレスが正しくありません:メールアドレス

送信先リストに含まれるメールアドレスの形式が正しくない場合に表示されます。リストの中のメールアドレスをご確認ください。

一日の送信可能数を超えるため送信できません。本日残り可能送信数:〇〇

GASからのGmail送信には、アカウントごとに1日当たり100通までという制限があります。そのため、送信しようとしているメールの通数が、その日の残り可能送信数を超えている場合は1通も送信せずこのメッセージが表示されます。

送信先リストが残り可能送信数以下になるようにシートを分割してから再度お試しください。リストが100を超える場合は最初から送信できないため、100以内にしてからお試しください。

送信先がありません。

シート中に有効な送信先メールアドレスがない場合に表示されます。シートを確認し、A列に名前、B列にメールアドレスが記載されているかお確かめください。

Exception: 無効なメール:

メールアドレスがRFC 5321に準拠していない形式の場合Gmailでは送信できません。

宛先欄(To:)の敬称

宛名欄(いわゆるTo:)は「名前 <メールアドレス>」の形で送信されますが、場合によってはメールアドレスのみにしたいとか、「名前+敬称 <メールアドレス>」などに変更したい場合があるかもしれません。

スクリプトの71行目を変更することでTo:欄を変更できます。

"mail" : selectedRow[i][getsheetIndex("name")]+" <"+mail+">",

宛先の名前 <メールアドレス>

デフォルトでこの形で送信されます。

メールアドレスのみにする

"mail" : mail,

名前+敬称 <メールアドレス> の形にする

例えば「様」をつけたい場合は次のようにします。

"mail" : selectedRow[i][getsheetIndex("name")]+"様 <"+mail+">",

その他

使い方や設定方法が分からない場合などはお問い合わせください。カスタマイズが必要な場合もお問い合わせください。お見積りさせていただきます。

この記事を書いた人

PHPが好物な個人開発プログラマ。フリーランスエンジニアとしてWebサービス作ったりしてます。15年の経験を生かしてMENTAでメンターもやってます。WordPressやPHPでお困りのことがあればご相談に乗りますのでDMください。

Follow on SNS
GAS
SOHO MIND

Comments

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