Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
201222 GASでメールを自動で送るマシンを作ろう 資料 野口さん
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
comucal
PRO
December 22, 2020
Technology
1.9k
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
230
2025年 コミュニティ×ビジネスのリアル_Mitz
comucal
PRO
0
250
コミュニティが仕事になった人間の意識|娯楽志向か情報志向か
comucal
PRO
0
110
生成AI情報2025.3.21
comucal
PRO
0
140
テック系コミュニティの参加者を徹底分析_株式会社コミュカル Mitz
comucal
PRO
0
210
AppSheet タスク管理アプリ 中級編
comucal
PRO
0
680
参加人数が多ければ正解?
comucal
PRO
0
420
交流会のコツ 自己紹介編~コミュ学~
comucal
PRO
0
240
コミュニティ運営勉強会OP
comucal
PRO
0
180
Other Decks in Technology
See All in Technology
その Lambda、8分で 管理者権限まで奪われます
k1nakayama
7
3.4k
EventBridge に「合流」はない ― サーバーレスのワークフローを育てるということ / No Join in EventBridge
yusukeshimizu
2
360
Minecraft JavaのMODをSwiftで作る
1mash0
0
190
AI coding 整合正規方法
philipz
0
410
AIは推し活である。
kurazuuuuuu
1
900
Claude Codeを「使うほど育つ」AI秘書にするノウハウ
minorun365
PRO
33
29k
Goodbye ShellScript, Hello File-based App
shunsock
0
500
Oracle Cloud Network Path Analyzerを試してみた/I Tried Out Oracle Cloud Network Path Analyzer
masakiokuda
1
110
なぜ「決定性」が 決定的に重要なのか? Durable Execution 基盤の数理的理解 #serverlessjp / ServerlessDays Tokyo 2026
ytaka23
3
1k
登壇の自信を奪う3匹のオバケ / 3 Ghosts That Rob You of Your Confidence in Public Speaking
pauli
9
1k
「どのログを見ればいい?」 から始めた サーバーレス障害解析
y_waka1
1
110
JSONataとAWS Step Functionsで目指すRuntimelessな世界
mu7889yoon
0
330
Featured
See All Featured
The SEO Collaboration Effect
kristinabergwall1
1
570
Discover your Explorer Soul
emna__ayadi
2
1.3k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
250
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
280
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
2k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
300
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.2k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
240
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.4k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Making Projects Easy
brettharned
120
6.8k
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; }