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

Google Apps Script で始める RPA / RPA starting with GAS

tanabee
September 20, 2018

Google Apps Script で始める RPA / RPA starting with GAS

Google Cloud Next '18 in Tokyo (2018/09/19-20) の登壇資料です。
https://cloud.withgoogle.com/next18/tokyo/sessions/session/223235

登壇の詳細についてはこちら
https://qiita.com/tanabee/items/337c29c303e8729e144a

リンク遷移できる Google スライド版もあります(Google スライド推奨)。
https://docs.google.com/presentation/d/16Oo0_rVPl-gieZNAj2HNtWqQMJCPhW27CqLk-c5peyY/edit?usp=sharing

tanabee

September 20, 2018
Tweet

More Decks by tanabee

Other Decks in Programming

Transcript

  1. Google Apps Script で始める RPA
    田邉 裕貴
    株式会社グロービス,リードエンジニア
    2018/09/19

    View Slide

  2. 田邉 裕貴
    株式会社グロービス
    リードエンジニア
    ヤフー > VR スタートアップ > グロービス
    グロービスのラーニングプラットフォームチームに所属。
    業務自動化、スクラムの普及、採用なども行う。
    Speaker

    View Slide

  3. - Qiita: tanabee
    - GitHub: tanabee
    - Twitter: @_tanabee
    Speaker

    View Slide

  4. Qiita に Google Apps Script (GAS) ネタ投稿しています
    - GAS ビギナーが GAS を使いこなすために知るべきこと 10 選
    - Google Apps Script (GAS) で毎週 30 分の雑務を自動化した話
    - 3 分で作る無料の翻訳 API
    など
    Speaker

    View Slide

  5. Agenda
    ● RPA とは
    ● Google Apps Script とは
    ● Google Apps Script の強み・弱み
    ● グロービスでの RPA の取り組み・事例集

    View Slide

  6. 1 RPA とは

    View Slide

  7. RPA とは
    - Robotic Process Automation の略。
    - ロボットによる業務自動化
    - RPA はこれまで人間が行ってきた定型的なパソコン操作を
    ソフトウエアのロボットにより自動化するもの
    http://www.soumu.go.jp/menu_news/s-news/02tsushin02_04000043.html

    View Slide

  8. 身の回りの RPA
    - Excel のマクロ
    - メールのフィルタ、既読処理など
    - Web サービス間連携
    - Web アプリケーションを用いた既存業務の自動化

    View Slide

  9. RPA 導入状況 ( 2017 年調査 )
    - 国内企業の
    - 14.1% が導入済み
    - 6.3% が導入中
    - 19.1% が導入を検討中
    http://www.soumu.go.jp/menu_news/s-news/02tsushin02_04000043.html

    View Slide

  10. RPA 市場 ( 2017 年調査 )
    - 2017 年度 : 31 億円
    - 2021 年度 : 100 億円規模
    http://www.soumu.go.jp/menu_news/s-news/02tsushin02_04000043.html

    View Slide

  11. RPA の 3 つの段階
    http://www.soumu.go.jp/menu_news/s-news/02tsushin02_04000043.html
    クラス 作業範囲や利用技術
    1: RPA ( Robotic Process Automation ) 情報取得や入力作業、検証作業など
    2: EPA( Enhanced Process Automation ) AI 技術を用いることによる非定型作業
    3: CA( Cognitive Automation ) プロセスの分析や改善、意思決定までを自ら自動化

    View Slide

  12. RPA の 3 つの段階
    http://www.soumu.go.jp/menu_news/s-news/02tsushin02_04000043.html
    クラス 作業範囲や利用技術
    1: RPA ( Robotic Process Automation ) 情報取得や入力作業、検証作業など
    2: EPA( Enhanced Process Automation ) AI 技術を用いることによる非定型作業
    3: CA( Cognitive Automation ) プロセスの分析や改善、意思決定までを自ら自動化

    View Slide

  13. 2 Google Apps Script とは

    View Slide

  14. Google Apps Script とは
    - Google Apps ( Spreadsheet, Docs, Gmail, Slide など ) の API を
    簡単にクラウドで実行できる環境
    - G Suite に強い FaaS
    - GAS と略される

    View Slide

  15. Google Apps Script の言語環境
    - プログラミング言語は JavaScript ( Version 1.6 がベース )
    - Web フロントエンド JavaScript と異なる
    > DOM, Window API はない
    - Node.js とも異なる
    > Node.js の Core API が使えない
    > npm モジュールは標準で非対応
    https://developers.google.com/apps-script/guides/services/#basic_javascript_features

    View Slide

  16. DEMO
    Your first script
    https://developers.google.com/apps-script/overview#your_first_script

    View Slide

  17. 様々な実行方法

    View Slide

  18. 様々な実行方法
    - 時間主導型トリガー
    - Google Apps のイベントで発火
    - Web 公開
    などなど

    View Slide

  19. 時間主導型トリガー
    - 定期実行を予約することができる
    - “毎週何曜日のこの時間帯に実行” など
    - 分 / 時 / 日 / 週 / 月タイマー
    - 編集 > 現在のプロジェクトのトリガー

    View Slide

  20. Google Apps のイベントで発火
    - 特定の Docs を開いた時
    - スプレッドシート更新時
    - Google フォーム回答時
    など
    公式ガイドの Event Objects 参照
    https://developers.google.com/apps-script/guides/triggers/events

    View Slide

  21. Web 公開
    - スクリプトを API や Web ページとして公開できる
    - 公開 > ウェブアプリケーションとして導入

    View Slide

  22. ミニマムな API 実装
    function doGet(e) {
    return ContentService.createTextOutput("hello world!");
    }
    function doPost(e) {
    return ContentService.createTextOutput("OK");
    }

    View Slide

  23. ミニマムな API 実装
    function doGet(e) {
    return ContentService.createTextOutput("hello world!");
    }
    function doPost(e) {
    return ContentService.createTextOutput("OK");
    }
    doGet と doPost を実装
    - doGet: GET リクエストに反応
    - doPost: POST リクエストに反応

    View Slide

  24. ミニマムな API 実装
    function doGet(e) {
    return ContentService.createTextOutput("hello world!");
    }
    function doPost(e) {
    return ContentService.createTextOutput("OK");
    }
    以下のいずれかの型の値を返す
    - HtmlOutput
    - TextOutput

    View Slide

  25. ミニマムな API 実装
    function doGet(e) {
    return ContentService.createTextOutput("hello world!");
    }
    function doPost(e) {
    return ContentService.createTextOutput("OK");
    }
    e: リクエスト時の値を参照できる
    - doGet: e.queryString, e.parameter
    - doPost: e.postData.contents

    View Slide

  26. 無料の翻訳 API もすぐ作れます
    1. doGet(e) で GET リクエスト受付
    2. LanguageApp.translate() で翻訳して return
    function doGet(e) {
    var p = e.parameter;
    var result = LanguageApp.translate(p.text, p.source, p.target);
    return ContentService.createTextOutput(result);
    }
    https://qiita.com/tanabee/items/c79c5c28ba0537112922

    View Slide

  27. 外部サービス連携

    View Slide

  28. Google Apps 以外の Web API をたたく
    UrlFetchApp.fetch で API リクエスト(POST Slack)
    function postSlack(slackWebhookUrl) {
    var payload = JSON.stringify({ text: 'message' });
    var res = UrlFetchApp.fetch(slackWebhookUrl, {
    method: 'POST',
    headers: { "Content-Type": 'application/json' },
    payload: payload
    });
    }

    View Slide

  29. 開発環境、ソースコード管理

    View Slide

  30. ローカル環境での開発
    公式パッケージ clasp を利用
    https://github.com/google/clasp
    $ clasp clone
    $ clasp push
    $ clasp pull

    View Slide

  31. GitHub でソースコード管理
    - ローカルで開発して GitHub 連携
    - Chrome 拡張: Google Apps Script Github アシスタント
    ↑この辺が拡張されて github に
     push / pull できるようになる

    View Slide

  32. 3 Google Apps Script の
    強み・弱み

    View Slide

  33. Google Apps Script の強み
    - Google Apps のデータを簡単に操作できる
    - 無料
    - 他の FaaS 同様にデプロイが容易
    - Cloud Functions
    - AWS Lambda

    View Slide

  34. Google Apps Script の弱み
    - 割当により、様々な制限がある
    - 1 回、1 日あたりの実行時間
    - 各種 API の呼び出し回数
    など
    - npm モジュールは標準で非対応

    View Slide

  35. 主な割当

    View Slide

  36. 全てを Google Apps Script でやろうとしない
    - 他の選択肢と比較する
    - 他の FaaS
    - Chrome 拡張
    - Web アプリケーション
    など

    View Slide

  37. Google Apps Script を選択するかの判断基準
    - Google Apps に関わる処理かどうか
    - Google Apps の標準機能で実現できないか
    - コード量が膨大にならないか(100 行前後が目安)
    - npm パッケージが欲しくなるような複雑な処理が含まれないか
    - 最悪失敗しても許される処理か
    - どうしても無料の範囲で使いたいか

    View Slide

  38. 4 グロービスでの RPA の
    取り組み・事例集

    View Slide

  39. グロービスでの RPA の取り組み

    View Slide

  40. グロービスでの RPA の取り組み
    社内のエンジニア・デザイナーで、社内のルーティンワークを
    募集して業務の自動化を行うプロジェクトを今年 4 月に起ち上げた
    > 目安箱プロジェクト

    View Slide

  41. プロジェクトの目的
    - ルーティンワークを自動化し、よりユーザーに
    価値を与えるような創造的な仕事の時間を増やす
    - テック系人材を採用し始めたのが 2016 年という企業の中で、
    テック系人材とビジネスサイドとの相互理解を促進する

    View Slide

  42. 進め方
    1. Google フォームから自動化したい
    業務を受付ける
    2. 頻度・作業時間・人数から削減時間を計
    算し優先度付け
    3. ヒアリングをして工数見積
    4. やるやら判断
    5. 実装
    6. 納品

    View Slide

  43. リソース
    - エンジニア・デザイナーの中で、興味のある人を募って、業務の
    10-20% の時間で業務自動化を行う
    - 時間が限られているため、「工数 < 月の削減時間」の案件に限って実

    View Slide

  44. 実績
    2018 年 4 月に発足し 2018 年 8 月時点で
    月 300 時間以上の時間削減に成功!
    これに対し、かけた工数は合計 50 時間程度

    View Slide

  45. 事例集

    View Slide

  46. 顧客問い合わせメール件数を集計
    - 時間主導型トリガー: 毎週
    1. 検索・抽出 2. 蓄積・集計
    https://qiita.com/tanabee/items/17eb721801eff8d97db9

    View Slide

  47. 1. 検索・抽出
    GmailApp.search(query, start, max)
    - query: 検索文字列
    - start: 開始インデックス
    - max: 最大取得スレッド数
    var threads = GmailApp.search(query, 1, 500);
    https://qiita.com/tanabee/items/17eb721801eff8d97db9

    View Slide

  48. 2. 蓄積・集計
    Range.setValues(values)
    - values: 入力値
    SpreadsheetApp.openById(spreadSheetId)
    .getSheetByName(spreadSheetTabName)
    .getRange(range)
    .setValues(mails);
    https://qiita.com/tanabee/items/17eb721801eff8d97db9

    View Slide

  49. 2. 蓄積・集計
    QUERY(データ, クエリ, [見出し]) ※スプレッドシート関数
    =QUERY(sheetName!A:D,
    “select count(A) where D contains ‘search text’”)
    https://qiita.com/tanabee/items/17eb721801eff8d97db9

    View Slide

  50. カレンダーイベントの一括登録
    https://qiita.com/tanabee/items/7ebcc63e5b561d18a582
    1. パース 2. 一括登録
    - Script Editor 上で実行

    View Slide

  51. 1. パース
    Range.getValues()
    SpreadsheetApp.openById(spreadSheetId)
    .getSheetByName(spreadSheetTabName)
    .getDataRange(range)
    .getValues();
    https://qiita.com/tanabee/items/7ebcc63e5b561d18a582

    View Slide

  52. 2. 一括登録
    Calendar.createEvent(title, startTime, endTime, options)
    - title: イベント名
    - startTime: 開始日時
    - endTime: 終了日時
    - options: 説明文、場所、ゲストなど
    https://qiita.com/tanabee/items/7ebcc63e5b561d18a582

    View Slide

  53. Google Form 投稿時に Slack 通知
    - トリガー: Google Form 投稿時
    1. Form 投稿 2. 通知
    https://github.com/tanabee/form-to-slack

    View Slide

  54. 3. 通知
    UrlFetchApp.fetch(url, params)
    - url: URL
    - params: HTTPメソッド、ヘッダー、ボディなど
    var res = UrlFetchApp.fetch(slackWebhookUrl, {
    method: 'POST',
    headers: { "Content-Type": 'application/json' },
    payload: JSON.stringify({ text: 'message' })
    });
    https://github.com/tanabee/form-to-slack

    View Slide

  55. 表形式データを JSON 形式に変換
    - Web 公開
    1. HTTP リクエスト
    2. JSON 形式に
     変換して返す
    https://github.com/tanabee/spreadsheet-to-json

    View Slide

  56. 表形式データを JSON 形式に変換
    1. doGet(e) で GET リクエスト受付
    2. Range.getValues() で Array 取得
    3. JSON 形式に変換して return
    function doGet(e) {
    // 変換コード省略
    return ContentService.createTextOutput(JSON.stringify(result))
    .setMimeType(ContentService.MimeType.JSON);
    }
    https://github.com/tanabee/spreadsheet-to-json

    View Slide

  57. 会議セッティング代行業務
    1. Form 投稿 2. 予約できる場合は予約
    - トリガー: Google Form 投稿時
    1. 蓄積
    3. 予約状況をスプレッドシート に
    入力してメール通知

    View Slide

  58. 会議セッティング代行業務
    1. Calendar.getEvents() でカレンダー重複確認
    a. 重複なし: Calendar.createEvent() でカレンダー登録
    b. 重複あり: 代替スケジュールを探す
    2. Range.setValues(values) で予約状況をシートに入力
    3. GmailApp.sendEmail() でメール送信

    View Slide

  59. 採用エントリーを採用管理ツールに登録
    - 時間主導型トリガー: 15 分毎
    1. 採用ツールの
     通知メールを抽出 2. API 経由で登録 採用管理
    サービス

    View Slide

  60. 採用エントリーを採用管理ツールに登録
    1. GmailApp.search() でメール抽出
    2. UrlFetchApp.fetch() で採用管理ツールの API リクエスト

    View Slide

  61. 定例 MTG の議事録テンプレート自動生成
    - 時間主導型トリガー: 毎週
    1. MTG 抽出
    2. テンプレート取得
    3. Qiita:Team に投稿
    4. Slack に投稿
    https://qiita.com/tanabee/items/e51f107f1e95a42cc636

    View Slide

  62. 定例 MTG の議事録テンプレート自動生成
    1. Calendar.getEvents() で定例 MTG 取得
    2. Document.getBody() でテンプレート文章取得
    3. UrlFetchApp.fetch() で Qiita:Team 投稿 API に POST
    4. CalendarEvent.setDescription() で Qiita:Team の記事 URL を入力
    5. UrlFetchApp.fetch() で Slack 投稿
    https://qiita.com/tanabee/items/e51f107f1e95a42cc636

    View Slide

  63. [おまけ] 社内メンバーの Qiita 投稿を Slack で応援促進
    - 時間主導型トリガー: 15 分毎
    - Slack で RSS 通知はできるがカスタマイズしたいときに便利
    https://qiita.com/tanabee/items/665917d9ab976661115c
    2. 通知
    1. RSS 取得

    View Slide

  64. 1. UrlFetchApp.fetch() で Qiita Organization feed を取得
    2. XmlService.parse() でパース
    3. UrlFetchApp.fetch() で Slack 投稿
    https://qiita.com/tanabee/items/665917d9ab976661115c
    [おまけ] 社内メンバーの Qiita 投稿を Slack で応援促進

    View Slide

  65. Google Apps Script を
    使わなかった例

    View Slide

  66. Google カレンダーから日報のたたきを作成
    - Google カレンダーから当日と翌営業日の予定を抽出して Markdown
    形式で出力したい
    - 既存の Chrome 拡張で近いことまで実現できる
    > Chrome 拡張で実装

    View Slide

  67. ブラウザ操作の自動化
    - 既存の Chrome 拡張をレクチャー

    View Slide

  68. PivotalTracker から Slack への通知カスタマイズ
    - デフォルトの通知より細かい情報(差分)を通知したい
    - npm モジュール使いたい ( kpdecker/jsdiff )
    - Google Apps の API を利用しない
    > Cloud Functions で実装

    View Slide

  69. csv のデータを基に請求書作成
    - csv のデータで請求書を作るための情報は全て揃っている
    > スプレッドシートの関数群を駆使して対応

    View Slide

  70. - 依頼を受け付けているメールを自動返信したい
    > Gmail のフィルタ機能と自動返信機能を使う
    > + を使ったエイリアスアドレスを利用
    > [email protected]
    特定のメールだけ自動で返信

    View Slide

  71. まとめ

    View Slide

  72. - Google Apps Script による RPA は効果的
    - Google Apps Script でやろうとする前に、
    それ以外の選択肢も考えるべき
    - 実際に触ってみるのが一番なので、ハンズオン実施します
    > http://bit.ly/gas-hands-on
    まとめ

    View Slide

  73. Thank you.

    View Slide