Upgrade to Pro — share decks privately, control downloads, hide ads and more …

20210827_RPA勉強会!Google Apps Talk~GASでGmail活用術~

Apachan
August 27, 2021

20210827_RPA勉強会!Google Apps Talk~GASでGmail活用術~

Apachan

August 27, 2021
Tweet

More Decks by Apachan

Other Decks in Programming

Transcript

  1. RPA勉強会!
    Google Apps Talk
    #3
    2021/08/27
    1
    〜GASでGmail活用術〜
    ※ 本内容は個人的な見解であり、所属する組織と関係ありません。

    View Slide

  2. 自己紹介
    Apachan
    @ApachanHonpo
    埼玉県戸田市
    宮城県仙台市
    会社員&副業
    2
    お仕事...

    View Slide

  3. 宣伝
    3
    2021/3
    発売
    2020/5
    発売
    来春
    改定版
    発売予定
    徹底解説 RPAツール
    WinActor導入・応用 完全ガ
    イド
    絶対失敗しない!ロボット
    1000体導入してわかった
    RPA成功の秘訣
    Google Apps Script
    目的別リファレンス
    実践サンプルコード付き
    GAS本大幅リニューアルの方向で対応中

    View Slide

  4. スタンス
    4
    ・業務効率化が主目的
    ・ツール選定は是々非々
    ・GASは超有効な手段のひとつ

    View Slide

  5. 参加者属性① - GASの経験
    5
    データソース:
    connpass申込時アンケート(n = 72)
    2021/08/26時点

    View Slide

  6. 参加者属性② - RPAの経験
    6
    データソース:
    connpass申込時アンケート(n = 72)
    2021/08/26時点

    View Slide

  7. 参加者属性③ - 職種
    7
    データソース:
    connpass申込時アンケート(n = 72)
    2021/08/26時点

    View Slide

  8. 8

    View Slide

  9. Google Apps Script 利用のきっかけ
    9
    日々システムの問い合わせに追われる毎日

    View Slide

  10. Google Apps Script 導入後
    10
    定型の問い合わせをGASで自動化

    80 %
    残りは手動
    全体的にレス
    ポンスが改善

    View Slide

  11. Google Apps Scriptの特徴
    11
    ★ JavaScriptベースのプログラミング言語
    ・RPAとは違ってコードの記述が必要
    ・2020年2月にECMASCRIPT2015対応
    ・Googleアプリ操作のクラスが充実
    ・SlackなどのSaaSと相性が良い
    ・外部サイトのスクレイピングも可
    ★ クラウドベースの実行環境
    ・クライアントPCの操作は不可
    ・クライアントPCへのインストール不要(激楽)
    ・クライアントPC起動有無に関わらず24時間スケジュール実行が可能
    ・第3者との環境差分の考慮が不要
    ★ 無償と有償アカウントの違い
    ・利用できる機能にほぼ差分なし
    ・メール送信数・実行時間などスクリプト実行制限に差分あり
    ※ Google Workspace導入企業であれば基本的に利用可能なケースが多い

    View Slide

  12. 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対応

    View Slide

  13. 注意点
    13
    ・ローカル環境の操作は一切できない
    ・利用制限を超えるとスクリプトが実行できなくなる ex )6分/回
    ・ごく稀にサーバー側の不具合でことごとくエラーがでることがある

    View Slide

  14. 考察① RPAとの棲み分け
    14
    RPAとの棲み分け整理で保守運用が安定
    ローカル環境
 クラウド環境

    Googleアプリ内の操作や
    SaaS連携はGAS, それ以外
    はRPAにおまかせ★
    GUI操作のSaaS連携は超カ
    ンタン!細かい処理は有償
    プランや対応外!?

    View Slide

  15. 考察② アプリ開発
    15
    ノーコード/ローコードツールの可能性を拡大

    View Slide

  16. 考察③ GIGAスクール構想
    16
    小学生からGoogle Apps主体の教育現場

    View Slide

  17. 現在の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
    難易度 活用度

    View Slide

  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③(重複メールの除去)

    View Slide

  19. 19

    View Slide

  20. 今回のテーマ Gmailの活用術
    20

    View Slide

  21. 前回との違い
    21
    https://www.youtube.com/watch?v=IAqiyIG8Ujc
    前回 #2 メールの送信 今回 #3 受信メールの監視

    View Slide

  22. 受信メールの監視 想定業務
    22
    ・問い合わせメールの管理
    ・多数の返信が発生する案件管理
    ・メールをチャットへカスタマイズして転送
    ...etc

    View Slide

  23. GASとRPA(RDA)との違い
    23
    RPA(RDA) GAS
    クライアント ローカルPC、もしくは仮想環境の起動
    が必須 電源ON
    Googleサーバー上動作のためクライア
    ント環境不要 電源OFF
    ライセンス 必要 ※ 頻度が高いほど占有 不要 ※ 別途制限あり
    GmailのUI変更 影響あり 影響なし

    View Slide

  24. GmailAppサービス概要
    24
    GmailMessage
    GmailThread
    GmailApp

    View Slide

  25. 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の中!

    View Slide

  26. 26
    Let's Try 特定メールをスプレッドシートに書出す!
    Step ToDo
    事前準備 検索対象メールの送信
    ① 受信メールの検索条件の設定
    ② 検索条件にマッチするGmailThreadsの取得
    ③ GmailThreadsからGmailMessageの取得
    ④ メールID、受信日時、件名、差出人、本文などシート最終行に追加
    ⑤ トリガーの設定
    ⑥ 試実行 → 重複メールの対処が必要
    ⑦ 重複メールの除外
    おまけ 本文からテキスト抽出

    View Slide

  27. 事前準備 検索対象メールの送信
    27
    件名
    本文
    発送依頼202108271900
    ご担当者様
    お疲れ様です。
    以下ご対応お願いします。
    発送先:名古屋
    発送物:大型什器2、丸テーブル1
    種別:緊急
    備考:着払い
    よろしくお願いします。
    自分自身

    セット
    テキストはコチラ

    View Slide

  28. Step① 受信メールの検索条件の設定
    28
    newer_than演算子を活用して対象の絞り込み
    Gmailの検索演算子

    View Slide

  29. Step② 検索条件にマッチするGmailThreadsの取得
    29
    function myFunction(){
    const threads = GmailApp.search('Step①で作成した検索条件');
    Logger.log(threads); // [GmailThread, GmailThread, GmailThread, ...]
    }
    ※ 本スクリプトを実行するアカウントに紐付く受信メールが検索対象になります。

    View Slide

  30. 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]
    }
    }

    View Slide

  31. 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]);
    }

    View Slide

  32. Step⑤ トリガーの設定
    32
    画面操作で設定OK!
    1
    2
    3
    4
    5

    View Slide

  33. Step⑥ 重複メールの対処が必要
    33
    重複
    重複
    重複

    View Slide

  34. Step⑦ 重複メールの除外 3パターン
    34
    項目 ① トリガー実行間隔調整 ② メールIDの活用 ③ プロパティストアの活用
    内容
    検索時に遡る時間とトリ
    ガーの時間間隔を合わせる
    処理したメールのIDと重複
    しないものを処理
    処理したメールの受信日時
    のプロパティストアに保存
    記述量 少 中 多
    正確性
    秒単位のタイムラグがある
    あるため漏れ発生の可能性
    あり
    同一アカウントで実行する
    限りは正確
    秒単位で複数メール受信し
    ている場合は漏れ発生の可
    能性あり
    その他
    メールチェックのタイミン
    グは1時間以下にはできない
    Message-IDを利用すれば複
    数名での運用もOK
    様々なケースで応用が可能

    View Slide

  35. 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]);
    }

    View Slide

  36. おまけ 本文からテキスト抽出
    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];

    View Slide

  37. End Of File
    37

    View Slide