Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
201222 GASでメールを自動で送るマシンを作ろう 資料 野口さん
Search
comucal
PRO
December 22, 2020
Technology
1.8k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
201222 GASでメールを自動で送るマシンを作ろう 資料 野口さん
comucal
PRO
December 22, 2020
More Decks by comucal
See All by comucal
「駆動」って言葉、なんかカッコイイ_Mitz
comucal
PRO
0
210
2025年 コミュニティ×ビジネスのリアル_Mitz
comucal
PRO
0
230
コミュニティが仕事になった人間の意識|娯楽志向か情報志向か
comucal
PRO
0
97
生成AI情報2025.3.21
comucal
PRO
0
130
テック系コミュニティの参加者を徹底分析_株式会社コミュカル Mitz
comucal
PRO
0
190
AppSheet タスク管理アプリ 中級編
comucal
PRO
0
650
参加人数が多ければ正解?
comucal
PRO
0
410
交流会のコツ 自己紹介編~コミュ学~
comucal
PRO
0
220
コミュニティ運営勉強会OP
comucal
PRO
0
170
Other Decks in Technology
See All in Technology
仕様駆動開発、導入半年。「本当に速くなってるの?」にデータで答える / AICon2026_hirakawa
rakus_dev
0
310
インフラと開発の垣根を超えていき!〜元AWSインフラエンジニアがAWS開発で奮闘している話〜
hatahata021
3
390
生成 AI 時代にいま一度「問い合わせ」について考えてみる
kazzpapa3
1
130
生成AI×AWS CDK×AWS FISで"振り返れる"ミニGameDayをつくろう
yoshimi0227
2
520
事業成長とAI活用を止めないデータ基盤アーキテクチャの設計思想
hiracky16
0
430
“それは自分の仕事じゃない"を越えて行け
yuukiyo
1
520
非定型なドキュメントを効率よくリファクタする 〜えぇ!?仕様書27本の移行が1日で終わったって!?〜
subroh0508
2
610
凡エンジニアがこの先生きのこるためには。〜TypeScript完全に理解したい〜
alchemy1115
2
410
reFACToring
moznion
0
110
書籍セキュアAPIについて
riiimparm
0
160
JAWS_ICEBERG_BASECAMP
iqbocchi
2
110
2年前に削除したPHPクラスが、 ある日突然決済をエラーにした
ykagano
1
730
Featured
See All Featured
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.1k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.5k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.4k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
260
A Soul's Torment
seathinner
6
3.1k
The World Runs on Bad Software
bkeepers
PRO
72
12k
First, design no harm
axbom
PRO
2
1.2k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.2k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.5k
RailsConf 2023
tenderlove
30
1.5k
Are puppies a ranking factor?
jonoalderson
1
3.7k
Designing Experiences People Love
moore
143
24k
Transcript
- 本題の前にTips - Gmailについて - 今日のテーマ - GASを使ってメールを自動で送るマシンを作ってみよう! - 狙い
- 「GASには興味があるけど、実際にはどうやって使えばいいかわからな い・・・」 - そんな方に向けてもっともっとGASに興味を持ってモチベーション高く学習 を継続いただけるように、今回は「GASを使えばこんな業務に応用できるの か!」ということを知ってもらう回にしたいと思います。 - 今回扱うのは「メール送信の自動化」特定のリストに、特定のルールでメー ルを送る機会が社内外で多そう、という予測の元テーマに選定。 - (補足)今日は「GASいいかも!」と思っていただけることを最優先にして いるので細かい処理の解説は省きます。ご需要があれば次回のGoogle Apps Talkではこの会の実装を例にGASの細かい処理を解説していこうかなと思っ ております。 - 背景設定 - 営業リストが存在しており、それに対し新規リードを獲得する目的でステッ プメール的な感じで訴求を変えながらメールを送っていくという行為を自動 化したいと考えている。 - やりたいこと - ① 営業リストを貼っつけておけば勝手にメールを送ってくれる。 - ② メールを送った回数に応じてメールの文面を変更したい。 - = ステップメール施策を取り入れたい。 - ③ 営業時間外にはメールを送りたくない。 - = 深夜にメール送ったりしたくない。 - 今回は上記を達成すればOKということにして実装をしていきたいと思いま す。 では実際にGASのスクリプト編集画面をみながら実装していきましょう! (今日はハンズオンではないので実装の流れとアウトプットの流れを見て、知っていただけ ればと思います。)
【参考】今回のスクリプト 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];
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;
// 条件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; }