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
20210827_RPA勉強会!Google Apps Talk~GASでGmail活用術~
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Apachan
August 27, 2021
Programming
0
10k
20210827_RPA勉強会!Google Apps Talk~GASでGmail活用術~
Apachan
August 27, 2021
Tweet
Share
More Decks by Apachan
See All by Apachan
20220706_Google Apps Scriptを実演で学ぶ~ GAS × Slack ~
apachan
2
1.6k
20220428_実務で使える Google Apps Script ライブデモ勉強会#3
apachan
0
520
20211111_実務で使えるGASライブデモ勉強会#2
apachan
0
110
20210921_LT_RPAの現実
apachan
0
2.6k
実務で使えるGASライブデモ勉強会
apachan
0
100
Other Decks in Programming
See All in Programming
Premier Disciplin for Micro Frontends Multi Version/ Framework Scenarios @OOP 2026, Munic
manfredsteyer
PRO
0
190
15年目のiOSアプリを1から作り直す技術
teakun
0
510
浮動小数の比較について
kishikawakatsumi
0
340
2025年の活動の振り返り
hideg
0
120
猫の手も借りたい!ので AIエージェント猫を作って社内に放した話 Claude Code × Container Lambda の Slack Bot "DevNeko"
naramomi7
0
210
AIとペアプロして処理時間を97%削減した話 #pyconshizu
kashewnuts
1
150
AI時代でも変わらない技術コミュニティの力~10年続く“ゆるい”つながりが生み出す価値
n_takehata
2
450
今、アーキテクトとして 品質保証にどう関わるか
nealle
0
180
Package Management Learnings from Homebrew
mikemcquaid
0
280
Rails Girls Tokyo 18th GMO Pepabo Sponsor Talk
yutokyokutyo
0
170
生成AIを活用したソフトウェア開発ライフサイクル変革の現在値
hiroyukimori
PRO
0
140
生成AIを使ったコードレビューで定性的に品質カバー
chiilog
1
310
Featured
See All Featured
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
86
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
117
110k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.6k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
Navigating Weather and Climate Data
rabernat
0
120
The Power of CSS Pseudo Elements
geoffreycrofte
80
6.2k
Designing for Timeless Needs
cassininazir
0
140
Color Theory Basics | Prateek | Gurzu
gurzu
0
210
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
130
How to Think Like a Performance Engineer
csswizardry
28
2.5k
From π to Pie charts
rasagy
0
140
Transcript
RPA勉強会! Google Apps Talk #3 2021/08/27 1 〜GASでGmail活用術〜 ※ 本内容は個人的な見解であり、所属する組織と関係ありません。
自己紹介 Apachan @ApachanHonpo 埼玉県戸田市 宮城県仙台市 会社員&副業 2 お仕事...
宣伝 3 2021/3 発売 2020/5 発売 来春 改定版 発売予定 徹底解説
RPAツール WinActor導入・応用 完全ガ イド 絶対失敗しない!ロボット 1000体導入してわかった RPA成功の秘訣 Google Apps Script 目的別リファレンス 実践サンプルコード付き GAS本大幅リニューアルの方向で対応中
スタンス 4 ・業務効率化が主目的 ・ツール選定は是々非々 ・GASは超有効な手段のひとつ
参加者属性① - GASの経験 5 データソース: connpass申込時アンケート(n = 72) 2021/08/26時点
参加者属性② - RPAの経験 6 データソース: connpass申込時アンケート(n = 72) 2021/08/26時点
参加者属性③ - 職種 7 データソース: connpass申込時アンケート(n = 72) 2021/08/26時点
8
Google Apps Script 利用のきっかけ 9 日々システムの問い合わせに追われる毎日
Google Apps Script 導入後 10 定型の問い合わせをGASで自動化 約 80 % 残りは手動
全体的にレス ポンスが改善
Google Apps Scriptの特徴 11 ★ JavaScriptベースのプログラミング言語 ・RPAとは違ってコードの記述が必要 ・2020年2月にECMASCRIPT2015対応 ・Googleアプリ操作のクラスが充実 ・SlackなどのSaaSと相性が良い
・外部サイトのスクレイピングも可 ★ クラウドベースの実行環境 ・クライアントPCの操作は不可 ・クライアントPCへのインストール不要(激楽) ・クライアントPC起動有無に関わらず24時間スケジュール実行が可能 ・第3者との環境差分の考慮が不要 ★ 無償と有償アカウントの違い ・利用できる機能にほぼ差分なし ・メール送信数・実行時間などスクリプト実行制限に差分あり ※ Google Workspace導入企業であれば基本的に利用可能なケースが多い
Google Apps Scriptの構成 12 Advanced Google services Google WorkSpace services
(Googleアプリ特有) Script Services (Googleアプリ共通) Standard built-in objects JS構文 演算子/関数/データ 型 etc DOM/Window Object etc Google Apps Script JavaScript ※ 2020年2月よりECMASCRIPT2015対応
注意点 13 ・ローカル環境の操作は一切できない ・利用制限を超えるとスクリプトが実行できなくなる ex )6分/回 ・ごく稀にサーバー側の不具合でことごとくエラーがでることがある
考察① RPAとの棲み分け 14 RPAとの棲み分け整理で保守運用が安定 ローカル環境 クラウド環境 Googleアプリ内の操作や SaaS連携はGAS, それ以外 はRPAにおまかせ★
GUI操作のSaaS連携は超カ ンタン!細かい処理は有償 プランや対応外!?
考察② アプリ開発 15 ノーコード/ローコードツールの可能性を拡大
考察③ GIGAスクール構想 16 小学生からGoogle Apps主体の教育現場
現在のGASアウトプット活動 17 週1回朝活でライブコーディング実施 #01 #02 #03 #04 #05 #06 #07
#08 #09 #10 #11 #12 #13 #14 #15 #16 #17 #18 #01 #02 #03 #04 #05 #06 #07 #08 #09 #10 #11 #12 #13 #14 #15 #16 #17 #18 難易度 活用度
実施内容 18 #01 ~ 二次元配列①(concat()/データ結合) #02 ~ 二次元配列②(スプレッド構文) #03 ~
二次元配列③(破壊メソッド/非破壊メソッド/shift()/push()/pop()) #04 ~ 分割代入/アロー関数 #05 ~ 反復メソッド(map()/filter()) #06 ~ フォームの扱い①(基本の作成方法/イベントオブジェクトの構造) #07 ~ フォームの扱い②(オブジェクトの取り扱い/残余引数) #08 ~ フォームの扱い③( FormResponseオブジェクト/Slackへの通知) #09 ~ フォームの扱い④(特定の設問と回答のみ抽出する方法) #10 ~ SSに編集があった際のイベントオブジェクト扱い/転記処理 #11 ~ HTMLメール①( HTML/CSSとは?/CSSの扱い方) #12 ~ HTMLメール②( HTMLへの変数の埋め込み/表形式) #13 ~ ワークフロー①(フォームからHTMLメールを送信) #14 ~ ワークフロー②(URL(リクエスト)に対応した処理作成 ※ 承認/否認各々の処理) #15 ~ ライブラリの使い方 #16 ~ Gmail①(GmailAppクラス) #17 ~ Gmail②(本文抽出) #18 ~ Gmail③(重複メールの除去)
19
今回のテーマ Gmailの活用術 20
前回との違い 21 https://www.youtube.com/watch?v=IAqiyIG8Ujc 前回 #2 メールの送信 今回 #3 受信メールの監視
受信メールの監視 想定業務 22 ・問い合わせメールの管理 ・多数の返信が発生する案件管理 ・メールをチャットへカスタマイズして転送 ...etc
GASとRPA(RDA)との違い 23 RPA(RDA) GAS クライアント ローカルPC、もしくは仮想環境の起動 が必須 電源ON Googleサーバー上動作のためクライア ント環境不要
電源OFF ライセンス 必要 ※ 頻度が高いほど占有 不要 ※ 別途制限あり GmailのUI変更 影響あり 影響なし
GmailAppサービス概要 24 GmailMessage GmailThread GmailApp
25 GmailThreads GmailMessages GmailThreads[0] GmailThreads[1] GmailThreads[2] GmailThreads[3] GmailThreads[4] GmailMessages[0] GmailMessages[0]
GmailMessages[0] GmailMessages[0] GmailMessages[0] GmailMessages[1] GmailMessages[1] GmailMessages[2] ※ イメージ図 GmailMessageは必ずGmailThreadの中!
26 Let's Try 特定メールをスプレッドシートに書出す! Step ToDo 事前準備 検索対象メールの送信 ① 受信メールの検索条件の設定
② 検索条件にマッチするGmailThreadsの取得 ③ GmailThreadsからGmailMessageの取得 ④ メールID、受信日時、件名、差出人、本文などシート最終行に追加 ⑤ トリガーの設定 ⑥ 試実行 → 重複メールの対処が必要 ⑦ 重複メールの除外 おまけ 本文からテキスト抽出
事前準備 検索対象メールの送信 27 件名 本文 発送依頼202108271900 ご担当者様 お疲れ様です。 以下ご対応お願いします。 発送先:名古屋
発送物:大型什器2、丸テーブル1 種別:緊急 備考:着払い よろしくお願いします。 自分自身 に セット テキストはコチラ
Step① 受信メールの検索条件の設定 28 newer_than演算子を活用して対象の絞り込み Gmailの検索演算子
Step② 検索条件にマッチするGmailThreadsの取得 29 function myFunction(){ const threads = GmailApp.search('Step①で作成した検索条件'); Logger.log(threads);
// [GmailThread, GmailThread, GmailThread, ...] } ※ 本スクリプトを実行するアカウントに紐付く受信メールが検索対象になります。
Step③ GmailThreadsからGmailMessageの取得 30 function myFunction(){ const threads = GmailApp.search('Step①で作成した検索条件'); Logger.log(threads);
// [GmailThread, GmailThread, GmailThread, ...] for(const thread of threads){ const messages = thread.getMessages(); Logger.log(messages); // [GmailMessage, GmailMessage, ...] const message = messages[0] } }
Step④ 各種情報のシート最終行追加 31 // for ブロックの中 for(const thread of threads){
const messages = thread.getMessages(); const message = messages[0] const mailId = message.getId(); const mailDate = message.getFrom(); const mailBody = message.getPlainBody(); const sh = SpreadsheetApp.getActivesheet(); sh.appendRow([mailId, mailDate, mailBody]); }
Step⑤ トリガーの設定 32 画面操作で設定OK! 1 2 3 4 5
Step⑥ 重複メールの対処が必要 33 重複 重複 重複
Step⑦ 重複メールの除外 3パターン 34 項目 ① トリガー実行間隔調整 ② メールIDの活用 ③
プロパティストアの活用 内容 検索時に遡る時間とトリ ガーの時間間隔を合わせる 処理したメールのIDと重複 しないものを処理 処理したメールの受信日時 のプロパティストアに保存 記述量 少 中 多 正確性 秒単位のタイムラグがある あるため漏れ発生の可能性 あり 同一アカウントで実行する 限りは正確 秒単位で複数メール受信し ている場合は漏れ発生の可 能性あり その他 メールチェックのタイミン グは1時間以下にはできない Message-IDを利用すれば複 数名での運用もOK 様々なケースで応用が可能
Step⑦ メールIDによる重複除外 35 // (続)for ブロックの中 // 既存IDの取得 const cols
= sh.getRange(1, 1, sh.getLastRow(), 1).getValues(); console.log(cols); const col = cols.flat(); console.log(col); // 既存IDに新しく取得したメールIDが存在しなければ... if(!col.includes(mailId)){ // 最終行に挿入 sh.appendRow([mailId, mailDate, mailBody]); }
おまけ 本文からテキスト抽出 36 // 本文(mailBody)からのテキスト抽出 // 正規表現を使って「名前」と「改行改行」の間の文字列を取得 const part =
mailBody.match(/発送先([\s\S]*?)\r\n\r\n/)[0]; // 中身チェック console.log(part); // テキスト抽出 const str01 = part.split('発送先:')[1].split('\r\n')[0]; const str02 = part.split('発送物:')[1].split('\r\n')[0]; const str03 = part.split('種別:')[1].split('\r\n')[0]; const str04 = part.split('備考:')[1].split('\r\n')[0];
End Of File 37