【GAS】JSON形式のデータを取り出してチャットワークに天気予報を送る

★気に入ったらシェアをお願いします!


snow

photo credit: Snow via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

Google Apps Scriptを使ってチャットワークに天気予報を定期的に送るシステムを作成中です。

前回はこちらの記事です。

【Google Apps Script】天気予報をWeb APIで取得する方法
チャットワークに天気予報を通知するを目標に、今回はWeb APIとは何か、Google Apps Scriptでlivedoor天気情報のWeb APIからJSON形式のデータを取得してくる方法です。

Google Apps Scriptでlivedoor天気情報にAPIリクエストを送る方法、またその予備知識としてのWeb APIやJSON形式などについて解説をしました。

今回はその続きで、JSON形式で受け取ったデータの中から必要な情報を取り出し、チャットワークに送る部分を組んでいきたいと思います。

前回のおさらい:APIで受け取ったデータをログ出力テスト

前回作成したスクリプトはこちらです。

UrlFetchApp.fetchメソッドでlivedoor天気情報へのAPIリクエストをして、そのレスポンスに対してJSON.parseメソッドで配列に格納をします。

7行目~9行目のLogger.logの代わりに、配列jsonから欲しい情報を取り出して、送信する文字列として整えてチャットワークに送るという処理を加えればOKですね。

チャットワークに送る天気予報についての方針

livedoorのヘルプに

今日・明日の天気は1日3回、5時、11時、17時に発表され、最新の情報に更新します。

あります。

ポータルサイトlivedoorが提供するコンテンツの使い方、Q&A。良くある質問、キーワード検索で、疑問が解決できます。

それに合わせて、本システムでも5~6時、11~12時、17~18時に動作するようにしたいと思います。

取得する予報は、東京(CityID=130010)の

  • 今日の天気
  • 明日の天気
  • 都市名
  • 予報発表時間

としましょう。

配列jsonから目的のデータを取り出す

こちらのlivedoor天気情報の仕様を確認しましょう。

第三者向け気象データ提供サービス「Weather Hacks」。Webサービス(Livedoor Weather Web Service / LWWS)とRSSフィード(RSS2.0)を中心としたデータを提供しています。

プロパティと内容が以下のような表にまとめられています。

livedoor天気情報の仕様

例えば

  • 予報の発表日時:publicTime
  • 天気概況文:description→text

など、欲しい内容に対して1個~数個のプロパティが対応をしているようです。

また、サンプルとして掲載されているJSONデータも確認してみましょう。

ちょっとパっと見ではわかりづらいですが、波括弧で階層構造になっているのがわかっていただけると思います。

配列jsonから予報の発表日時を取得する

まずは簡単なところから、予報の発表日時を取得してみましょう。

プロパティ名は「publicTime」で階層としては1階層目にあり、JSON形式では

と記述されています。

JSON.perseメソッドで格納された配列jsonから取り出す方法は

とします。

JSON形式では、コロンの左側がキー、右側が値となります。

つまり連想配列と同じですね。

値を取り出したいのであれば、配列の指定でキーをダブルクォーテーションで指定すればOKです。

配列jsonから都市名を取得する

都市名は東京だとわかっているのでわざわざ配列jsonから取得する必要はないのですが、練習ということで…やってみましょう。

プロパティ名は「location」そしてその配下の「city」で、json形式では

と記述されています。

この場合、配列jsonから取り出すには

とします。

二階層目に欲しい値が存在しているのであれば、プロパティをそれぞれたどるように配列のキーを指定すればOKです。

なんとなくわかってきた感じですね。

配列jsonから今日と明日の天気を取り出す

次に今日と明日の天気を取り出してみます。

プロパティ名は「forecasts」と「telop」を使いそうです。

ちょっと複雑ですね。

今までの流れでいうと、json[“forecasts”][“telop”]と指定すれば良さそうですが、それではうまくいきません。

というのも、

  • forcastsの配下は角括弧「[]」がある
  • その角括弧の中に波括弧「{}」のセットが3つある

という点が異なっています。そして、その波括弧がそれぞれ今日、明日、明後日の天気予報を格納しているようですね。

[“telop”]の前に今日、明日、明後日のいずれかを配列番号で選択してあげる必要がありまして、今日であれば

明日であれば

と、配列番号を指定することで取得ができます。

配列jsonの任意の値を取得するルール

ポイントをまとめますと、JSON形式の場合は

  • 角括弧「[]」の中は配列
  • 波括弧「{}」の中はオブジェクト

で記述するというルールがあります。

のvalueを取得するのであれば[“name”]で

のBを取得するのであれば配列番号、つまり[1]で取得します。

この組み合わせで目的にデータを取り出すということになります。

天気予報をチャットワークに送るスクリプト

以上をもとに、天気予報をチャットワークに送るスクリプトを作りました。

こちらです。

このスクリプトを実行すると

チャットワークに送られた天気予報

とチャットワークに天気予報が送られます。

イベントトリガーを以下のように、日タイマーの午前5時~6時、午前11時~正午、午後5時~6時に設定すれば、livedoor天気情報の更新と合わせてチャットワークに通知されるようになります。

天気予報を送るスクリプトのイベントトリガー

まとめ

これでlivedoor天気情報のAPIで受け取ったJSON形式で受け取ったデータの中から必要な情報を取り出し、チャットワークに送ることができるようになりました。

前回の記事でもお伝えしましたが、Web APIを使えば、様々なサービスから多様なデータを取得することができます。

そしてその多くがJSON形式で提供をされています。

ぜひ色々なデータの取得にチャレンジをしてみてください。

次回ですが、チャットワークにメッセージを送るだけでなく、様々な操作をしていくためのにチャットワークAPIの使い方導入編をお送りします。

Google Apps ScriptでチャットワークAPIを活用するための最初の一歩
チャットワークAPIを駆使すると、様々な操作を行うことができるようになります。今回はチャットワークAPIの概要とGoogle Apps Scriptでの簡単な使い方についてお伝えします。

どうぞお楽しみに!