GoogleSpread(GAS)でQRCodeを一括で送付する


概要

以前にQRCodeで出席管理する仕組みを作成する記事を投稿しました。システム的には完結はしているのですが、QRCodeを送付するところは宿題になっていたので、こちらの記事で書いていこうと思います。
ちなみに前回の記事はこちらをご確認ください。

■QRCodeで出欠管理する仕組みを作ってみる(QRCode +Vue.js + localStorage)
https://qiita.com/tamoco/items/4b17ff51bcfbfb89163d

何を使って送付するのか?

前回の記事で書いたとおりGoogleAppsScript(以降:GAS)を使用します。GASを使用すればGoogleSpreadSheetを使用でき、ExcelのVBAのような感覚でお手軽に使えます。VBAと違っていろいろ記述しなくてもGmailがあるのでメールの送付もカンタンです。

一括送付のイメージ

GoogleSpreadSheetからGASを実行して、それぞれのユーザーにQRCodeを生成するURLを送付します。このときQRCodeを生成するサイトはURLのパラメータで異なったQRCodeを生成できるので社員番号などをパラメーターとしてURLを作成します。メール本文についてはGoogleDocumentで文章を記載して準備しておきます。GoogleDocumentで記載した文章内容をGASで取得して置換しています。詳しくは次のGASのコードの部分でも記載します。

ちなみに今回の一括送付の方法については以下のページを参考にさせていただきました。仕組みなどはほとんど流用させていただきました。38行だけでメール送付の仕組みができるのは便利です!

■たったの38行!Google Apps Scriptで超簡易メルマガ配信システム
https://tonari-it.com/gas-mail-magazine/

コードや各設定ファイル

GoogleSpreadSheet

メールは準備するのが面倒だったので捨てメールを作成し、そのアドレスに送付するようにしました。

GoogleDocument

注目すべきポイントは{}で囲まれた部分については後でGASで置換します。置換することで送付先ごとに内容を本文内容を変えることができます。別にGoogleSpreadSheetで本文を書いても良さそうですが改行とか面倒そうなのでちょっと工夫がいるかもしれません。

GoogleAppsScript

function insertName(){

  /* スプレッドシートのシートを取得と準備 */
  var mySheet =SpreadsheetApp.getActiveSheet(); //シートを取得
  var rowSheet = mySheet.getDataRange().getLastRow(); //シートの使用範囲のうち最終行を取得

  /* ドキュメント「メール本文テスト」を取得する */
  var docId = "DocのIDを設定" //DocsのURLの一部がIDです
  var docTest = DocumentApp.openById(docId); //ドキュメントをIDで取得
  var strDoc=docTest.getBody().getText(); //ドキュメントの内容を取得

  /* メール表題、fromアドレス、差出人名を準備 */
  var strSubject = "受付QRコードの送付"; //表題・件名
  var strFrom = "[email protected]"; //From(実行しているGoogleのアドレスを設定?)
  var strSender = "QR送付野郎"; //差出人

  /* シートの全ての行について社名、姓名を差し込みログに表示 */
  for(var i = 2;i <= rowSheet;i++){

    var strId = mySheet.getRange(i,1).getValue(); //社員番号
    var strName = mySheet.getRange(i,2).getValue(); //氏名
    var strTo = mySheet.getRange(i,3).getValue(); //メール

    //QRCode生成のURLを作成する
    var strUrl = "https://qrcode-generator.netlify.com?id=" + strId;

    var strBody = strDoc.replace(/{QR_URL}/,strUrl).replace(/{氏名}/,strName); //置換
    Logger.log(strBody); //ドキュメントの内容をログに表示

        /* メールを送信 */
    GmailApp.sendEmail(
      strTo, //toアドレス
      strSubject,  //表題
      strBody, //本文
      {
        from: strFrom, //fromアドレス
        name: strSender //差出人
      }
    ); 

  }
}

参考にしたページのソースを自分なりに少し修正しています。QRCodeの生成はURLのidというパラメーターに社員番号を設定しています。QRCodeを読み取る方は社員番号で参照するようにすれば受付できます。なお、一括送付の実行についてはGASの画面から実行します。以下の画像の赤枠部分が実行ボタンなのでクリックすることで実行できます。初回の実行に限りアカウントへの認証許可を求められるので許可してあげてください。
もしFunctionが複数ある場合は実行したいFunctionを選択してから実行してあげてください。実行ボタンの右隣にFunctionをドロップダウンリストから選択できます。

実行後のスクリーンショット

捨てアドの受信ボックスにはちゃんと受信されていることが確認できます。なお、送付アドレスは個人のGmailなのでモザイク処理しています。

メールの1つを開くとGASの処理で結合したURLが記載されています。もちろんURLをクリックするとIDのパラメーターを元にしたQRCodeが表示されます。

GASでメールを送付するときの注意点

通常のアカウント(無料)の場合、GASで送付できるメール総数は1日に100通までとなっています。そのため、同窓会などで参加人数が多い場合は分割しながら送付する必要があります。GASの処理をみるとアクティブなシートを参照しているので、シートごとに100通ずつ設定すると良いかもしれません。
有料アカウント(G Suite)の場合は、GASで送付できるメール総数は1日に1500通までとなっています。1500通以上を一括で送付することはなかなかないと思いますし、エリアごとに送ったりするケースがあるので意外にGASでも対応できる可能性があります。
下手にウェブで送付する画面を用意しても使いにくいと思うのでExcelやSpreadSheetなどで送付する仕組みのほうが使いやすいかなと思ってます。

メール送付にあたり他のアプローチを考える

ちょうど会社がAWSにお熱なのでAmazon Simple Email Service(以降:AWS SES)がイイかなと。「AWS SESで簡単にメールは送付できるのでネイティブアプリで作成すれば安全にメール送付することができます。ネイティブアプリと記載しましたがAndroidやiOSのアプリではなくWindowsの「Formアプリ」や「Electron」なども良さそうです。個人的にはC#で「Formアプリ」を作るのが好きなので時間があるときにチャレンジしてみようと思います。