【GAS】スプレッドシート記載のアドレスにメール送信!複数宛先も!!

今回はスプレッドシート に記載されたメールアドレス宛にメールを送信するっていうのをやっていきたいと思う。スプレッドシートにお客さんの情報がまとめられていて、そこの記載されているメールアドレス宛にメールを送りたいっていう時ありますよね。

そんなときに使える技かなと思います。GASでスプレッドシートに記載されているメールアドレスを取得して、その宛先に送信してやりましょう。

GASで読み取るスプレッドシートの内容

今回はスプレッドシートに記載されているメールアドレスを読み取って、そのメールアドレスに何かを送信するっていうことだからスプレッドシート がなくてはならない。そこで今回使うスプレッドシートはこちら。

名前とメールアドレス、メールを送信済みかどうかのチェックボックスの3つだけがあるスプレッドシート。チェックボックスにはGASでメールが送信されたらチェックを入れるようにしておく。スプレッドシート見たときに何か印がないと分かりづらいからね。

GASでメール送信する流れ

使うスプレッドシートがどんな感じかわかったから、どんな流れでメールを送信するのかっていうのをなんとなく掴んでおこう。今回はこんな流れでいく。

  1. GASでスプレッドシートを取得する
  2. スプレッドシート内のメールアドレスを取得
  3. 取得したメールアドレスに向けてメール送信
  4. メール送信したら送信した相手にはスプレッドシートにチェックを入れる

まあざっくりこんな感じになるだろうと思う。ただメールを一回送って終わり・・・とかならないように定期的に実行したいですよね。なので、トリガーを使って定期的に実行するようにします。例えば1時間おきに1~3の流れを実行するみたいな感じ。

宛先が複数のメールでも送信する

送らないといけないメールが複数溜まっているっていう場合もありますよね。こんな感じの時。

こういう場合にも対応したいから、送信されていないメールアドレス達を取得してそれらのメールアドレスに内容を送るっていう感じになるかな。

スプレッドシートからスクリプトエディタを開く

なんとなくやることは分かったかな、と思うからここからはGASでコードを書いていこう。ツールから[スクリプトエディタ]を選択してGASの画面へ。

GASでメールを送信するコードを書いていく

コードを書く前におさらい。今回の流れとしてはこんな感じのものだったね。

  1. GASでスプレッドシートを取得する
  2. スプレッドシート内のメールアドレスを取得
  3. 取得したメールアドレスに向けてメール送信
  4. メール送信したら送信した相手にはスプレッドシートにチェックを入れる

コードもこれを実現するように書いていけばいいから順番に書いていこう。とりあえず最初に全てのコードを載せておく。ざっくりやったんだけど、あまり綺麗なコードにならなかった。チェックボックスを入れるための位置どうしようかな・・・とか考えていたらなんかこうそんなうまくいかんな。

// スプレッドシートを取得
function getSpreadsheetByURL(url) {
  ss = SpreadsheetApp.openByUrl(url)
  return ss.getSheets()[0]
}

// 送信対象のメールアドレスとチェックボックスの位置を取得
function getTargetData(ss) {
  targets = []
  ss.getDataRange().getValues().forEach((val, index) => {
    if(val[2] !== false) {
      return
    }

    targets.push({address: val[1], cell_num: index + 1})
  })

  return targets
}

// メール送信
function send_mail(data, ss) {
  console.log(data)
  data.forEach(val => {
    MailApp.sendEmail(val['address'], "件名", "内容");
    // チェックボックスにチェック
    ss.getRange(val['cell_num'],3).setValue(true);
  })
}


function main() {
  var spreadsheet = getSpreadsheetByURL("スプレッドシートのURL")
  var data = getTargetData(spreadsheet)
  send_mail(data, spreadsheet)
}


 

ちょっとだけ書いていこう。

スプレッドシートを取得する

スプレッドシートを取得しているのはこの部分。渡されたURLのスプレッドシートの先頭のシートを取得する。

function getSpreadsheetByURL(url) {
  ss = SpreadsheetApp.openByUrl(url)
  return ss.getSheets()[0]
}

ちなみにスプレッドシートの取得方法はいくつか方法があるから、気になったら見てみてくれ。

スプレッドシート内のメールアドレスを取得

メールアドレスを取得しているけど、それとチェックボックスの位置を取得しようとした。

function getTargetData(ss) {
  targets = []
  ss.getDataRange().getValues().forEach((val, index) => {
    if(val[2] !== false) {
      return
    }

    targets.push({address: val[1], cell_num: index + 1})
  })

  return targets
}

メールアドレスだけならss.getDataRange().getValues().filter().map()・・・みたいな感じで一発で取得できるけど、今回チェックボックスにチェック入れないといけない。チェックボックスの位置を無理やりindexと合わせるようにして取得しているけどうーーーん、綺麗じゃない。

取得したメールアドレスに向けてメール送信・チェックボックスにチェック

メール送信部分はアドレスに対してMailApp.sendEmail(’アドレス’、'件名'、’内容’)とすればOK。チェックボックスはtrueをセットすればチェックされるね。

function send_mail(data, ss) {
  console.log(data)
  data.forEach(val => {
    MailApp.sendEmail(val['address'], "件名", "内容");
    ss.getRange(val['cell_num'],3).setValue(true);
  })
}

これを実行すると、例えばこんなスプレッドシートがあった場合・・・

メールが送信され・・・

スプレッドシートにはチェックが入った。

トリガーを設定する

メールをGASで送ることはできたから、今度はこれを自動で実行するようにトリガーを設定する。トリガーを設定することで、毎日とか1時間おきにとかを設定して関数を実行することができる。

これだと毎日9時~10時でさっきの関数が動くかな。何もしなくても毎日スプレッドシートを読み取ってメールを送信、送信したものにはチェックが入るっていう感じ。楽だね。

GASを学びたかったら

スプレッドシート に記載されているメールアドレスにメールを送るっていうことをやってみたけど、どうだろう。最初作るのは面倒だけど、1度ちゃんと作ってしまえば後はメンテナンスぐらいで良い気がするから楽ですよね。

今回この記事で書いたコードは良い感じに改造してください。

GASで作業自動化・効率化をしたかったら人にお願いするのもあり

GASでスプレッドシートに記載されたメールアドレスにメールを送るっていうことをやったけど、こういった自動化を行う際に自分ではコード書きたくない・・分からん・・・っていう場合もあると思います。

そういう時にはココナラ覗いてみるとその自動化作業を結構やってくれる人がいると思うから、見てみると良いですよ。