こんにちは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等から都市名を送信して、その都市名で検索できるようにもなりますね!
次は何やろうかぁ~?
コメント