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
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
240
2025年 コミュニティ×ビジネスのリアル_Mitz
comucal
PRO
0
250
コミュニティが仕事になった人間の意識|娯楽志向か情報志向か
comucal
PRO
0
110
生成AI情報2025.3.21
comucal
PRO
0
140
テック系コミュニティの参加者を徹底分析_株式会社コミュカル Mitz
comucal
PRO
0
220
AppSheet タスク管理アプリ 中級編
comucal
PRO
0
690
参加人数が多ければ正解?
comucal
PRO
0
430
交流会のコツ 自己紹介編~コミュ学~
comucal
PRO
0
240
コミュニティ運営勉強会OP
comucal
PRO
0
180
Other Decks in Technology
See All in Technology
Post AI時代のリファクタリング実践記 / Refactoring in the post AI era
kaminashi
1
290
ストレスなくAIと付き合いたい!こんなときどうしてる?
namiki64
4
610
USB PDを使ってスマホを労わりたい
raspython3
0
180
スキマバイトという雇用形態は存在しないので、雇用期間1日のアルバイト契約を事業者とワーカーが結ぶ手続きを支えるのがタイミーなんです
akitoshiga
0
210
AIカンパニーへの転換を支えた、エンジニアの仕事の再定義
kworkdev
PRO
2
1.3k
JAWSUG TOHOKU 青森支部 「LoGoチャット」のAWS移行で 乗り越えたこと
taketakekaho
0
340
AI コーディングと人間の認知スループット / CTO Night & Day 2026 Morning Session / AI Coding and Human Cognitive Throughput
prog893
5
1.3k
Persisting Massive Data with Rails ~Designing for 60 billion rows, and fighting the bottlenecks~ Railsで挑む大量データ永続化 〜600億件を永続化するための設計とボトルネックとの戦い〜
occhi
0
740
オントロジーって 結局なにもの? AI エージェントに「意味」を渡す知識設計の話
greenmidori
0
230
Kiro Crewで「みのるん式」仕事術やってみた
minorun365
PRO
3
690
Refining Active Record
shugo
0
160
[JAWS-UG彩の国埼玉#12]そろそろ準備する?re:Invent2026をやさしく解説 / reinvent2026-sainokuni
sh_fk2
1
360
Featured
See All Featured
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
The Cost Of JavaScript in 2023
addyosmani
55
10k
Docker and Python
trallard
47
4.2k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
560
The World Runs on Bad Software
bkeepers
PRO
72
12k
The SEO identity crisis: Don't let AI make you average
varn
0
590
Designing for humans not robots
tammielis
254
26k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
31k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
1
570
We Have a Design System, Now What?
morganepeng
55
8.4k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Mind Mapping
helmedeiros
1
400
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; }