Upgrade to Pro — share decks privately, control downloads, hide ads and more …

201222 GASでメールを自動で送るマシンを作ろう 資料 野口さん

comucal
December 22, 2020

201222 GASでメールを自動で送るマシンを作ろう 資料 野口さん

comucal

December 22, 2020
Tweet

More Decks by comucal

Other Decks in Technology

Transcript

  1. - 本題の前にTips - Gmailについて - 今日のテーマ - GASを使ってメールを自動で送るマシンを作ってみよう! - 狙い

    - 「GASには興味があるけど、実際にはどうやって使えばいいかわからな い・・・」 - そんな方に向けてもっともっとGASに興味を持ってモチベーション高く学習 を継続いただけるように、今回は「GASを使えばこんな業務に応用できるの か!」ということを知ってもらう回にしたいと思います。 - 今回扱うのは「メール送信の自動化」特定のリストに、特定のルールでメー ルを送る機会が社内外で多そう、という予測の元テーマに選定。 - (補足)今日は「GASいいかも!」と思っていただけることを最優先にして いるので細かい処理の解説は省きます。ご需要があれば次回のGoogle Apps Talkではこの会の実装を例にGASの細かい処理を解説していこうかなと思っ ております。 - 背景設定 - 営業リストが存在しており、それに対し新規リードを獲得する目的でステッ プメール的な感じで訴求を変えながらメールを送っていくという行為を自動 化したいと考えている。 - やりたいこと - ① 営業リストを貼っつけておけば勝手にメールを送ってくれる。 - ② メールを送った回数に応じてメールの文面を変更したい。 - = ステップメール施策を取り入れたい。 - ③ 営業時間外にはメールを送りたくない。 - = 深夜にメール送ったりしたくない。 - 今回は上記を達成すればOKということにして実装をしていきたいと思いま す。 では実際にGASのスクリプト編集画面をみながら実装していきましょう! (今日はハンズオンではないので実装の流れとアウトプットの流れを見て、知っていただけ ればと思います。)
  2. 【参考】今回のスクリプト function sendMail() { // 今使っているスプレッドシートを取得します。 /// 概念は「スプレッドシート」→「シート」→「(シート内の)データ」という感じです。 var spreadSheet

    = SpreadsheetApp.getActiveSpreadsheet(); // 取得したスプレッドシート内の「管理機能」という名前のシートを取得します。 var sheetManagement = spreadSheet.getSheetByName('管理機能'); // 「管理機能」という名前のシートの中のすべてのデータを取得します。 var dataManagement = sheetManagement.getDataRange().getValues(); // 要件③の営業時間内だけ送りたいに対応していきます。 /// 「checkSendingStatus」という関数を用意して送って良いなら「true」、だめなら「 false」としたい。→Aへ移動。 // B: 「checkSendingStatus」の実行結果には「result」の中身が入っています(trueかfalse か)。それを「sendingStatus」という箱にいれておきます。 var sendingStatus = checkSendingStatus(dataManagement); // ここで「sendingStatus」がfalseであれば送ってはだめなので処理を止めます。これより 下の処理を無視してここで終了。 if (sendingStatus === false) { return; } // 「sendingStatus」がtureであれば処理を続行します。 // 「営業リスト」という名前のシートの中のすべてのデータを取得します。 var sheetList = spreadSheet.getSheetByName('営業リスト'); var dataList = sheetList.getDataRange().getValues(); // 「営業リスト(GAS用)」という名前のシートの中のすべてのデータを取得します。 var sheetListGas = spreadSheet.getSheetByName('営業リスト(GAS用)'); var dataListGas = sheetListGas.getDataRange().getValues(); // 「メール文面」という名前のシートの中のすべてのデータを取得します。 var sheetMail = spreadSheet.getSheetByName('メール文面'); var dataMailTemplate = sheetMail.getDataRange().getValues(); // ここからメールを送る処理を開始します。 /// 「営業リスト(GAS用)」内のデータが「dataListGas」という箱に入っています。いつで もその2行目がメールを送るべき対象となっています。 // 今回のメール送信が何回目かを「times」という箱に入れます。ステップメール何回目の テンプレートを使うかを決めるときに使います。 var times = dataListGas[1][6] + 1; // 使うメール文面を「メール文面」のシートの中から選びます。 var subject = dataMailTemplate[1][times];
  3. var body = dataMailTemplate[2][times]; // メール送信を実行する。 GmailApp.sendEmail(dataListGas[1][4], subject, body, {from:

    dataManagement[3][1], name: dataManagement[2][1]}); // 今回送ったリストの最終送信日時と送信回数を更新する。 for (var i = 1; i < dataList.length; i++) { if (dataList[i][4] === dataListGas[1][4]) { sheetList.getRange(i + 1, 6).setValue(new Date()); sheetList.getRange(i + 1, 7).setValue(times); } } } // A: メールを送って良いかチェックします。 /// 「dataManagement」の中には「管理機能」シートの中のすべてのデータが入っていま す。 function checkSendingStatus(dataManagement) { // 今の日時を取得しておきます。今が営業時間か判断するために使います。 var today = new Date(); // 「管理機能」シートに書いてある送っていい時間帯の始点(=startTime)と終点 (endTime)をそれぞれ取得します。 var startTime = new Date(dataManagement[1][1]); // 「startTime」に入っているのはただの時間(9:00とか)なのでそれを今日のその時間 (2020/12/22 9:00)という形に変換します。日付の比較をしやすくするためです。 var startDate = new Date(today.getFullYear(), today.getMonth(), today.getDate(), startTime.getHours(), startTime.getMinutes(), 0); // 終点(endTime)も同様です。 var endTime = new Date(dataManagement[1][3]); var endDate = new Date(today.getFullYear(), today.getMonth(), today.getDate(), endTime.getHours(), endTime.getMinutes(), 0); // ここからif文を開始します。送っていいなら「result」にtrueを、だめならfalseを入れま す。 // 条件1: 「dataManagement[0][1] === '停止中'」→これは営業リストをメンテナンスして いるときなどちょっと一瞬止めたいというときに管理機能で「停止中」にすると止めれるよ うにしています。 // 条件2: 「MailApp.getRemainingDailyQuota() <= 0」→これはGAS経由で1日に送ってい いメールの上限がある(無料のアカウントだと500通)のでそれに達していないかチェックし ます。 // 条件1、2がだめなら問答無用で送信したらだめなのでfalseにします。 // ※ 「||」は「または(or)を意味していて、1か2どちらかに引っかかったらそれでアウト ということです。」 if (dataManagement[0][1] === '停止中' || MailApp.getRemainingDailyQuota() <= 0) { var result = false;
  4. // 条件3: 1,2がOKなら条件3をチェックします。「today < startDate || today > endDate」 これはさっき取得した営業時間の間にあるかどうかをチェックします。

    } else if (today < startDate || today > endDate) { var result = false; // 条件3にも引っかからない(=営業時間内である)のであれば送って良いのでtrueにします。 } else { var result = true; } // 最後にこの処理を終了して元の処理に戻ります。→Bへ移動。 return result; }