メディア掲載: レバテックフリーランス様のサイトで当ブログが紹介されました

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

こんにちは。ichi3270です。

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

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

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

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

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

*2020.12.28:バージョンアップした記事・ツールも公開しました。是非ご覧ください。

できあがるもの

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. ジュン より:

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

    • ichi3270 ichi3270 より:

      ジュンさん お役に立てたようで良かったです!コメントありがとうございました!

  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一覧自動取得とか頑張って作ってみようと思った矢先に,検索したら完成形が見つかっちゃいましたが,せめてまずはコメントなしでもある程度解読できるようになって,近いうちに簡単な奴でも一式組めるようになりたいです。)

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

      • ばな より:

        とても分かりやすく、これまで一部内容の異なるメールの一斉送信が出来なかったので、苦労しておりましたが、こちらの記事のお陰様で大変助かりました。
        有難うございます。

        一点質問ですが、全員に一部内容の異なるメール、添付内容も全員異なるものを送りたい時には、コードはどのように修正したら良いのでしょうか。
        2020年6月6日 2:06 AMにichi3270さんが仰っていた通りやってみたのですが、そもそもこのようなコードを見る事自体初めてでしたので、仕組みも全く分からず・・・

        お手数をお掛けし申し訳御座いませんが、添付データ(ID)を差し込みし、一人一人異なるデータを送る方法をお教え頂けないでしょうか。
        現在は$3まで使用しておりますので、$4で添付データの差し込みを行いたく考えております。
        コードを丸々コピーして貼り付けて頂けると、大変に助かります。。

        また、添付データのIDを$4に入れたとして、$4はmainシートのどこに記入すれば良いのでしょか。。
        初歩的で申し訳御座いません。
        何卒宜しくお願い申し上げます。

        • ichi3270 ichi3270 より:

          過去にためしたコードがありましたので、掲載します。
          ちゃんとテストしておりませんので、ご利用の際は何通か試してからご利用ください。
          このコードに差し替えた場合は、mainシートの添付ファイル欄は無視されます。
          sashikomiシートのI列(差込 $5の一つ右の列)に、添付データのIDを入力してください。

          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 = ""; // 添付ファイルのID
              var attachedFile = ""; // 添付ファイル
          
              /* メール基本データの設定 */
              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();        // 本文
          
              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();        // 差込⑤
                  // 追加
                  var attachedFileId = skSheet.getRange(i, 9).getValue(); // 添付ファイルのID
                  if (attachedFileId) {
                      var attachedFile = DriveApp.getFileById(attachedFileId); // 添付ファイル
                  }
          
                  // 差込を反映
                  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("送信が完了しました。");
          }
          
  9. のぶた より:

    求めているもの出会えて,感謝しています.

    ところで,作成したスプレッドシートを部内で共有できますか?
    方法としては,
    1 グーグルドライブの共有ドライブで各自にスプレッドシートをコピーしてもらう.
    2 作成したスプレッドシートをテンプレートとして登録する.

    このような方法が可能でしょうか?

    • ichi3270 ichi3270 より:

      コメントありがとうございます。
      ご質問の返事になっているかどうかわからないのですが、部署内などで共有は可能だと思います。

      1 グーグルドライブの共有ドライブで各自にスプレッドシートをコピーしてもらう.

      これが最も簡単でしょうね。私もそうすると思います。

      2 作成したスプレッドシートをテンプレートとして登録する.

      すみません、こちらは私の知識不足で、どういうものなのかがわかりませんでした;

  10. たたたた より:

    非常に便利で素敵なサイトに巡り会えました!
    本当にありがとうございます。

    一点ご教示いただきたいのですが、

    複数のファイルを添付したい場合はどのようにしたら良いのでしょうか。
    ( , )で区切るのかなと思ったらエラーになってしまい。。

    よろしくお願いします。

    • ichi3270 ichi3270 より:

      コメントいただきありがとうございます。
      現状のコードでは申し訳ありませんが複数のファイル添付に対応していません・・・ので、zipファイル等で送って頂くか、
      プログラミングのご経験があるようでしたら、スクリプトを修正いただくかになります。

      (もしプログラミング経験がお有りでしたら)GmailApp.sendEmailの中で設定している attachments: に、配列を入れるよう修正してあげればOKなようです。

      • たたたた より:

        早速にありがとうございます。

        初心者なりに勉強して試してみます。
        スクリプト壊してしまったら、またこちらへコピーしに戻って参ります。

        本当にありがとうございました。

        • さとし より:

          以前ichi3270様に,「人別に異なるファイルを送りたい」ということで,やりかたを教えていただいたさとしです。
          2か月くらい前に,たたたた様と同じ問題に直面したため,
          本文差し込みは$1~$5まで,添付の差し込みは4つまでにして,頑張って付け加えてみました。(なので,I列~L列が添付IDを記入するフィールドです)
          とても助けていただいたページなので,できる限りの恩返しとして,長くなりますがコメントさせてください。

          プログラミング初心者なので,無駄のあるコードだとは思いますが,望んだ結果になることは確認済みです。※配列内にnull?があった場合にエラーが出ないように,Booleanを用いましたが今一つ正しく理解できていないので,どなたか,無駄を省いたりその箇所をご教示いただけますと恐悦至極です…。

          以下コード全文です—-
          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 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(); // 本文

          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(); // 差込⑤
          var aFId1 = skSheet.getRange(i, 9).getValue(); // 添付ファイル1のID(attachedFileId)
          var aFId2 = skSheet.getRange(i, 10).getValue(); // 添付ファイル2のID
          var aFId3 = skSheet.getRange(i, 11).getValue(); // 添付ファイル3のID
          var aFId4 = skSheet.getRange(i, 12).getValue(); // 添付ファイル4のID
          var attachedFileIds = []; // 添付ファイルIDの配列
          var attachedFiles = []; // 添付ファイルの配列

          attachedFileIds.push(aFId1,aFId2,aFId3,aFId4); //添付ファイルのID配列にID1~4を挿入
          //添付ファイルのID配列に挿入されているものがあるときtrueとして実行
          if (attachedFileIds.length) {
          function isTrue(value) { //function「isTrue」を定義。配列の要素をブーリアン型で戻す
          return Boolean(value);
          };
          var attachedFileIds2 = attachedFileIds.filter(isTrue); //配列のうちfalseとなる要素を削除
          var attachedFiles = attachedFileIds2.map(function(value){
          return DriveApp.getFileById(value); // 添付ファイルの配列を取得
          });
          }

          // 差込を反映
          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 (attachedFiles.length) {
          // 添付ファイル有りの場合
          GmailApp.sendEmail(
          strToEmail, //toアドレス
          strSubjectIns, //メールタイトル
          strBodyIns, //本文
          {
          cc: strCc, //ccアドレス
          bcc: strBcc, //bccアドレス
          from: strFrom, //fromアドレス
          name: strSender, //差出人
          attachments: attachedFiles //添付ファイル
          }
          );
          } else {
          // 添付ファイル無しの場合
          GmailApp.sendEmail(
          strToEmail, //toアドレス
          strSubjectIns, //メールタイトル
          strBodyIns, //本文
          {
          cc: strCc, //ccアドレス
          bcc: strBcc, //bccアドレス
          from: strFrom, //fromアドレス
          name: strSender, //差出人
          }
          );
          }
          }
          Browser.msgBox("送信が完了しました。");
          }

          • ichi3270 ichi3270 より:

            お~~!いつかこのツールを改善しようと思っていたので、その際に参考にさせていただきたいと思います!

  11. SWD より:

    素晴らしいです。

    とても役に立ちました。
    丁寧にわかりやすく掲載していただき、ありがとうございました。

    • ichi3270 ichi3270 より:

      感想いただきましてありがとうございます!
      今後もお役に立つ記事がかけるよう努力します!

  12. nimiri より:

    記事拝見させていただきました!
    一点GAS初心者で恐縮なのですが、
    送信リスト(今回でいうsashikomi)を送信時に選択できるようにしたいのですが、可能でしょうか?
    ECサイトメルマガに例えるなら、
    購入履歴がある人には「A」、ないけど登録いただいている人には「B」、全員に「C」を送るとして、
    「A」のメール文を作成→Aのリストに送信、「B」作成→B送信、AB両方送信・・・
    など、送信時にどのリストに送るか選べるスクリプトを書きたく思っております、、、

    ご教示いただけますと幸いです。
    宜しくお願いします。

    • ichi3270 ichi3270 より:

      返信が遅くなり申し訳ありません。
      試していないのでちゃんと動くかはわからないのですが、下記の感じでいかがでしょうか。
      (ご利用の際は、かならず動作確認をお願いいたします)

      <画面の変更>
      ・差込シートのI列を「リスト名」列とする ← ここに、A とか B 等のユーザーの区分を入れておく
      ・mainシートのB8セルに、送信対象のリスト名を入力する ← 送信する前に A や B を入力する。未入力の場合は全員に送信される

      <スクリプトの変更>
      // スプレッドシートのシートを取得と準備 の最後に下記のコードを追加

      var selectedType = mainSheet.getRange(8, 2).getValue(); // 添付ファイルのID
      

      // 差込シートの取得 の最終行に下記のコードを追加

      var userType = skSheet.getRange(i, 8).getValue();        // 受信者のタイプ
      

      // for (var i = 2; i <= skEndRow; i++) { の次に下記のコードを追加

      if ( !selectedType && userType !== selectedType ){ continue; }  // タイプを選択している かつ 選択タイプ以外の送信先の場合はスキップする
      
  13. 5098 より:

    いつも便利に使用させて頂いております。

    ご質問なのです。
    昨日まで利用可能だったのですが、本日使用したところ【Exception: サービスを使用できません: Gmail】というエラーが出てしまい、送信できません。
    24時間以上たってから使用しているので時間制限と件数制限が超えているわけではありません。
    システム的?Google的?に何か変更があったか分かりますでしょうか?
    ご教示いただけますと幸いです。
    宜しくお願いします。

    • ichi3270 ichi3270 より:

      8月20日にGoogleのサービスで障害が発生していたようです。もしかしたらその影響ではないでしょうか。
      今は復旧したようなので、再度お試しください~

  14. 高橋貴子 より:

    たかこ より
    まさかできるとは思わなかったのに、ほとんど1回でできました。
    pushSendButtonのつづりを1度間違えていました。コピーするべきでした。
    他のサイトでもやろうとしましたが、途中で諦めました。
    ここでの説明はわかりやすくて、説明通りに進んでいくと見事に大成功でした。

    今までは差し込み印刷を作って、1個ずつ貼り付けて送っていました。
    バカみたいでした。こんなに楽にできるとは信じられません。✰感激✰です。
    仕事で400人くらいに送ることもあります。
    いっぺんに送るのは、少し怖いような気もしますが、100人ずつでも4回で終わります。
    スプレッドシートを利用すると、すごく効率がよくなりますね。
    とっても嬉しいです。ありがとうございました。

    • ichi3270 ichi3270 より:

      コメントありがとうございました!
      400人に送るのは大変ですね・・・!この記事が役に立ったとのことで、嬉しいです。

  15. 高橋 より:

    たかこより

    こんにちは。
    別のメールドレスから同じようにやってみました。

    3.スクリプトを貼り付ける 
    ツール → スクリプトエディタ の順にクリック までやりました。

    この後
    現在、ファイルを開くことができません。アドレスを確認して、もう一度試してください。
    と出てきて、先に進めないのですが、どうしてでしょうか?

  16. りょう より:

    sashikomiのセルに日付を入れると、メール本文に、

    Fri Dec 11 2020 00:00:00 GMT+0900 (日本標準時)のように表示されます。

    これを回避することはできますか?

    • りょう より:

      すみません。sashikomiシート側の表示形式変更で解決しました。

      • ichi3270 ichi3270 より:

        まったくコメント欄見れておらずすみません>< セルの書式設定で解決されたということで良かったです!

  17. たかこ より:

    お返事遅くなり申し訳ありません。

    8月30日の質問について、お返事をありがとうございました。
    外部サイトを読んでみて、なんとなくわかりました。

    全てをログアウトしてから使うメールだけをログインすれば、
    解決するとのこと、わかりました。
    やってみます。

  18. たかこ より:

    今、やってみました。
    無事やりたいことができました。
    理屈はよくわかっていませんが、目的が果たせて満足です。
    ありがとうございました。

    ひとつのアカウント(メールアドレス)に、
    いろいろな人に同じ文章で送れるメールを作っておいて(中に$1 $2が入っている)
    同じメールアドレスからであれば、これを利用すればいろいろなメールにも使えて
    とても便利であることがわかりました。

    まだ添付ファイルが付けられません。
    以下の文章を読めばできるでしょうか?
    さらに研究してみます。

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

  19. たかこ より:

    添付ファイルも送ることができました。

    右クリックメニューの「共有可能なリンクを取得」をクリック
    は「リンクを取得」となっていました。クリックするとアドレスが出てきたので、
    5月29日の回答も参考にして進めましたところ、またもや添付ファイルが送ることができました。すごい!すごい!
    意味がわからなくて、ichi3270さんの指示通り作りました。
    完璧に動いてくれるので不思議でした。感激です。

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

    • ichi3270 ichi3270 より:

      コメントありがとうございます!添付ファイルも送信できたとのことで、よかったです!
      いつかこの記事をもう少しわかりやすく書き直したいと思っていますので、コメント参考にさせていただきます!

  20. ゆりか より:

    セキュリティについて質問ですが、こちらのスクリプトを使用すると
    pushSendButtonの作者?ichitamuさん?にGoogleアカウントの内容やメールの権限を渡すことになるのでしょうか??
    こちらを使うにあたってセキュリティの面が不安だそうで会社からOKが出ません。。
    初心者の質問で申し訳ないのですが返信お待ちしてます。

    • ichi3270 ichi3270 より:

      いえ、元のpushSendButtonスクリプトを考えたのは私になりますが、スクリプト内には私に何かの権限を与えたりするような動作は一切含まれていませんのでご安心ください。
      途中でアクセス許可を承認するかどうかのメッセージが出ると思いますが、これは、「私(ichi3270)へ権限を与える」という意味ではなく、「ゆりかさんが作成したスクリプトに許可をする」というイメージです。
      最近は表示されるメッセージが少し変わったようなので、こちらの記事が参考になるかと思います。

  21. tkm より:

    ichi3270さん

    すげー便利です!
    ありがたく活用させていただきます。

    G-Mailを使っておきながら、スプレッドシートはExcelVBAに慣れてると億劫で手が出なかったのですが…
    これからはぼちぼち勉強するようにします。

    • ichi3270 ichi3270 より:

      役に立ったようでよかったです!
      自分もGoogleサービスへの理解がまだまだなのでもっと勉強します><

  22. より:

    求めていたものが見つかりました。

    説明もわかりやすく初心者のでもサクサク作成できました。
    ありがとうございます。

    1つ質問ですが、sasnikomiシートにの宛先アドレス列の途中にブランクセルがあるとそれ以降の宛先にはメールは未送信になりますか?

    ご教示ください。

    • ichi3270 ichi3270 より:

      試していないのでわからないのですが、確かに、メールアドレスがブランクだと、処理が途中でエラーになって止まる可能性はある気がします・・・

  23. M より:

    とても便利で活用させて頂いております。

    初歩的な質問ですが、差込の数が送信先によって変動する場合(多いときは200列目までデータがある)はどのようにスクリプトを変えればよいでしょうか?

    顧客毎に代わる商品名を通知したいです。

    自分なりに調べたのですが、最終列を取得して最終行までループするやり方がわかりません。

  24. 松次郎 より:

    すごい便利でした!
    時間指定ができれば最高でしたが、難しいでしょうか?

  25. タンヒョウ より:

    利用してみたく試しているのですが、最後の送信の際に以下のメッセージがでてメールが送信できません。

    Exception: 無効な引数: (私のメールアドレス)

    以上です。
    どうしたら解決できるかご教授いただければ幸いです。

    • タンヒョウ より:

      追記です。
      googlのメールアドレスしか利用できないとかあるのでしょうか。

      • ichi3270 ichi3270 より:

        少なくとも、ご自身のGoogleアカウントのGmailから送信できるアドレスじゃないと使えないと思います~

  26. ゆう より:

    添付がうまくいきません。添付しないとうまくいくのですが、
    ワークスペースだとドライブ内のファイルは共有できないでしょうか。
    右クリックで「共有可能なリンクを取得」が出てこず、リンク部分の歯車で公開リンクに対する設定が無効となっています。と出るのですが、解決策ありますでしょうか。

    • ichi3270 ichi3270 より:

      画面が見れないのでわからないのですが、その歯車ボタンの下にURLが出てないでしょうか?
      もしくは、そのファイルを開いたら、ブラウザのURLの部分にIDが表示されると思います。

      • ゆう より:

        ご返信ありがとうございます。
        よくよくこちらを読み返して

        https://drive.google.com/file/d/1lIXY2o3HXYsg3uI0xdym6xXv686XYZ6X/view?usp=sharing
        赤色にした部分を添付ファイル欄に入力すればうまくいくと思います!

        というのをやってみたらできました!
        後ろの/view~を消していなかったのが原因でした。
        年賀状用で焦っていたのですごく助かりました。うまく行ったので送るのがたのしみです!ありがとうございます!

  27. 五十嵐 より:

    こんにちは!

    サイトの内容を拝見させて頂き、使用させて頂きました!!

    今まで、数百件のメールをいちいち送信していた作業が一瞬で可能になった感動を
    本当にありがとうございます!!!

    1点だけ質問なのですが、
    G mailを介して送信する事はできるのでしょうか?

    私の場合、会社の署名がGmailに設定してあるのと、
    メールの開封確認をGmailに設定してあるので、
    Gmailから送っている事になっているとそれが一気に解決するのでは?
    と思っております。
    ※署名については画像なので、本文には挿入できません(TT)
    ※そのままメールを送信してもメールトラッキングは作動しない現状です(TT)

    説明の意味が取りづらい場合は申し訳ありません!

    コードも書くことができない者ですが、
    今はスプレッドシートからメールを送る機能を使って送信しているのかなー?
    と勝手に仮定して質問しております。。

    お手すきの際にご教授して頂けると幸いです
    よろしくお願いいたします!m(__)m

    • ichi3270 ichi3270 より:

      コメントありがとうございます。
      署名の件と、開封確認の件、どちらも今の私のレベルだと対応できなそうです・・・すみません。
      画像の署名は、HTMLメールを送信するようツールを変更すれば可能かもしれませんが・・・

  28. やまだ より:

    ものすごく初歩的なことでつまづき、そして解決しましたので
    同じような方もいらっしゃるかと思いコメントさせてください。。

    main シート
    sashikomi シート

    ↑これは、ファイル名ではなく、
     「同じファイル内の、1シート目のシート名、2シート目のシート名」です。

    「シート」と記事にちゃんと書いてあるのに、勝手に勘違いして
    「mainファイル」「sashikomiファイル」を作って失敗していました。。
    ちなみに、その場合は下記のようなエラーが表示されます。

    TypeError: Cannot read property ‘getDataRange’ of null

    • ichi3270 ichi3270 より:

      コメントありがとうございます、勘違いされた点などお知らせいただき、こちらとしても勉強になりました。

  29. さいとう より:

    こんにちは!

    スプレッドシートを使用したメール一斉送信のやり方を
    丁寧にプログラムまで公開してくれて、大変わかりやすく、助かりました。
    ありがとうございます!!

    一点、お願いがあります。

    今回、公開してくれた一斉送信方法の中では、添付ファイルが1つしか
    付けられません。

    複数の添付ファイルを送信するためには、今公開してくれてる
    プログラムに、追加してもらえるとすごく助かります。

    プログラミングについて、ど素人なのでよろしくお願いします。

  30. しむら より:

    こんにちは。
    この投稿を拝見し、大変助かっております。
    質問です。
    今、5項目までの差し込みが可場かと思いますが、8項目までいれたい場合は、どのようにすればよいでしょうか。

  31. Matsusan より:

    初めまして、試させていただいたのですがメール送信者名の項目に店舗の名前を入力すると「Exception: 無効な引数」と表示されるのですがどのようにすれば解決できるのでしょうか?

    • ichi3270 ichi3270 より:

      原因がわからないのですが、店舗の名前に記号等を使用している場合は、一度取り除いて試してみてください。(効果が無いかもしれませんが・・・)
      また、こちらの記事のツールをお試しいただくのもよいかもしれません。

  32. JT より:

    すごい物に出会えた気がして感動しています!

    一点、Gmail内に保存している連絡先を「sashikomi」シートに紐づけて活用する事は可能でしょうか?

    それが出来たら最高です!

  33. 佐藤 より:

    重宝しております!ありがとうございます!

    これは、メール送信までではなく、メール作成までで止めることは可能でしょうか?
    送信はGmailのアプリから手動で行いたく、下書き作成までこのツールで出来たらなあ・・・と思っております。

  34. いのうえ より:

    gmailでの差し込みメールについて,ドキュメントを使用せずに,スプレッドシートのみで完結するので,よかったです.
    エラーなく送信することができました♪
    ありがとうございます.

  35. わだ より:

    こんにちは、
    今回、メール作業を簡略させたいと思い、参考にさせて頂いていまして非常に助かっております。

    現在10種類の差込が可能かと思われますが、それ以上(希望は15種類)の差し込みを行うこと可能でしょうか?

    • ichi3270 ichi3270 より:

      1)sashikomi シートに列を追加する
      差込 $6 ~ 差込 $15 を追加してください。

      2)スクリプトを修正する
      下記に続けて、同じ要領でsk6~sk15を追加してください。(getRangeの中の数字も1ずつ増やす)

              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);       //本文
      

      この部分もそれぞれ

      .replace(/\$5/g, sk5).replace(/\$6/g, sk6).replace(/\$7/g, sk7).replace(/\$8/g, sk8) ・・・

      という感じでsk15まで追加してください。

      私は動作確認していないのですが、おそらく動くかと思います。

  36. ゆったん より:

    すばらしいスクリプトありがとうございます!

    これで残業時間が大幅に減少しそうです。

    まだ数人でテストをしているのですが、最終
    的には1700人程度に同時送信したいと思いま
    すがいけますかね?

    googleは途中で処理を停める場合があるとか
    ないとか聞いたこともあるもので、、、。

    100人くらいづつ刻んだ方が良いのでしょうか。

    なにか注意する点などご教授頂ければ幸いです m(_ _)m。

  37. CC より:

    添付ファイルも、対象者より、異なる場合、実現できますでしょうか。

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