Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

1 RPA とは

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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 ) プロセスの分析や改善、意思決定までを自ら自動化

Slide 12

Slide 12 text

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 ) プロセスの分析や改善、意思決定までを自ら自動化

Slide 13

Slide 13 text

2 Google Apps Script とは

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

様々な実行方法

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

ミニマムな 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

Slide 26

Slide 26 text

無料の翻訳 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

Slide 27

Slide 27 text

外部サービス連携

Slide 28

Slide 28 text

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 }); }

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

3 Google Apps Script の 強み・弱み

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

主な割当

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

事例集

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

表形式データを 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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

定例 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

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

Google Apps Script を 使わなかった例

Slide 66

Slide 66 text

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

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

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

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

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

Slide 71

Slide 71 text

まとめ

Slide 72

Slide 72 text

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

Slide 73

Slide 73 text

Thank you.