[GASで無料でやる]送付先ごとに別ファイルを添付して一斉メール送信するレシピ

「毎月数百人のお客様にそれぞれインボイスを添付して送りたい」を無料で実現したかったのでGoogle Apps Scriptで自作してみた。
2020.09.24

やりたいこと

メールの一斉送信を行ってくれる無料サービスやプラグインは世の中にたくさんあるのですが、送信先ごとに異なるファイルを添付して一斉送信したいケースってあると思います。

例えば「毎月数百人のお客様にそれぞれインボイスを添付して送りたい」とか。

有料のCRMなどではこういった機能もあるはずですが、意地でも無料で実現したい。クレジットカードを登録したくない。そういった時に手頃な外部サービスがないようなので、Google Apps Scriptで自作してみました。

材料

  • Google Spreadsheet 1枚
  • Google Apps Script 35行程度
  • Google Drive(添付ファイルを置いておくため)

1. Google Spreadsheetの準備

Google Spreadsheetを用意します。 必要なのは4カラム(Flagは明示的に送りたくない時にだけ使いますのでオマケです)。 scr.png

A列のInvoice添付するファイル名です。Google Apps Script(以下GAS)がGoogle Driveから合致するファイルを探してきてくれるため、ユニークな名前である必要があります

2. Google Driveにファイルをアップロード

上記SpreadsheetのA列に記載した画像名と同じ名前でGoogle Driveにファイルをアップロードします。 ファイル名がユニークであれば、パスを指定しなくてもGoogleが勝手に検索してくれます。かしこき。

3. Google Apps Scriptを書く

GASのコードです。

function send_invoice() {
  var spreadsheet = SpreadsheetApp.openById('{speadsheet_id_here}'); //SpreadsheetのID
  var sheet = spreadsheet.getSheetByName('send'); //シート名
  var lastRow = sheet.getLastRow();
  for(var i = 2; i <= lastRow; i  ) {
    //getRangeの第1引数は行(1,2,3..)、第2引数はカラム(A,B,C...の順番を数値にしたもの)
    var filename = sheet.getRange(i,1).getValue() 
    var report = DriveApp.getFilesByName(filename).next();
    var to = sheet.getRange(i,2).getValue();
    var name = sheet.getRange(i,3).getValue();
    var flag = sheet.getRange(i,4).getValue();
    if (flag != "NO"){
      var title = "メール件名";
      var content = 
      name   "様\n"  
      "いつも大変お世話になっております。\n"    
      "添付にて今月のインボイスをお送りいたします。\n\n"   
      "どうぞよろしくお願いいたします。"
      ;
      GmailApp.sendEmail(
        to,
        title,
        content,
        {attachments: [report],
         //fromをGmail以外にする際は紐付けが必要。下記で説明。
         from: 'email@example.com', 
         cc: 'email@example.com',
         replyTo: 'email@example.com', 
         name: 'My name here'
        }
      );
      if (to == "") {
        break;
      }
    }
  }
}

最後に、GASのページから実行ボタンを押すだけです。初回のコード実行時に、いくつかPermissionのポップアップが出てくると思いますので許可してください。

Gmail以外からメールを送信したい時

Gmailアドレスではなく、外部メールアドレス(例えば会社ドメインなど)で送信したい場合、Googleアカウントへの紐付けが必要です。

別のアドレスやエイリアスからメールを送信する https://support.google.com/mail/answer/22370?hl=ja

上記を設定していないと、GmailApp.sendEmail関数呼び出しの際にfromオプションが設定されていても、実行中のGmailアカウントから送られてしまいます。

さいごに

上記でだいたい基本的な処理はカバーしているはず。 "送信処理が完了したらSpreadsheet側にステータスを書き加えていく"等の処理を追加すれば、エラーによる配布漏れなども拾うことができるので、より確実奈ワークフローになるかと思います。

Google Apps Scriptは無料にも関わらず、Gmailやスプレッドシートとの手厚い連携のおかげで、そこらの有料ツールを置き換えてしまう万能性があります。

日々の業務効率を上げるために覚えておいて損はない、Google Apps Scriptの話でした。