ポンコツエンジニアのごじゃっぺ開発日記。

いろいろポンコツだけど、気にするな。エンジニアの日々の開発などの記録を残していきます。 自動で収入を得られるサービスやシステムを作ることが目標!!

GASでAPIを作るぞ!JSONを返す方法とその性能試験を実施してみた。

この記事は 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っぽいデータが返されました。

f:id:ponkotsu0605:20191207201556p:plain

ブラウザで表示時のJSON整形

ここでちょっと余談なのですが、JSONをそのまま表示するとわかりにくいので、自分は以下のようなchromeの拡張機能を入れて表示しています。

chrome.google.com

これを入れた状態で先程のURLにアクセスすると、以下のように整形されたJSONを確認することができます。 f:id:ponkotsu0605:20191207201818p:plain なので、個人的にはいろんな人にお勧めしております。

アクセスカウンターの応用

では、昨日と同じ流れで、アクセスカウンターを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で返しています。

これを同じようにウェブサイトとして公開してアクセスしてみましょう。 f:id:ponkotsu0605:20191207202358p:plain アクセスするたびにcountが増えて返してくれるAPIができました。

性能試験

ここで気になるのが、このAPIはどのくらいの性能が出るんでしょう?個人的な感覚ですが、スプレッドシートにアクセスするって重い処理なので心配。

ちなみに、Googleのスピードテストであるインターネット速度テストは、以下のように100Mbps弱です。

f:id:ponkotsu0605:20191207203022p:plain

今回は、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として利用するにはちょっと厳しそうなことがわかりました。