【Gmail】宛先ごとに内容が異なるメールを一斉送信する方法(差し込みメール)

こんにちは。ichitamuです。

大勢に対して、微妙に内容が違うメールを一斉送信したいことってありますよね。

たとえば、一行目に ●●様 って入れたり。

もしくは、あなたのIDは●●です って入れたり。

自分も上記のような用途でメール一斉送信をする機会があったので、ツールを作ってみました。プログラミング未経験の人でもコピペでできるように説明しますので、参考になると幸いです。

*この記事を参考に作成されたツールによって問題が起きた場合でも、責任は負いかねます。メールのテスト送信などを行った上で、自己責任のもとご利用ください。

できあがるもの

Google スプレッドシートで作られた画面に、メールの内容を入力して、ボタンを押すと、メールが送信されるようにします。
利用者(メールを送る人)はGoogleアカウントを持っている必要があるので注意してください。

メールの内容を作ってSendMailボタンを押すと・・・
メールが一斉送信される。内容の一部は受信者ごとに変えることができる。

さっそく作っていこう

1.スプレッドシートを新規作成する

アプリボタン→ドライブの順にクリック
+新規 ボタン → Google スプレッドシート → 空白のスプレッドシート の順にクリック

2.スプレッドシートで入力画面を作る

Googleスプレッドシートの操作は直感的かつExcelと似ているので、説明は省略します。この画像のようなフォームを作ってみてください。

* 一言一句同じにする必要はありませんが、シート名行番号と列番号は必ず同じにしてください

main シート

シートの名前は main にしましょう

【項目リスト(上から順)】

  • あなた(発信者)のメールアドレス
  • あなた(発信者)の名前
  • メールタイトル(差込可能)
  • 本文(差込可能)
  • 添付ファイル

sashikomi シート

こちらは sashikomi というシート名にする

【項目リスト(左から順)】

  • 宛先メールアドレス
  • CCアドレス
  • BCCアドレス
  • 差込 $1
  • 差込 $2
  • 差込 $3
  • 差込 $4
  • 差込 $5

3.スクリプトを貼り付ける

「スクリプトエディタ」を起動して、スクリプトを作成します。

スクリプトの作成は、プログラミングの知識が必要なのですが、今回は私が用意したスクリプトをコピペでOKです。

ツール → スクリプトエディタ の順にクリック
赤枠で囲った部分(デフォルトのコード)を削除します
コードをまるごと貼り付けます

貼り付けるコードは以下のとおりです。
*2020.3.21 添付ファイル無しの場合にエラーにならないよう修正しました

function pushSendButton() {
    /* スプレッドシートのシートを取得と準備 */
    var ss = SpreadsheetApp.getActiveSpreadsheet();     //このスプレッドシート
    var mainSheet = ss.getSheetByName("main");          //メインシート
    var skSheet = ss.getSheetByName("sashikomi");       //差込シート
    var skEndRow = skSheet.getDataRange().getLastRow(); //シートの使用範囲のうち最終行を取得
    var count = skEndRow - 1;
    // 送信確認
    var select = Browser.msgBox("メールを一括送信します!", count + "件のメールを送信しますが、よろしいですか?", Browser.Buttons.OK_CANCEL);
    if (select == 'ok') {
        sendEmail();
    }
    if (select == 'cancel') {
        Browser.msgBox("送信をキャンセルしました");
    }
}

function sendEmail() {
    /* スプレッドシートのシートを取得と準備 */
    var ss = SpreadsheetApp.getActiveSpreadsheet();          // このファイル
    var mainSheet = ss.getSheetByName("main");               // メインシート
    var skSheet = ss.getSheetByName("sashikomi");            // 差込シート
    var skEndRow = skSheet.getDataRange().getLastRow();      // シートの使用範囲のうち最終行を取得
    var attachedFileId = mainSheet.getRange(7, 2).getValue(); // 添付ファイルのID

    /* メール基本データの設定 */
    var strFrom = mainSheet.getRange(3, 2).getValue();        // fromメールアドレス
    var strSender = mainSheet.getRange(4, 2).getValue();      // 差出人の名前
    var strSubject = mainSheet.getRange(5, 2).getValue();     // メールタイトル
    var strBody = mainSheet.getRange(6, 2).getValue();        // 本文
    if (attachedFileId) {
        var attachedFile = DriveApp.getFileById(attachedFileId); // 添付ファイル
    }

    var strSubjectIns = "";   // 差込後のメールタイトル
    var strBodyIns = "";      // 差込後のメール本文

    for (var i = 2; i <= skEndRow; i++) {
        // 差込シートの取得
        var strToEmail = skSheet.getRange(i, 1).getValue(); // 送信先メール
        var strCc = skSheet.getRange(i, 2).getValue();      // CC
        var strBcc = skSheet.getRange(i, 3).getValue();     // BCC
        var sk1 = skSheet.getRange(i, 4).getValue();        // 差込①
        var sk2 = skSheet.getRange(i, 5).getValue();        // 差込②
        var sk3 = skSheet.getRange(i, 6).getValue();        // 差込③
        var sk4 = skSheet.getRange(i, 7).getValue();        // 差込④
        var sk5 = skSheet.getRange(i, 8).getValue();        // 差込⑤

        // 差込を反映
        strSubjectIns = strSubject.replace(/\$1/g, sk1).replace(/\$2/g, sk2).replace(/\$3/g, sk3).replace(/\$4/g, sk4).replace(/\$5/g, sk5); //タイトル
        strBodyIns = strBody.replace(/\$1/g, sk1).replace(/\$2/g, sk2).replace(/\$3/g, sk3).replace(/\$4/g, sk4).replace(/\$5/g, sk5);       //本文

        /* メール送信 */
        if (attachedFileId) {
            // 添付ファイル有りの場合
            GmailApp.sendEmail(
                strToEmail,    //toアドレス
                strSubjectIns, //メールタイトル
                strBodyIns,    //本文
                {
                    cc: strCc,                //ccアドレス
                    bcc: strBcc,              //bccアドレス
                    from: strFrom,            //fromアドレス
                    name: strSender,          //差出人
                    attachments: attachedFile //添付ファイル
                }
            );
        } else {
            // 添付ファイル無しの場合
            GmailApp.sendEmail(
                strToEmail,    //toアドレス
                strSubjectIns, //メールタイトル
                strBodyIns,    //本文
                {
                    cc: strCc,               //ccアドレス
                    bcc: strBcc,             //bccアドレス
                    from: strFrom,           //fromアドレス
                    name: strSender,         //差出人
                }
            );
        }
    }
    Browser.msgBox("送信が完了しました。");
}

コードを貼り付けたら、保存ボタンを押して、スクリプトエディタを閉じます。

4.ボタンを作る

「挿入」→「図形描画」で図形作成画面が開きます。

直感的にボタンが作成できると思いますので、好きなようにデザインしてください。

ボタンが作れたら、右上の「保存して終了」を押します。

挿入 → 図形描画をクリックし、図形を作成する

ボタンを挿入したら、ボタンにスクリプトを割り当てます。

ボタン右上のメニュー → スクリプトを割り当て
pushSendButton を入力し、OK

これで、ボタンをクリックすると、メール一括送信スクリプトが起動するようになりました。

5.テストしてみよう

ここまでの工程で、ツールは完成しているので、送信テストをしてみます。

◇ sashikomi シートに宛先や差し込み文言を入力

受け取る人によって文言を変えたい場合は、その文言を差込 $1 ~ $5に入力します。

sashikomi シートはこんな感じで入力しました

◇ main シートにあなたのメールアドレスや、メールの内容を入力

差込部分(受信者によって内容が異なる部分)は $1 や $2 等と入力します。

今回の例だと、sashikomiシートの差込 $1受信者名が入っているので、メール本文の1行目は 「$1 さん」としています。こうすることで、1人目の受信者には「ジョン さん」、2人目の受信者には「キャシー さん」が表示されます。

main シートはこんな感じに入力。

ちなみに、ファイルを添付したい場合は、以下の手順を実施します。

  • Googleドライブにファイルをアップロード
  • 右クリックメニューの「共有可能なリンクを取得」をクリック
  • このツールの「添付ファイル」欄に貼り付け
  • 先頭の https://drive.google.com/open?id= を取り除く

ファイルを添付しない場合は、「添付ファイル」欄は空白にします。

Send Mail !! ボタンを押すと、スクリプト実行の承認ダイアログが出るので「続行」をクリックします。

初めて使う時はこのダイアログがでます。「続行」クリック

*この後、Googleのログイン画面等が出ますので、ログインし、許可を押してください。なお、この承認作業は初めてこのツールを使う時のみ必要となります。(2回目以降は不要となります)

許可の作業が終わったら、送信確認メッセージが表示されますので、「OK」をクリック。

送信確認メッセージが表示される。OKを押下すると、メールが送信される。

以上で、メールが一斉送信されました。

受信者側のメール受信トレイで確認してみると、ちゃんと受信できていて、差込も反映されていることが確認できました。

送信した2つのメールを確認。黄色マーカー部分が、宛先ごとにちゃんと差し込まれている。

ちなみに、送信者の送信トレイにも、送ったメールが残っています。

送信トレイに残っているので確認できる

おわりに

今回の記事はいかがでしたか?

GoogleスプレッドシートやGmail等のGoogleサービスは、インターフェースも使いやすく、通常の使用方法でも十分便利なのですが、今回のようにスクリプトを使うと、より便利になります。

私も勉強中の身ですが、また便利なものを見つけたら紹介したいと思います。

コメント

  1. 宮口 より:

    テスト送信をしましたところ、エラーがでてしまいます。
    是非ご教授いただきたいのですが、このエラーはなぜ出るのでしょうか?

    Exception: GmailApp オブジェクトでの sendEmail メソッドまたはプロパティの取得中に予期しないエラーが発生しました。詳細

    というものになります。

    • ichi3270 ichitamu より:

      コメントありがとうございます。
      そして、まったくコメントを確認しておらず、返信ができず申し訳ありません。
      本件、私も調べてみようと思いますので、わかりましたら返信させていただきます。
      (原因が究明できなかったら申し訳ありません・・・)

  2. 初心者 より:

    勉強させていただいてます。
    同じものを作ったのですが、「Exception: GmailApp オブジェクトでの sendEmail メソッドまたはプロパティの取得中に予期しないエラーが発生しました。」と出てきて送信できませんでした。

    なぜでしょう。。添付ファイルは無し、差し込みは$3まで使用しています。不要な部分を削除してもダメでした。。

    • ichi3270 ichitamu より:

      コメントありがとうございます。
      そして、まったくコメントを確認しておらず、返信ができず申し訳ありません。
      本件、私も調べてみようと思いますので、わかりましたら返信させていただきます。
      (原因が究明できなかったら申し訳ありません・・・)

  3. ichi3270 ichitamu より:

    宮口さん、初心者さん

    この度はコメントありがとうございました。
    確かに、ご指摘のエラーが発生しましたので、ソースを修正させていただきました。

    原因は、添付ファイルを指定していない場合でも、attachments: attachedFileを引数に指定していたのが問題だったようです。
    安直な修正ではありますが、添付ファイルを指定していない場合と、指定した場合で処理を分けて対応いたしました。

  4. 初心者2 より:

    お世話になります。
    スクリプトの送信ボタンまで作成完了し、ボタンを押そうとした段階で下記のようなメッセージが表示され、送信することができませんでした。
    【このアプリは、Google による確認が済んでいません。よく知っている信頼できるデベロッパーの場合に限り続行してください。】
    上記への対応策をご教授いただけますと幸いです。
    よろしくお願い致します。

  5. 735 より:

    大変便利に使わせていただきました。
    おかげさまで何時間分か得した気分です。
    どうもありがとうございました。
    自分でもこういうのが書けるように勉強したいと思います。

    • ichi3270 ichitamu より:

      コメントありがとうございます!
      お役に立てたようでとても良かったです。
      僕レベルでよろしければ、割とすぐに到達できると思いますので、是非チャレンジしてみてください。

    • マーガリン より:

      お世話になります。
      とても、探していたものを発見できてこれからの業務が非常に効率的に進められそうで、大変感謝しております。
      1点ご質問ですが、ccを複数名(5名ほど)入れたく、(,)でくぎってshashikomiのシートのccアドレス枠に入れたのですが、無効なアドレスとしてエラーになってしまいました。
      どのように解消したら良いでしょうか?
      お手数お掛け致しますが、ご教示いただければ幸いでございます。

      • ichi3270 ichi3270 より:

        コメントありがとうございます。
        先ほど、cc5名を入れて試してみたのですが、私の場合は成功してしまいました・・・。
        試しに、全角の「、」で区切ってみたら、
        Exception: 無効なメール: aaa@gmail.com、bbb.phone@gmail.com というエラーが確認できました。

        アドレスの区切りのカンマが 全角の「、」になっていたりしないでしょうか。半角の「,」で区切って下記のように入力する必要があります。

        例: aaa@gmail.com,bbb@gmail.com,ccc@gmail.com,ddd@gmail.com,eee@gmail.com

      • マーガリン より:

        早速のご回答誠にありがとうございました!
        半角カンマで試したところ、送信できました。
        お騒がせしてしまい申し訳ありませんでした。

        また、当ツールのご作成に重ねて感謝申し上げます。

  6. ジュン より:

    探してた物に出会えて感謝してます~。
    だいぶ効率化できました~。

  7. まーちゃん より:

    いつも便利に使用させて頂いております。
    今までPDFを送信する際にGoogleドライブでファイルの共有からリンクコピーして=前を消して送信してたのですが、
    システム?が変わったみたいなのですが何か対応策ございますでしょうか? 

    • ichi3270 ichi3270 より:

      コメントありがとうございます。
      確かに、すこしリンクの形式が変わっていますね!

      リンクをコピーすると、下記のような感じになっていると思います。
      https://drive.google.com/file/d/1lIXY2o3HXYsg3uI0xdym6xXv686XYZ6X/view?usp=sharing
      赤色にした部分を添付ファイル欄に入力すればうまくいくと思います!

  8. さとし より:

    GAS初心者で恐縮なのですが,添付ファイルのIDを差し込みシートから取得することは可能なのでしょうか。
    仮に,sashikomiシートに$6を作成して,$6のフィールドにファイルIDを入力し,mainシートでは,$6を参照するようなことです。それぞれに異なる添付をつけられればかなりできることが増えるのですが,参照させようとしても,どこかの作りが間違っており,[Exception: DriveApp オブジェクトでの getFileById メソッドまたはプロパティの取得中に予期しないエラーが発生しました。]となってしまうのです…。

    • ichi3270 ichi3270 より:

      sashikomiシートに$6を作成する方法でしたら、コードを下記のように修正したら、うまくいったようです

      
          /* スプレッドシートのシートを取得と準備 の一番最後は削除し、2行追加する */
          //var attachedFileId = mainSheet.getRange(7, 2).getValue(); // 添付ファイルのID
          var attachedFileId = ""; // 添付ファイルのID
          var attachedFile = ""; // 添付ファイル
      
      
          /* メール基本データの設定 の一番最後3行は削除*/
          // if (attachedFileId) {
          //     var attachedFile = DriveApp.getFileById(attachedFileId); // 添付ファイル
          // }
      
      
          // 差込を反映 の直前に追加
              var attachedFileId = skSheet.getRange(i, 8).getValue(); // 添付ファイルのID
              if (attachedFileId) {
                  var attachedFile = DriveApp.getFileById(attachedFileId); // 添付ファイル
              }
      
      • さとし より:

        早速ありがとうございます…!
        すごいです…できることが思いっきり増えました!

        「// 差込を反映の直前」に追加する1行目は(i,9)にしました。一応$5を生かしていたので…。

        // 差込を反映 の直前に追加
        var attachedFileId = skSheet.getRange(i, 8).getValue(); // 添付ファイルのID
        if (attachedFileId) {
        var attachedFile = DriveApp.getFileById(attachedFileId); // 添付ファイル
        }

        割と大事な個別PDF付きのメールを文面変えつつ50名近くに送らなければならなかったので,死ぬ思いをするところでした。
        初心者なりにスクリプトとにらめっこしながら調べていましたら,少しずつ理解できるようになってきたので,調子に乗って頑張って勉強しようと思います。
        (ファイルid一覧自動取得とか頑張って作ってみようと思った矢先に,検索したら完成形が見つかっちゃいましたが,せめてまずはコメントなしでもある程度解読できるようになって,近いうちに簡単な奴でも一式組めるようになりたいです。)

        本当に,ありがとうございます…!!

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