« 2020年の初ウグイス | トップページ | ビデオ会議での留意点の共有 »

Google Apps Script で複数の人たちに1人ずつメール送信

この記事は自分用の覚書です。

■macOS Catalina
バージョン 10.15.3

■Google Chrome
バージョン 80.0.3987.149

■Gsuite Business

K.Y さん

Google Apps Script で複数人対象に、1人ずつメール送信するやり方です。
Google Apps Script、Googleドキュメント、スプレッドシート、Gmailを使います。

次のようなメール送信ができます。

・複数の人にメールを送信する際、To には1人分のメールアドレスを入れる。
・全員に同じ件名、同じメール本文を送る。
・本文中に相手の氏名を入れる。(その人ごとに変える。)
・From は自分のメールアドレスにして送信する。
・以上を人数分繰り返す。

From をGoogleグループのメールアドレスにもできます。
その場合は、そのグループで認証が必要で、認証のためにはグループの投稿権限で「ウェブ上のすべてのユーザー」も許可されていないといけません。
そのあたりは、Gsuiteの管理者と相談してください。

なお、From をグループのメールアドレスにして送信すると、受信側のシステムやメールソフトによっては迷惑メール扱いになる場合があります。
From を送信者のメールアドレスではないものにしているので、「なりすましメール」ということで。
あと、聞いただけの話なのですが、Outlookで受信すると、「(自分のメールアドレス)が(グループのメールアドレス)として送信しています」というような表示がされるそうです。

そのへんは仕方がないですね。
誰が送ってきたのかを完全に伏せることができるなんて仕組みは、Googleも提供しないでしょうから。

送信前の準備

メールの本文と受信者の一覧をつくっておきます。

メールの本文はGoogleドキュメントでつくってください。

件名は不要です。件名はこのあとスプレッドシートで指定します。
文中でメールの受信者の氏名を入れたいところは、 {お名前} という表記にしておいてください。
お名前 という文字列を半角の { と } で囲みます。これは必須です。

下記のコードでは、HTMLメールは送れません。
字体や文字色など文字に書式を施しても無効になります。
URLは送れます。
メールに署名をつけるなら、いっしょにつくっておいてください。

Gas_mailsousin_honbun

メールの宛先にする人たちの一覧を、スプレッドシートでつくってください。
列の並びは次図の通りにしてください。
コードのなかで各列を決め打ちしているので、列の並びを変えたり、途中に挿入したりしないでください。
1行目の「列見出し」は、使う人がわかればなんでもいいです。

Gas_mailsousin_spreadsheet

ドキュメントのIDとは、メール本文にするドキュメントのURLの /d/ のあとから /edit の前までのことです。
たとえば、https://docs.google.com/document/d/????????????????/edit なら ???????????????? の部分がドキュメントのIDです。

「表示する名前」の列では、受信した際に、相手の手元で自分の名前がどのように表示されるかを指定します。
たとえば、「事務局」と表示したかったらそう入力してください。
先の From の話でふれたように、ここで指定した表示も、受信側のシステムやメールソフトによってはその通りの表示にならないで、送信者の名前が表示される場合があるそうです。

コードについて

冒頭で全ての変数を宣言しているのは、単に私の好みです。深い意味はありません。
(Google Apps Script では、コード中に変数が出てくるときに変数の宣言ができますが。)

「プログラムのコードを書く」という経験を VBA から始めたせいか、最初に変数を宣言しておかないとなんか気持ちが悪くて。
変数 i を真っ先に宣言しているあたりが、「VBA をやっている人だなあ」感があるでしょ?
(JavaScript や Google Apps Script に慣れている人が見ると、こちらのほうが気持ちが悪いのでしょうけど……。)

受信者の一覧をつくったら、同スプレッドシートの「ツール」から「スクリプトエディタ」を選択して、下記のコードを貼り付けてください。
コピーするのは function onOpen から、このページの一番下にある } までです。
Google Apps Scriptのプロジェクト名も、スプレッドシートのファイル名も適当でかまいません。

相手のメールアドレスなど入力した情報が間違いないかを確認して、いったんスプレッドシートを閉じてください。
再度開くとスプレッドシートのメニューに「メール」という表示が追加されます。
それをクリックすると、「1人ずつメール送信」というコマンドが表示されるので選択すると送信の処理が始まります。

「1人ずつメール送信」を実行するときは、つくった受信者の一覧のシートを開いておいてください。アクティブなシートを指定しているので。

最初にスクリプトの「許可」を求められます。画面に従って進めてください。

送信の処理が行われている間は、「スクリプトを実行中」という意味のメッセージが表示されています。
処理が終わったら、「送信状況」の列に「送信済み」という文字列が入力されます。
送信されたメールは、Gmailの「送信済み」ラベルのなかに入っています。

・送信できるメール数について

Gsuite Business の契約の場合、Google Apps Script で同じ日にメールを送信できる上限は、1アカウントあたり1500通だそうです。

上限以下だからといって、何百通も送信しようとするのはやめたほうがよいと思います。
Google Apps Script には「実行時間が6分」という制限があります。6分を超えるとエラーが出て止まるそうです。

ちなみに、Windows10でも試してみたら正常に送信されましたが、3件への送信で約5秒かかりました。100件で3分弱というところでしょうか。
■Windows10の環境
・Surface pro3 (Windows10 Pro バージョン1909)
Intel(R) Core(TM) i7-4650U CPU @1.70GHz 2.30GHz
メモリ8GB
・Google Chrome バージョン 80.0.3987.149


function onOpen(){
   //「1人ずつメール送信」というコマンドを表示する。
   var MailCommand=[
     {name: "1人ずつメール送信", functionName: "Mail_Kobetusousin"},
   ];
   //スプレッドシートのメニューに「メール」という表示を追加する。
   SpreadsheetApp.getActiveSpreadsheet().addMenu("メール",MailCommand);
    }

function Mail_Kobetusousin() {
   //■変数の宣言
   var i;
   var SheetName;
   var SheetRow;
   var Atesaki_Name;
   var Atesaki_MailAddress;
   var Mail_Kenmei;

   //メール本文にするGoogleドキュメントのIDを代入する変数
   var Document_id;
   //ドキュメントのIDをもとにメール本文にするドキュメントを特定して、オブジェクトとして受け取るための変数
   var Document_Object;
   //ドキュメントのオブジェクトからテキスト情報を抜き出して代入する変数
   var Document_no_Body;
   //ドキュメントのオブジェクトから抜き出したテキスト情報にある {お名前} の部分を、受信者の名前に置換したあとのテキスト情報を代入する変数
   var Oname_with_Body;

   var Sousinsya_Name;
   var From_no_Address;
   //■変数の宣言はここまで。

   //アクティブなシート名を取得
   var SheetName=SpreadsheetApp.getActiveSheet();
   //同シート上でデータが入力されている最後の行番号を取得
   var SheetRow=SheetName.getDataRange().getLastRow();

   //■ここからメール送信の繰り返し。
   for(i=2;i<=SheetRow;i++){
     //i<=SheetRow は「シートの最終行の数以下の間、処理を繰り返す」という条件。
     //i++ は、「繰り返しのたびに、変数 i を1つずつ増やす」ということを略した書き方。厳密には i=i+1 と書く。

     //シートにある氏名を変数に代入。シート上で受信者の氏名の列が左からいくつ目にあるかを、数字の部分で指定している。
     //受信者の氏名は1列目にあるので、SheetName.getRange(i,1) になっている。
     Atesaki_Name=SheetName.getRange(i,1).getValue();

     //受信者のメールアドレスを変数に代入。
     Atesaki_MailAddress=SheetName.getRange(i,2).getValue();

     //メール件名を変数に代入。
     Mail_Kenmei=SheetName.getRange(i,3).getValue();

     //メール本文にするドキュメントのIDを変数に代入。
     Document_id=SheetName.getRange(i,4).getValue();

     //送信者の氏名を変数に代入
     Sousinsya_Name=SheetName.getRange(i,5).getValue();

     //Fromに入れるメールアドレスを変数に代入
     From_no_Address=SheetName.getRange(i,6).getValue();

     //メール本文にするドキュメントをIDで特定して、オブジェクトとして取得。
     Document_Object =DocumentApp.openById(Document_id);
     //メール本文にするドキュメントのオブジェクトからテキスト情報を変数に代入。
     Document_no_Body=Document_Object.getBody().getText();
     //{お名前} の部分を受信者の氏名にしたいので、 {お名前} を変数Atesaki_Nameに置き換える。
     Oname_with_Body=Document_no_Body.replace(/{お名前}/g,Atesaki_Name);

     //メールを送信
     GmailApp.sendEmail(
         Atesaki_MailAddress,
         Mail_Kenmei,
         Oname_with_Body,
         {
             from: From_no_Address,
             name: Sousinsya_Name
         }
     );

     //アクティブなシートの7列目に「送信済み」の文字列を入力。
     SheetName.getRange(i, 7).setValue("送信済み");

   }//←for に戻って、スプレッドシートの最終行になるまで繰り返す。

          /*
          ■replaceメソッドについて
         『g』は、最後まで探すというフラグ。
          replaceメソッドでは、『g』フラグを付けないと1個目しか置換しない。

          ■sendEmailメソッドについて
          GmailApp.sendEmail( からのコードで、Gmailのメールを送付。
          受信側のメールアドレス、件名、内容と、sendEmailメソッドのオプションで送信側のアドレス、送信者名を指定。

          sendEmailメソッドに設定できる値は次のよう。

          GmailApp.sendEmail(
              送信先アドレス(to),
              メール件名,
              メール本文,
              {
              cc: 送信先アドレス(cc),
              bcc: 送信先アドレス(bcc),
              from: 送信元アドレス(from),
              noReply: false,
              replyTo:返信先アドレス(replyTo),
              name: 差出人名
              }
          )
          */
}

|

« 2020年の初ウグイス | トップページ | ビデオ会議での留意点の共有 »

コメント

コメントを書く



(ウェブ上には掲載しません)




« 2020年の初ウグイス | トップページ | ビデオ会議での留意点の共有 »