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

GAS ビギナーが GAS を使いこな すために知るべきこと 10 選 / for Google App Script begginers

tanabee
April 03, 2018

GAS ビギナーが GAS を使いこな すために知るべきこと 10 選 / for Google App Script begginers

tanabee

April 03, 2018
Tweet

More Decks by tanabee

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  16. 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 実装

    View Slide

  17. 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 実装

    View Slide

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

    View Slide

  19. 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();

    View Slide

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

    View Slide

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

    View Slide

  22. 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)

    View Slide

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

    View Slide

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

    View Slide

  25. 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 でこけた時に詰む

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide