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

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

1f309786ce1b4b15b81d3945faea1739?s=47 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

1f309786ce1b4b15b81d3945faea1739?s=128

tanabee

September 20, 2018
Tweet

Transcript

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

  2. 田邉 裕貴 株式会社グロービス リードエンジニア ヤフー > VR スタートアップ > グロービス

    グロービスのラーニングプラットフォームチームに所属。 業務自動化、スクラムの普及、採用なども行う。 Speaker
  3. - Qiita: tanabee - GitHub: tanabee - Twitter: @_tanabee Speaker

  4. Qiita に Google Apps Script (GAS) ネタ投稿しています - GAS ビギナーが

    GAS を使いこなすために知るべきこと 10 選 - Google Apps Script (GAS) で毎週 30 分の雑務を自動化した話 - 3 分で作る無料の翻訳 API など Speaker
  5. Agenda • RPA とは • Google Apps Script とは •

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

  7. RPA とは - Robotic Process Automation の略。 - ロボットによる業務自動化 -

    RPA はこれまで人間が行ってきた定型的なパソコン操作を ソフトウエアのロボットにより自動化するもの http://www.soumu.go.jp/menu_news/s-news/02tsushin02_04000043.html
  8. 身の回りの RPA - Excel のマクロ - メールのフィルタ、既読処理など - Web サービス間連携

    - Web アプリケーションを用いた既存業務の自動化
  9. RPA 導入状況 ( 2017 年調査 ) - 国内企業の - 14.1%

    が導入済み - 6.3% が導入中 - 19.1% が導入を検討中 http://www.soumu.go.jp/menu_news/s-news/02tsushin02_04000043.html
  10. RPA 市場 ( 2017 年調査 ) - 2017 年度 :

    31 億円 - 2021 年度 : 100 億円規模 http://www.soumu.go.jp/menu_news/s-news/02tsushin02_04000043.html
  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 ) プロセスの分析や改善、意思決定までを自ら自動化
  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 ) プロセスの分析や改善、意思決定までを自ら自動化
  13. 2 Google Apps Script とは

  14. Google Apps Script とは - Google Apps ( Spreadsheet, Docs,

    Gmail, Slide など ) の API を 簡単にクラウドで実行できる環境 - G Suite に強い FaaS - GAS と略される
  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
  16. DEMO Your first script https://developers.google.com/apps-script/overview#your_first_script

  17. 様々な実行方法

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

    などなど
  19. 時間主導型トリガー - 定期実行を予約することができる - “毎週何曜日のこの時間帯に実行” など - 分 / 時

    / 日 / 週 / 月タイマー - 編集 > 現在のプロジェクトのトリガー
  20. Google Apps のイベントで発火 - 特定の Docs を開いた時 - スプレッドシート更新時 -

    Google フォーム回答時 など 公式ガイドの Event Objects 参照 https://developers.google.com/apps-script/guides/triggers/events
  21. Web 公開 - スクリプトを API や Web ページとして公開できる - 公開

    > ウェブアプリケーションとして導入
  22. ミニマムな API 実装 function doGet(e) { return ContentService.createTextOutput("hello world!"); }

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

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

    function doPost(e) { return ContentService.createTextOutput("OK"); } 以下のいずれかの型の値を返す - HtmlOutput - TextOutput
  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
  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
  27. 外部サービス連携

  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 }); }
  29. 開発環境、ソースコード管理

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

    clasp push $ clasp pull
  31. GitHub でソースコード管理 - ローカルで開発して GitHub 連携 - Chrome 拡張: Google

    Apps Script Github アシスタント ↑この辺が拡張されて github に  push / pull できるようになる
  32. 3 Google Apps Script の 強み・弱み

  33. Google Apps Script の強み - Google Apps のデータを簡単に操作できる - 無料

    - 他の FaaS 同様にデプロイが容易 - Cloud Functions - AWS Lambda
  34. Google Apps Script の弱み - 割当により、様々な制限がある - 1 回、1 日あたりの実行時間

    - 各種 API の呼び出し回数 など - npm モジュールは標準で非対応
  35. 主な割当

  36. 全てを Google Apps Script でやろうとしない - 他の選択肢と比較する - 他の FaaS

    - Chrome 拡張 - Web アプリケーション など
  37. Google Apps Script を選択するかの判断基準 - Google Apps に関わる処理かどうか - Google

    Apps の標準機能で実現できないか - コード量が膨大にならないか(100 行前後が目安) - npm パッケージが欲しくなるような複雑な処理が含まれないか - 最悪失敗しても許される処理か - どうしても無料の範囲で使いたいか
  38. 4 グロービスでの RPA の 取り組み・事例集

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

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

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

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

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

  44. 実績 2018 年 4 月に発足し 2018 年 8 月時点で 月

    300 時間以上の時間削減に成功! これに対し、かけた工数は合計 50 時間程度
  45. 事例集

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

  47. 1. 検索・抽出 GmailApp.search(query, start, max) - query: 検索文字列 - start:

    開始インデックス - max: 最大取得スレッド数 var threads = GmailApp.search(query, 1, 500); https://qiita.com/tanabee/items/17eb721801eff8d97db9
  48. 2. 蓄積・集計 Range.setValues(values) - values: 入力値 SpreadsheetApp.openById(spreadSheetId) .getSheetByName(spreadSheetTabName) .getRange(range) .setValues(mails);

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

    D contains ‘search text’”) https://qiita.com/tanabee/items/17eb721801eff8d97db9
  50. カレンダーイベントの一括登録 https://qiita.com/tanabee/items/7ebcc63e5b561d18a582 1. パース 2. 一括登録 - Script Editor 上で実行

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

  52. 2. 一括登録 Calendar.createEvent(title, startTime, endTime, options) - title: イベント名 -

    startTime: 開始日時 - endTime: 終了日時 - options: 説明文、場所、ゲストなど https://qiita.com/tanabee/items/7ebcc63e5b561d18a582
  53. Google Form 投稿時に Slack 通知 - トリガー: Google Form 投稿時

    1. Form 投稿 2. 通知 https://github.com/tanabee/form-to-slack
  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
  55. 表形式データを JSON 形式に変換 - Web 公開 1. HTTP リクエスト 2.

    JSON 形式に  変換して返す https://github.com/tanabee/spreadsheet-to-json
  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
  57. 会議セッティング代行業務 1. Form 投稿 2. 予約できる場合は予約 - トリガー: Google Form

    投稿時 1. 蓄積 3. 予約状況をスプレッドシート に 入力してメール通知
  58. 会議セッティング代行業務 1. Calendar.getEvents() でカレンダー重複確認 a. 重複なし: Calendar.createEvent() でカレンダー登録 b. 重複あり:

    代替スケジュールを探す 2. Range.setValues(values) で予約状況をシートに入力 3. GmailApp.sendEmail() でメール送信
  59. 採用エントリーを採用管理ツールに登録 - 時間主導型トリガー: 15 分毎 1. 採用ツールの  通知メールを抽出 2. API

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

  61. 定例 MTG の議事録テンプレート自動生成 - 時間主導型トリガー: 毎週 1. MTG 抽出 2.

    テンプレート取得 3. Qiita:Team に投稿 4. Slack に投稿 https://qiita.com/tanabee/items/e51f107f1e95a42cc636
  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
  63. [おまけ] 社内メンバーの Qiita 投稿を Slack で応援促進 - 時間主導型トリガー: 15 分毎

    - Slack で RSS 通知はできるがカスタマイズしたいときに便利 https://qiita.com/tanabee/items/665917d9ab976661115c 2. 通知 1. RSS 取得
  64. 1. UrlFetchApp.fetch() で Qiita Organization feed を取得 2. XmlService.parse() でパース

    3. UrlFetchApp.fetch() で Slack 投稿 https://qiita.com/tanabee/items/665917d9ab976661115c [おまけ] 社内メンバーの Qiita 投稿を Slack で応援促進
  65. Google Apps Script を 使わなかった例

  66. Google カレンダーから日報のたたきを作成 - Google カレンダーから当日と翌営業日の予定を抽出して Markdown 形式で出力したい - 既存の Chrome

    拡張で近いことまで実現できる > Chrome 拡張で実装
  67. ブラウザ操作の自動化 - 既存の Chrome 拡張をレクチャー

  68. PivotalTracker から Slack への通知カスタマイズ - デフォルトの通知より細かい情報(差分)を通知したい - npm モジュール使いたい (

    kpdecker/jsdiff ) - Google Apps の API を利用しない > Cloud Functions で実装
  69. csv のデータを基に請求書作成 - csv のデータで請求書を作るための情報は全て揃っている > スプレッドシートの関数群を駆使して対応

  70. - 依頼を受け付けているメールを自動返信したい > Gmail のフィルタ機能と自動返信機能を使う > + を使ったエイリアスアドレスを利用 > globis+inquiry@google.com

    特定のメールだけ自動で返信
  71. まとめ

  72. - Google Apps Script による RPA は効果的 - Google Apps

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