Google Apps Scriptを使ってみた

以前から気になっていましたが、個人的に今一番注目しているサービス、「Google Apps Script(以下GAS)」を使ってみたのでまとめておきます。

Google Apps Scriptとは

Googleドライブ上で実行されるScriptで、様々なGoogleサービスと連携したり外部サービスにFetchできる。 また、その実行に関してはトリガーイベントやスケジューリングの設定が可能

コードはJavascriptがベース(npmは残念ながら非対応、Node.jsは使えない)

制約

主な制約については以下の記事に大変見やすくまとめられています。
https://shunsuk.com/gas-quotas/

個人的に気になっていたのは、無料アカウントでの以下の点
  • URL Fetch コール数 20,000 / 日
  • URL Fetch レスポンスサイズ 50MB / コール
  • URL Fetch POST サイズ 50MB / コール
無料枠でこれだけあれば十分、制約なんてあってないようなもんですね。

事前準備

Chromeでウェブストアから拡張機能を追加
https://chrome.google.com/webstore/detail/google-apps-script/eoieeedlomnegifmaghhjnghhmcldobl?hl=ja

コードから実行まで

  1. https://script.google.com/ を開いて「新規スクリプト」

    script.google.com_0.png
    ログを追加
    script.google.com_0-2.png

  2. 保存して実行する
    実行するにはまず上段メニューのデバッグ(虫のボタン)を実効する。構文エラーのときはここで弾かれる。正常に通ったら「Ctrl + Enter」で実行!

    script.google.com_0-3.png

  3. フェッチとスプレッドシート操作
    少し込み入った処理を書いてみる。以下は東京都の直近1時間の雨量をスプレッドシートに記録するコード
    function urlfetchTest() {
      Logger.log('Test Start');
      const url = 'https://www.data.jma.go.jp/obd/stats/data/mdrr/pre_rct/alltable/pre1h00_rct.csv';
      const postheader = {
        "accept":"gzip, */*",
        "timeout":"20000"
      }  
    
      const parameters = {
        "method": "get",
        "muteHttpExceptions": true,
        "headers": postheader
      }
    
      var buff = UrlFetchApp.fetch(url, parameters).getContentText('Shift-JIS');
      var texts = buff.split(/\r\n|\r|\n/);
      var array = [];
      var target = null;
      texts.forEach(function(value){
        array = value.split(',');
        if(array[0] == 44132){
          target = {
            'time':array[7] + ':' + array[8],
            'value':array[9]
          };
        }
      });
      Logger.log(target.time + ' - ' + target.value);
      
      var spreadsheet = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/xxxxx/edit#gid=0');
      var sheet = spreadsheet.getActiveSheet();
      var dataLength = sheet.getRange('A:A').getValues();
      var lastRow = dataLength.filter(String).length;
      Logger.log('lastRow:' + lastRow);
      sheet.getRange(lastRow + 1, 1).setValue(target.time);
      sheet.getRange(lastRow + 1, 2).setValue(target.value);
      
      Logger.log('Test End');
    }
    
    文法に関してはほぼJavascriptでかける。スプレッドシートの openByUrl に指定してるURLは、Googleドライブに保存されたスプレッドシートを開いたときのURLを指定する。

  4. データへのアクセスを許可
    上記のようなGoogleドライブのデータにアクセスするスクリプトの場合は、実行の際にアクセスの許可を行う必要がある。一度許可してしまえば次からはOK

    script.google.com_1.png

  5. トリガーを設定する
    動作確認で問題なかったらトリガーを設定して1時間毎に実行してみる。
    プロジェクトの設定から→「トリガー」→「トリガーを追加」を押す。

    script.google.com_2.png
    トリガーの設定項目
    実行する関数 作った関数を選択する
    実行するデプロイ バージョンを管理できる、最新から実行する場合はHeadを選択する
    イベントのソース 時間主導型かカレンダー型を選択する。
    時間主導型の場合は定期的に実行され、カレンダー型の場合は指定した日時に実行される。
  6. 保存して戻る
    トリガーの一覧に戻ると以下のように追加されていればOK、あとは実行されるのを待つ

    script.google.com_3.png

  7. 実行された結果
    更新対象のスプレッドシートを確認するとよさげな感じで雨量が記録された!

    script.google.com_4.png

  8. 実行ログの確認
    実行に関する情報はサイドメニューの「実行数」から確認できる。

    script.google.com_5.png

注目してる理由

以下の3点が注目している大きな理由です。
  • 何と言っても無料
  • Googleアカウントさえ持っていれば誰でも利用できる
  • linuxのcrontabのようにスケジューリングすることが可能

個人でサービスを作ろうと思ったとき、以外とネックになりやすいのが定期実行のバッチ処理だったりします。

バッチサーバーを自前で用意するのはあまりにもハードルが高いしコストもかけたくない、レンタルサーバーだと無料枠でcrontab使えるとこなんてほとんどないです...

そんなときGASを使えば定期実行できるし、何よりGoogleのサービスなので安定性は抜群です(←信じる者)。

DBなどのGoogle以外の処理を行いたいときは、処理をAPIに切り出しておけば、GASからfetchするだけで定期実行できます。

バッチサーバーに比べればAPIサーバーは遥かにハードルが低いです。
(少なくとも自分が個人で立ててるバッチ処理はこれに置き換えれるなぁ...)

この記事へのコメント

スポンサーリンク