GAS

【GAS】スプレッドシート上にあるメール一覧から一括送信する

昔は表計算ソフトと言えばExcel一択でしたが、昨今はGoogleのスプレッドシートを使う人の割合が増えてきていますね。

私もここ数年で急いでGASに触れ始めたエンジニアの一人ですが、今回はシンプルにメール送信機能をご紹介します。

準備

それでは、メール一括送信の準備をしていきます。

データシート(メールアドレス情報記載)

まずデータシートを作成します。

ここでは簡単に「No」「名前」「メールアドレス」の3項目のみで構成されたデータシートを用意します。

メールテンプレート(送信するメールの内容)

次に送信メールのテンプレートシートを作成します。

ここで文言を変えれば送信メールの文言も自動的に変えられるようになります。

今回は各パラメータもメール本文に載せられるよう、{no}{name}{email}を配置しておきました。

メール送信ボタンの配置

メールを送信するときのトリガーを作ります。

ここではよく使う手法として、コマンドボタン式の実行手法を採りたいと思います。

まずは「挿入」タブの「図形描画」からコマンドボタンの形を作っていきます。

図形描画ウィンドウが開いたら、図形からコマンドボタン用の図形を選択します。

(ここでは角丸四角形)

作成した図形に文字を入れて、配置を中央寄せに。

ここまでできたら右上の「保存して終了」をクリックして終了します。

するとシート上にコマンドボタン風の図形が配置されます。

コーディング

それでは準備もできたところで、実際にコーディングしてみましょう。

メールアドレスの取得

メールアドレス一覧シートの各項目「No」「Name」「email」を変数に格納します。

格納する際、最終行を取得するのに getLastRow() を使用して「2行目~最終行」の範囲が指定できるようになっています。

それらを踏襲したプログラムがこちら。


  const wb = SpreadsheetApp.getActiveSpreadsheet();
  const ws = wb.getSheetByName("メールアドレス一覧");

  //対象シートの最終行番号の格納
  var lR = ws.getLastRow();

  //各列の値格納
  const noList = ws.getRange(2, 1, lR).getValues();           //No
  const nameList = ws.getRange(2, 2, lR).getValues();         //Name
  const emailList = ws.getRange(2, 3, lR).getValues();        //email

メール送信処理

続いてこの記事の主役になるメール送信処理部分を書いていきます。

こちらはまず「送信者名」「件名」「本文」をそれぞれ「メールテンプレート」シートから取得します。

取得したら本文内にパラメータの置き換えに対応できるよう、replace処理を入れて送信を行います

VB.NETやC#でメール送信処理を作ろうとすると、SmtpClientやMailKit等のクラス、ライブラリを使用する必要がありましたが、これが初めての時は結構苦戦します。

それに比べてスプレッドシートのGASはなんて簡単でしょう。少ない設定で簡単にメール送信が可能です。

上述らを踏襲したサンプルコードが以下です。


function send_Email(no, name, email){
  
  const wb = SpreadsheetApp.getActiveSpreadsheet();
  const ws_temp = wb.getSheetByName("メールテンプレート");

  let sendername = ws_temp.getRange(2,1).getValue()
  const temp_subject = ws_temp.getRange(4, 1).getValue()
  const temp_body = ws_temp.getRange(6, 1).getValue()

  let subject = temp_subject

  let body = temp_body
    .replace(/{no}/g,no)
    .replace(/{name}/g,name)
    .replace(/{email}/g,email)

  const options = { name: sendername, htmlBody: body };
  GmailApp.sendEmail(email, subject, body, options);

}

ソースコード全体

という事でほぼほぼ作り込みが完了しましたので、改めて先述2点を合わせて全体のコーディングを確認していきます。

このプログラムは「push_Email()」から始まり、その中でメール送信処理を行う「send_Email()」を呼び出してメール送信を行います。

呼び出しは「メールアドレス一覧」シートから取得したデータの数分for文で繰り返し実行するという基本的なスタイル。

特に難しいところが無いので、説明はこの辺にして全体のソースコードサンプルが以下になります。

function push_Email() {
    
  const wb = SpreadsheetApp.getActiveSpreadsheet();
  const ws = wb.getSheetByName("メールアドレス一覧");

  //対象シートの最終行番号の格納
  var lR = ws.getLastRow();

  //各列の値格納
  const noList = ws.getRange(2, 1, lR).getValues();           //No
  const nameList = ws.getRange(2, 2, lR).getValues();         //Name
  const emailList = ws.getRange(2, 3, lR).getValues();        //email

  // メールアドレスリストの数分ループ
  for(let i = 0; i <= noList.length - 1; i++){
    //emailが設定されている場合
    if (emailList[i][0] != "" ){
      //メール送信処理へ
      send_Email(noList[i][0], nameList[i][0], emailList[i][0]);
    }
  }

}

function send_Email(no, name, email){
  
  const wb = SpreadsheetApp.getActiveSpreadsheet();
  const ws_temp = wb.getSheetByName("メールテンプレート");

  let sendername = ws_temp.getRange(2,1).getValue()
  const temp_subject = ws_temp.getRange(4, 1).getValue()
  const temp_body = ws_temp.getRange(6, 1).getValue()

  let subject = temp_subject

  let body = temp_body
    .replace(/{no}/g,no)
    .replace(/{name}/g,name)
    .replace(/{email}/g,email)

  const options = { name: sendername, htmlBody: body };
  GmailApp.sendEmail(email, subject, body, options);

}

スクリプトを割り当て

プログラムが書けたら、実際に実行してみましょう。

その前に、「メール送信ボタンの配置」で作成したボタンにスクリプトの割り当てをしていきます。

既に作成してあるコマンドボタンを選択し、図形内の右上にある3連点を押すとメニューが出てきますので、その中から「スクリプトを割り当て」を選択します。

割り当てるスクリプトは先ほど作成したスクリプト「push_Email」を入力して「確定」ボタンを押下します。

以上でスクリプトの割り当てが完了です。

実行

それでは「メール一括送信」ボタンを押して実行します!

GASの実行はひっそりと終わりますよね。

ちゃんと送れています。何のエラーも無くすんなりいきましたね。

まとめ

やってみると簡単。でもちょっと疑問もありました。

それはこの部分


  //各列の値格納
  const noList = ws.getRange(2, 1, lR).getValues();           //No
  const nameList = ws.getRange(2, 2, lR).getValues();         //Name
  const emailList = ws.getRange(2, 3, lR).getValues();        //email

何が疑問かと言うと、これ2行目~最終行目までの範囲をまるっと格納してるんですが、この変数の中身が、

[0]:1
[1]:2
[2]:3
[3]:4
[4]:5
[5]:””

Length:6

最後の[5]="" は、なんで入ってくるです・・・?

最終行(lR)はもちろん6でしたよ。6行目。2行目~6行目だから、Length:5じゃないのかなあ。ならないのかな。

GAS初心者の戦いは続きます。



  • この記事を書いた人

よしこた

1992年生まれの牡羊座。
大学卒業後は地元の中小企業に就職し、
1年後にIT部門を立ち上げ、ITコンサルティング事業を始める。
クラウドソーシングをしつつ、ビギナー目線で記事を執筆します。

服やアニメが好き。仕事も割と好き。

-GAS