GASでぐるなびAPIをたたいてみる!その2

GoogleAppsScript(GAS)
スポンサーリンク

こんにちはIT初心者のうえはらです。

前回、ぐるなびのAPIをたたいて、浦添市のラーメン店のjson形式のデータ一式を受け取りました。自分としては、メモ帳に貼り付けてこれだけでもいいんですけど、、、、一般的には実用的ではないので、

取得したお店の一覧を配列に突っ込んでみたいと思います!

配列に追加するには「push」すればいいんですね。

検索件数だけ、配列に追加してみたいと思います。

function myFunction() {
 var gurunaviAPI = '*****************************';
 var url = 'https://api.gnavi.co.jp/RestSearchAPI/20150630/?';
 url = url + 'keyid='+ gurunaviAPI;
 url = url + '&format=json';
 url = url + '&address=浦添';
 url = url + '&category_s=RSFST08008';//ラーメンの小業態コード
 
 var response = UrlFetchApp.fetch(url);
 var json=JSON.parse(response.getContentText());
 var hit_count = json.total_hit_count;
 
 for (var i=0; i<hit_count; i++){
   var arrName.push(json.rest[i].name + '\n');
 }
 Logger.log(arrName);
}

保存しようとすると、エラーが起きました。

14行目で「ステートメントの前に ; がありません。」

となっています。なんじゃそりゃ?

色々いじって先に「arrName」を配列として宣言してあげれば、無事に保存できました。このように変更です。

 var arrName = []
 for (var i=0; i<hit_count; i++){
 arrName.push(json.rest[i].name + '\n');
 }

いざ、実行!

「TypeError: undefined からプロパティ「name」を読み取れません。」??

実行ボタンと関数名の間にある虫みたいなマークでデバックしてみます。

「arrName」にちゃんと入ってるけどなぁ~? しばしの沈黙、、、、。

ん? 検索件数の「hit_count」は15? 「arrName」には10個しか入っていないけど、11個目はどうした?

「json」の中を見てみます。「total_hit_count」は「15」だけど、「hit_per_page」は「10」だ。「rest[10]」となっていて、10件しか拾ってない感じ。

for文で「hit_count」の回数、配列に追加するけど、11件目がないから、「「name」を読み取れません」となったのね。なるほど。

API仕様を確認してみました。

hit_per_page (ヒット件数)

一度リクエストで得るレスポンスデータの最大件数(デフォルト:10、上限:100)

ちゃんと書いてありました。(当たり前か)

条件に合う店舗がたくさんあっても、一回のリクエストで帰ってくるレスポンスデータはデフォルトで10件なんですね。

ん~10件か。今回に限れば15件でいいけど、汎用性を持たせないしなぁ~。上限の100件取得するようにしてもいいけど、重くなるだろうし、そんなに見てもなぁ~。見ても20件かな?ということで、「hit_per_page=20」としました。

検索される店舗は最大20件。でも、ヒットする店舗が20件より少ない場合は検索された件数だけfor文をまわさないといけません。

そのための条件式も追加しました。

var hit_count = json.total_hit_count;
var hit_per_page = json.hit_per_page;
if (hit_count<hit_per_page){
 hit_per_page = hit_count
}

ラーメンは妥協するとして、都市名は変更できるようにしたいなぁ~。ということで、いろいろとつまづきましたが、最終のプログラムです。

function myFunction() {
 var gurunaviAPI = '************************';
 var city = '浦添'; 

 var url = 'https://api.gnavi.co.jp/RestSearchAPI/20150630/?';
 url = url + 'keyid='+ gurunaviAPI;
 url = url + '&format=json';
 url = url + '&address=' + city;
 url = url + '&category_s=RSFST08008';//ラーメンの小業態コード
 url = url + '&hit_per_page=20'//レスポンスデータの最大件数
  
 var response = UrlFetchApp.fetch(url);
 var json=JSON.parse(response.getContentText());
 var hit_count = json.total_hit_count;
 var hit_per_page = json.hit_per_page;
 if (hit_count<hit_per_page){
  hit_per_page = hit_count
 }
 var mes = '検索件数:' + hit_count + '件のうち、' + hit_per_page + '件表示';
 Logger.log(mes);
 
 var arrName = [city + 'のラーメン店\n']
 for (var i=0; i<hit_per_page; i++){
  arrName.push(json.rest[i].name + '\n');
 }
 Logger.log(arrName);
}

できました?

見やすいように改行(\n)を入れています。

今のままだと、GASで都市名を打ち変えないといけませんが、doPost()とか利用すれば、slackやLINE等から都市名を送信して、その都市名で検索できるようにもなりますね!

次は何やろうかぁ~?

コメント