sironekotoroの日記

Perl で楽をしたい

詳解! GoogleAppsScript完全入門 で詰まったところ

Perl入学式 in 東京のピザ会でみた@xtetsujiさんの超絶ライフログシステムや、家電価格の定点観測を Google スプレッドシートで行うなんかを見て、俺もいっちょやってみたい!と思って購入したのがこの本

土日ごとにやっていたこの本も終盤。なんというか、いままで「ホスティング借りて、スクリプト置いて、cronで動かさんとなぁ・・・」って思ってたことが、GASだけで完結でそうで、Google様すげぇ・・・ってなってます。

で、そんな中で詰まったところがあったので、おすそ分け。

17章 外部サイトへのアクセス サンプル 17−3−3 「お天気Webサービス」から天気情報を取得する , 第1版 423pのスクリプトです。

function myFunction() {
  var cityId = 130010;
  var url = 'http://weather.livedoor.com/forecast/webservice/json/v1?city=';
  var response = UrlFetchApp.fetch(url + cityId);
  
  var json = JSON.parse(response.getContentText());
  Logger.log('%sエリア -%s-%s 地方の天気:',
             json.location.area,
             json.location.prefecture,
             json.location.city
            );
  Logger.log(json.description.text);
  
  json.forecasts.forEach(function(forecast,i,array){
    Logger.log(
      '%s %s の天気 : %s / 最高気温 :%s',
      forecast.dateLabel,
      forecast.date,
      forecast.telop,
      forecast.temperature.max.celsius     # ここ
    );
  });
}

これは、GASからlivedooreの天気用法APIを叩き、返って来たJSONをパースしてログに出す、というもの。ここでエラーが出たのは最後の方にある行、 forecast.temperature.max.celsius

現在は2018年2月25日15時過ぎですが、実行すると以下のエラーが出ます。

TypeError: null からプロパティ「celsius」を読み取れません。(行 15、ファイル「WebAPI活用」)

で、生JSONとか見たんですが、ちゃんとオブジェクトあるし、綴りも間違ってないし・・・と悩んだのでした。

しかし、よくよく見てみると・・・画像の一番下です。

f:id:sironekotoro:20180225150634p:plain

あ、forecastに格納されている配列の3つ目、添え字でいうと[2]のtemperature.maxnullだ!ってことに気づいたのでした。おそらく、時間が進むとここに値が入ったりするのかなぁ、と思ってます(未確認)

ということで、雑にif文で回避したりするなどして先に進んだのでした。後半のforEach直後にif文で抜けるようにかいてます。

  json.forecasts.forEach(function(forecast,i,array){

    if (!forecast.temperature.max){return}

    Logger.log(
      '%s %s の天気 : %s / 最高気温 :%s',
      forecast.dateLabel,
      forecast.date,
      forecast.telop,
      forecast.temperature.max.celsius
    );
  });

この本も残りわずか、頑張りまする