Kasasagi’s memorandum

JavaとかProcessingとか。最近はAtcoderとか。

GASを用いたウェブシステム

お久しぶりです、テストで爆死したかささぎです(15回連続15回目)。

勉強した教科ほど点数低そうでつらみ。

 

今回はGAS(Google Apps Script)で遊んでみました。Googleのサービスを統合処理できるスクリプト環境らしいです。JavaScriptで記述します。

参考文献です

「Google Apps Script」で社内システムをつくってみた~はじめてのJavaScript編~ | 株式会社シンメトリック公式ブログ |

【Google Apps Script】天気予報をWeb APIで取得する方法

 

1. 概要

GASでは、ドライブに単独で置かれる Standalone Script と、スプレッドシート(ExcelGoogle版)やフォームなどとに紐づけたものである Container Bound Script があります。今回は、初めてということもあるので、結果を分かりやすく表示できるスプレッドシートで利用しました。

Container Bound Scriptは、利用するサービス内からGASを立ち上げます。スプレッドシートなら、ツール->スクリプトエディタです。

 

2.とりあえず簡単なの

概要を理解したところでなにを作ろうか考えたのですが、今回は自分が最近はまっているゲームのAPIを利用して、データを収集するものを作ることにしました。

SOLDOUT2というゲームです。

SOLD OUT 2 - ファンタジーライフお店経営ゲーム

f:id:yh9092:20171201200227p:plain

これは、プレイヤーが一人一つお店をもって、アイテムを売ってお金を稼いでいくゲームです。アイテムは原料をとってきてもよし、加工してもよし、ほかのプレイヤーから買って転売してもよし、となかなか自由度が高くはまっています。

 このゲームではプレイヤーが何を販売しているかというデータがAPIとして公開されています。JSON形式のデータをURLから取得できます。

 

とりあえずググりながら手探りで適当に作ったのがこちらです。JavaScriptはほんの少しかじった程度なので、クソコードでも許してください。

<プログラムコード>

gistb59729f3b539231c8ed6c647c686e388

<実行結果>

f:id:yh9092:20171201201131p:plain

UrlFetchApp.fetchってやつでレスポンスを得て、Json.parseでJSONの形式のデータにします。後はデータがなくなるまで無限ループさせて結果を表示しています。try-catch-finallyは便利でいいですね、jsでも使えることは初めて知りました。やっぱC言語はクソだわ。

item_idとは売っている商品の区別に用いるデータです。別apiでitem_idと商品名などの商品データを紐づけるものもあり、それをHashMap(jsでは連想配列というやつらしい)あたりを用いて連携できれば良いシステムを構築できそうだなと思いましたが、面倒くさかったのでやめました。

 

3.ほしいデータの抽出

2.のプログラムを改良し、自分の欲しいデータを取ってくるようにしました。このSOLDOUT2では地区に分かれており、同じ地区の店がライバルとなります。また商品の販売価格は自分で決めることができるため、ほかの店の相場を知ることは大切です。

それを踏まえて以下のようにしました。

<プログラムコード>

gistaf9f4753b3e14623c70a798eb3de6c0c

<実行結果>

f:id:yh9092:20171201203059p:plain

自分の住んでる町がarea、知りたい商品がitemの番号です。自分は行商人という職業で、メインウェポンは魂の水というやつです(誰も聞いていない)。

この二つの検索条件から知りたいデータは、他の店がいくらで、いくつ売っているかです。"price"に価格、"unit"に個数が格納されているので、コードのように取得しました。

これでほしいデータはそろいました。次からはスプレッドシートにアウトプットして分かりやすくします。

 

4.スプレッドシートへ出力

3.のデータをもとに、スプレッドシートにデータを出力しました。GASはサービスと簡単に紐づけられるのがいいですね。結果はこんな感じです。

<プログラムコード>

gistc6876d9ab5c0c44c8def85578df8178f

<実行結果>

f:id:yh9092:20171201204517p:plain

なんかすごそうなことやってる感出してるかもしれませんが、プログラムでやってるのはA・B・C列だけです。

コードの解説をします。idにはシートのID(URLのspreadsheet/d/以下)を入れます。sheetにはシート名を入れてスプレッドシートとの連携は完了です。

sheet.getRange(行,列)でセルのデータを取得します。値を変えるときはsetValue関数を利用します。Java等の描画系では(x座標、y座標)という指定が一般的(おそらく)なので、その感覚で行くと逆になるため注意が必要です。

プログラムの解説に戻ると、while文明け最初のfor文でセルに書き込みを行っています。二つ目のループでは、記載してあったデータ数より少なかった場合のデータ消去処理をしています。

A・B・C列以外は、スプレッドシート表計算機能を用いて作成しました。関数とかはExcelとほぼ同じだったので珍しくMOSが役に立ちました。このゲームは価格と購入される量にいい感じに相関があると思われるので、なかなか役に立つものになったと思います。

 

5.おわりに

今回利用したAPIは10分に1回以下のアクセスにしてくださいと、公式さんが言っていたので、トリガを設定して10分に1度自動更新するようにしました。便利。

今回のプログラムを改良し、前の販売データと比較すると、商品がいくつ売れたかなどのデータも抽出できそうだと考えられます。それをもとにローソクチャートとかも作れそうですね。

GASの使い方も覚えられ、jsも少し思い出すことができたのでいろいろ勉強になりました。

それでは、さようなら。