【GAS】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 / コール

無料枠でこれだけ使えれば十分でしょう。

事前準備

拡張機能Google Apps Scriptを追加

Chromeでウェブストアから拡張機能を追加します。

https://chrome.google.com/webstore/detail/google-apps-script/eoieeedlomnegifmaghhjnghhmcldobl?hl=ja

コードから実行まで

新規スクリプト作成

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

ログを出力

保存して実行する

実行するにはまず上段メニューのデバッグ(虫のボタン)で実効できます。構文エラーのときはここで弾かれます。

正常に通ったら「Ctrl + Enter」で実行できます。

フェッチとスプレッドシート操作

少し込み入った処理を書いてみる。以下は東京都の直近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を指定する。

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

トリガーを設定する

動作確認で問題なかったらトリガーを設定して1時間毎に実行してみる。

プロジェクトの設定から→「トリガー」→「トリガーを追加」を押す。

トリガーの設定項目

実行する関数

作った関数を選択する。

実行するデプロイ

バージョンを管理できる、最新から実行する場合はHeadを選択する。

イベントのソース

時間主導型かカレンダー型を選択する。

時間主導型の場合は定期的に実行され、カレンダー型の場合は指定した日時に実行される。

保存して戻る

トリガーの一覧に戻ると以下のように追加されていればOK、あとは実行されるのを待ちます。

実行された結果

更新対象のスプレッドシートを確認するとよさげな感じで雨量が記録されています。

実行ログの確認

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

Logger.logとconsole.logの違い

この記事を角にあたり作成したスクリプトの定期実行された際のログが記録されないのでなんでか調べてみました。

実験用スクリプト

試しにコンソールにも出力してみる
function myFunction() {
  Logger.log('Hello World!! (Logger)');
  console.log('Hello World!! (console)');
}

デバッグログ

「Ctrl」+「Enter」で実行した結果が以下

実行ログ

サイドメニューの実行数から当該のタスクを確認したのが以下

console.log により出力したログが、実行ログとして記録されるようです。Loggerはデバッグ時しか出ないのでここは使い分けというか注意が必要です。

備考

注目してる理由

以下の3点が注目している大きな理由です。

  • 何と言っても無料
  • Googleアカウントさえ持っていれば誰でも利用できる
  • linuxのcrontabのようにスケジューリングすることが可能

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

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

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

DBなどのGoogle以外の処理を行いたいときは、処理をAPIに切り出しておけば、GASからfetchするだけで定期実行できます。バッチサーバーに比べればAPIサーバーは遥かにハードルが低いです。

以上が注目している理由でした。

コメント

このブログの人気の投稿

docker-compose up で proxyconnect tcp: dial tcp: lookup proxy.example.com: no such host

docker-compose で起動したweb、MySQLに接続できない事象

【PHP】PHP_CodeSnifferを使う(コーディングルールのカスタマイズ)