Slide 1

Slide 1 text

GAS ビギナーが GAS を使いこな すために知るべきこと 10 選 株式会社グロービス Yuki Tanabe

Slide 2

Slide 2 text

/urls - Speaker Deck : bit.ly/2pXozRi - Qiita : bit.ly/2GsvMUy

Slide 3

Slide 3 text

/me 株式会社グロービス リードエンジニア - github / Qiita : tanabee - twitter: @_tanabee プライベートで iOS / Android アプリ開発 累計 100 万 DL 達成

Slide 4

Slide 4 text

/me - Qiita に GAS ネタ投稿してます - Google Apps Script (GAS) で毎週 30 分の雑務を自動化した話 - 3 分で作る無料の翻訳 API with Google Apps Script - Qiita Organizations Ranking

Slide 5

Slide 5 text

/about - GAS の便利な使い方 - GAS で効率良く開発する方法 - GAS の詰まりどころ - などなど

Slide 6

Slide 6 text

1. ローカル環境で開発する 公式の npm パッケージ利用 https://github.com/google/clasp $ clasp clone <fieldId> $ clasp push $ clasp pull

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

3. 複数ファイル構成 - 複数の *.gs ファイルを持てる - 定義された関数はグローバル関数となる

Slide 9

Slide 9 text

function main() { var num = add(1, 2); Logger.log(num); } function add(a, b) { return a + b; } main.gs util.gs

Slide 10

Slide 10 text

4. 様々な実行方法 主な実行方法 - トリガー - G Suite サービスのイベントで発火 - Web 公開

Slide 11

Slide 11 text

4. トリガー - “毎週何曜日のこの時間帯に実行” など - 分 / 時 / 日 / 週 / 月タイマー - Heroku でいう Scheduler - 編集 > 現在のプロジェクトのトリガー

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

function doGet(e) { return ContentService.createTextOutput("hello world!"); } function doPost(e) { return ContentService.createTextOutput("OK"); } 以下のいずれかの型の値を返す - HtmlOutput - TextOutput https://developers.google.com/apps-script/guides/web 4. ミニマムな API 実装

Slide 17

Slide 17 text

function doGet(e) { return ContentService.createTextOutput("hello world!"); } function doPost(e) { return ContentService.createTextOutput("OK"); } e: Event Object リクエスト時の値を参照できる - doGet: e.queryString, e.parameter - doPost: e.postData.contents https://developers.google.com/apps-script/guides/web 4. ミニマムな API 実装

Slide 18

Slide 18 text

5. スクリプト毎のデータストア 前回の実行結果など、スクリプト毎に簡単なデータを保存する保存領域が用意されている var properties = PropertiesService.getScriptProperties(); properties.getProperty(key);// 取得 properties.setProperty(key, value);// 登録 properties.deleteProperty(key);// 削除

Slide 19

Slide 19 text

6. スクリプトからもトリガーを設定できる TriggerBuilder を利用 https://developers.google.com/apps-script/reference/script/trigger-builder var func = 'main'; var d = new Date(); d.setMinutes(dt.getMinutes() + 1);// 1 分後 ScriptApp.newTrigger(func).timeBased().at(dt).create();

Slide 20

Slide 20 text

7. 実行時間の制限 - 1 回の実行で 6 分間の時間制限 - スクリプトの実行途中でも強制終了 https://developers.google.com/apps-script/guides/services/quotas

Slide 21

Slide 21 text

7. 6 分を超える処理を実行する方法 例)スプレッドシートの各行処理するスクリプト 1. 実行時間が 5 分になるのを検知 2. 次回処理を開始する行数を PropertiesService で保存 3. TriggerBuilder を使って新しいトリガーを 1 分後に設定 4. 処理を終了させる ※ 5 分や 1 分というのは仮の値なので、正常に動作する適切な時間を選んでください。

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

9. Web スクレイピングの方法 1. UrlFetchApp.fetch で html を取得 2. html を parse a. GAS 公式のサンプルを利用 b. 独自の抽出ロジックを実装

Slide 24

Slide 24 text

9. 公式サンプルを利用した parse 以下のメソッドを別途定義する - getElementById() - getElementsByClassName - getElementsByTagName https://sites.google.com/site/scriptsexamples/learn-by-example/parsing-html

Slide 25

Slide 25 text

9. 公式サンプルを利用した parse var html = UrlFetchApp.fetch(url).getContentText(); var doc = XmlService.parse(html); var element = doc.getRootElement(); var menu = getElementsByClassName(element, 'menu')[0]; https://sites.google.com/site/scriptsexamples/learn-by-example/parsing-html > XmlService.parse でこけた時に詰む

Slide 26

Slide 26 text

9. 独自の抽出ロジックを実装 var html = UrlFetchApp.fetch(url).getContentText(); var username = find(html, '

', '

'), function find(text, from, to) { var fromIndex = text.indexOf(from); if (fromIndex === -1) return ''; text = text.substring(fromIndex + from.length); var toIndex = text.indexOf(to); if (toIndex === -1) return ''; return text.substring(0, toIndex); }

Slide 27

Slide 27 text

10. GAS でライブラリを利用する - GAS では npm を利用できない - 代わりに独自の GAS ライブラリという仕組みがある - 他の人が公開した GAS を参照して実行するような仕組み - が、実行速度が遅いので add-on での利用は控えるべきとのこと - 良い方法知ってる方いたら教えてくださいmm https://developers.google.com/apps-script/guides/libraries

Slide 28

Slide 28 text

ご清聴ありがとうございました