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
Apachan
August 27, 2021
Programming
0
9.9k
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.5k
20220428_実務で使える Google Apps Script ライブデモ勉強会#3
apachan
0
450
20211111_実務で使えるGASライブデモ勉強会#2
apachan
0
97
20210921_LT_RPAの現実
apachan
0
2.5k
実務で使えるGASライブデモ勉強会
apachan
0
88
Other Decks in Programming
See All in Programming
Pythonでもちょっとリッチな見た目のアプリを設計してみる
ueponx
0
180
CNCF Project の作者が考えている OSS の運営
utam0k
5
610
ペアーズでの、Langfuseを中心とした評価ドリブンなリリースサイクルのご紹介
fukubaka0825
1
180
さいきょうのレイヤードアーキテクチャについて考えてみた
yahiru
1
440
Simple組み合わせ村から大都会Railsにやってきた俺は / Coming to Rails from the Simple
moznion
3
3.5k
Terraform で作る Amazon ECS の CI/CD パイプライン
hiyanger
0
110
Linux && Docker 研修/Linux && Docker training
forrep
21
3.8k
DMMオンラインサロンアプリのSwift化
hayatan
0
230
HTML/CSS超絶浅い説明
yuki0329
0
210
shadcn/uiを使ってReactでの開発を加速させよう!
lef237
0
370
ASP. NET CoreにおけるWebAPIの最新情報
tomokusaba
0
190
2024年のkintone API振り返りと2025年 / kintone API look back in 2024
tasshi
0
160
Featured
See All Featured
Adopting Sorbet at Scale
ufuk
74
9.2k
Art, The Web, and Tiny UX
lynnandtonic
298
20k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
28
4.5k
Music & Morning Musume
bryan
46
6.3k
How STYLIGHT went responsive
nonsquared
96
5.3k
No one is an island. Learnings from fostering a developers community.
thoeni
19
3.1k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
Side Projects
sachag
452
42k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.6k
A Modern Web Designer's Workflow
chriscoyier
693
190k
Docker and Python
trallard
43
3.2k
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