この記事は GAS道場 Advent Calendar 2019 の8日目の記事です。 Google Apps Script(GAS)をこれから使おうという方向けのアドベントカレンダーになります。
今回はGASでJSONを返すAPIを作りたいと思います。これこそがGASのとても良いところの1つ、サーバーの用意をせずにも無料でAPIサーバのようなものを作れるのです。
APIを返してみよう
さっそくですが、実際にプログラムを書いてみましょう。
function doGet(e) { var data = {Hello:'world'}; var payload = JSON.stringify(data) var output = ContentService.createTextOutput(); output.setMimeType(ContentService.MimeType.JSON); output.setContent(payload); return output; }
Helloの要素にworldという文字列を入れて、それをJSONにして返しています。 これでOKです。あとは昨日の記事でも紹介したウェブサイトとして公開に書いてあるやり方でウェブサイトとして公開します。 このとき注意しないといけないのが、以下の項目です。
項目 | 内容 |
---|---|
次位のユーザーとしてアプリケーションを実行 | 自分 |
アプリケーションにアクセスできるユーザー | 全員(匿名ユーザを含む) |
これで発行されるURLにアクセスしてみましょう。 以下のように、しっかりHello Worldっぽいデータが返されました。
ブラウザで表示時のJSON整形
ここでちょっと余談なのですが、JSONをそのまま表示するとわかりにくいので、自分は以下のようなchromeの拡張機能を入れて表示しています。
これを入れた状態で先程のURLにアクセスすると、以下のように整形されたJSONを確認することができます。
なので、個人的にはいろんな人にお勧めしております。
アクセスカウンターの応用
では、昨日と同じ流れで、アクセスカウンターをJSONで返してみましょう。
function doGet(e) { var data = {count:getData()}; var payload = JSON.stringify(data) var output = ContentService.createTextOutput(); output.setMimeType(ContentService.MimeType.JSON); output.setContent(payload); return output; } function getData() { var data = SpreadsheetApp.openById('1sgRxnlKO_i-5rdoex3_Vww27fF0MH2gXgg0BYB4b0eo').getSheetByName('シート1').getRange(1,1).getValue(); SpreadsheetApp.openById('1sgRxnlKO_i-5rdoex3_Vww27fF0MH2gXgg0BYB4b0eo').getSheetByName('シート1').getRange(1,1).setValue(data + 1) return data; }
スクリプトはほぼ一緒ですが、HTMLではなくJSONで返しています。
これを同じようにウェブサイトとして公開してアクセスしてみましょう。
アクセスするたびにcountが増えて返してくれるAPIができました。
性能試験
ここで気になるのが、このAPIはどのくらいの性能が出るんでしょう?個人的な感覚ですが、スプレッドシートにアクセスするって重い処理なので心配。
ちなみに、Googleのスピードテストであるインターネット速度テストは、以下のように100Mbps弱です。
今回は、curlコマンドを利用して何回かレスポンスタイムを計測してみます。gasは自分のサイトではないので、abコマンドとかjmeterで攻撃したりして負荷試験をしないでくださいね。
そのため、今回使用するのは、以下のようにリクエストを何度か叩いて、それをコンソールに出力するだけです。これの平均値を求めることで性能を見てみようと思います。
$ while true; do curl -kL http://script.google.com/macros/s/XXXXXXXXXXXXXXXXXXXXXXXXX/exec -o /dev/null -w "%{time_total}" 2> /dev/null; echo;done
静的なHello Worldの文字列を返すAPI
まずは、Helloなworldの性能です。
0.934678 0.852802 0.865071 0.875168 0.8437 0.869386 1.076642 0.849937 0.865924 0.895359 0.92322 0.881138 1.010885 0.875791 0.928853 0.865281 0.924488 0.8743 0.883418 0.874445 0.909122
以上のようになり、平均値が0.8990289524でした。
動的なアクセスカウンターを返すAPI
次に、アクセスカウンターのようなもので、スプレッドシートの値の取得と書き込みを行っているものです。
1.859475 1.885891 1.70866 1.840669 2.521593 1.73549 1.804157 1.802497 1.625437 1.653876 2.130358 2.164213 1.66045 1.581182 1.614672 2.053904 1.693804 1.604278 1.819005 1.576568 1.778668
以上のようになり、平均値が1.814992714でした。
考察
静的なものだけを返すのであれば1秒以内とまだ許せるとは思いますが、そんなAPIはなかなかないと思います。スプレッドシートをDBのように扱うウェブサーバとして利用する場合はレスポンスが2秒弱とだいぶかかってしまうので、あまりウェブサービス、ウェブアプリのサーバとしては利用できないかもしれないです。
さいごに
以上のように、APIを作ることはできました。ただ、サービスのAPIとして利用するにはちょっと厳しそうなことがわかりました。