LoginSignup
11
3

Google Apps Scriptで気象庁の天気予報JSONデータをお手軽に使えちゃうライブラリー

Last updated at Posted at 2021-11-09

この記事はGoogle Apps Script Advent Calendar 2021の4日目の記事です

気象庁は天気予報データをJSON形式で提供しています。出典元が気象庁ホームページであることを示せば、商用利用もできるそうです。

ご利用上の注意事項(出典:気象庁ホームページ)
https://www.data.jma.go.jp/developer/ryuui.pdf

この天気予報JSONデータをGoogle Apps Scriptで利用できるようにしました。予報を取得したい地域をエリアコード(文末に掲載)で指定すると、直近3日間と、1週間の天気予報をそれぞれ取得できます。

  const areaCode = '130000'; // 東京地方
  const forecast = WeatherForecast.fetchForecast(areaCode);
  const tokyo = forecast.areas[0]; // 東京地方は4つのエリアがあります。最初が東京です。

  Logger.log(tokyo.threeDays.map(f => f.summary).join('\n'));
  // 12月4日は晴れでしょう。
  // 12月5日は、最高気温12℃、最低気温4℃で、晴れでしょう。降水確率は、0時から0%、6時から0%、12時から0%、18時から0%です。
  // 12月6日はくもり 時々 晴れでしょう。

  Logger.log(tokyo.oneWeek.map(f => f.summary).join('\n'));
  // 12月5日は、晴でしょう。
  // 12月6日は、最高気温13℃、最低気温4℃、で曇時々晴でしょう。降水確率は20%です。
  // 12月7日は、最高気温16℃、最低気温6℃、で曇後一時雨でしょう。降水確率は50%です。
  // ...

天気予報をしてくれるチャットbot🤖を作るのに、気象庁のデータを使おうとしたのですが、かなりクセの強いデータ構造でとても苦労しました。なんとか利用できるJSONに変換できたので、Google Apps Scriptのライブラリーとしてコードと一緒に公開しました。

使い方

ライブラリーとして公開しています。最新のコードはこちらです。
Script ID は1AbYCEz2JpHu58yKf15_wcSXEC55xrHO9-XyYuovxRM3IVRCsx44k1bo5です。

以下、詳しく説明していきます。

まず、文末の表から該当する地域のエリアコードarea_codeを探します。気象庁のホームページへのリンクも一緒に掲載したので、そちらも確認してください。なお、ホームページのURLは https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=<area_code>になります。

例えば、東京地方のエリアコードは130000です。
該当する気象庁のホームページは https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=130000 になります。東京地方の場合、4つの地域(東京地方、伊豆諸島北部、伊豆諸島南部、小笠原諸島)の予報が取得できます。

なお、area_codeとホームページのURLが一致しない場合がありますのでご注意ください(2024年3月時点では、十勝地方と奄美地方)。

次に、Google Apps Script のスクリプトエディターで、ライブラリーを追加します。
左ペイン「ライブラリ」の左隣、+(プラス)ボタンを押して、Script ID 1AbYCEz2JpHu58yKf15_wcSXEC55xrHO9-XyYuovxRM3IVRCsx44k1bo5
を入力し、検索して追加してください。

image.png
あとは、スクリプトからWeatherForecast.fetchForecast('130000');を呼び出せばOKです。取得できるJSONは次のようになります(データ構造の詳しい説明は後述します)。

{
  "source": "出典: 気象庁ホームページ https://www.jma.go.jp/jma/index.html",
  "reportDate": "2021-12-04T17:00:00+09:00",
  "areas": [
    {
      "area": "東京地方",
      "tempSpot": "東京",
      "threeDays": [
        ...
        {
          "date": "2021-12-05T00:00:00+09:00",
          "weather": "晴れ",
          "iconUrl": "https://www.jma.go.jp/bosai/forecast/img/100.png",
          "wind": "北の風 後 東の風 23区西部 では 北の風 やや強く",
          "wave": "1.5メートル 後 0.5メートル",
          "chanceOfRain": [
            {
              "date": "2021-12-05T00:00:00+09:00",
              "pop": "0"
            },
            {
              "date": "2021-12-05T06:00:00+09:00",
              "pop": "0"
            },
            {
              "date": "2021-12-05T12:00:00+09:00",
              "pop": "0"
            },
            {
              "date": "2021-12-05T18:00:00+09:00",
              "pop": "0"
            }
          ],
          "minTemp": "4",
          "maxTemp": "12",
          "summary": "12月5日は、最高気温12℃、最低気温4℃で、晴れでしょう。降水確率は、0時から0%、6時から0%、12時から0%、18時から0%です。"
        },
        ...
      ],
      "oneWeek": [
        ...
        {
          "date": "2021-12-06T00:00:00+09:00",
          "weather": "曇時々晴",
          "iconUrl": "https://www.jma.go.jp/bosai/forecast/img/201.png",
          "pop": "20",
          "minTemp": "4",
          "minTempLower": "2",
          "minTempUpper": "5",
          "maxTemp": "13",
          "maxTempLower": "11",
          "maxTempUpper": "15",
          "summary": "12月6日は、最高気温13℃、最低気温4℃、で曇時々晴でしょう。降水確率は20%です。"
        },
        ...
      ]
    },
    {
      "area": "伊豆諸島北部",
      "tempSpot": "大島",
      "threeDays": [
        ...

なお、海のない県ではareas[i].threeDays[i].waveundefinedになります。

また、地方によっては週間予報が存在せず、areas[i].oneWeekundefinedになります。

ちなみに、気象庁が提供する元のJSONデータは https://www.jma.go.jp/bosai/forecast/data/forecast/130000.json です。

予報データの構造

気象庁から取得できるJSONデータの構造ですが、かなりクセが強いです。そこで、利用しやすいようにデータ構造を変換しています。データ項目については、ホームページの図と見比べていただくと理解しやすいと思います。

image.png

image.png

  • source 出典元
  • areas 地域ごとの天気予報
    • area 地域名
    • tempSpot 気温予報の場所
    • threeDays 直近3日間の予報(ただし、3日分のデータがない場合もある)
      • date 予報の日時
      • weather 天気
      • wind 風
      • wave 波
      • chanceOfRain 降水確率
        • date 降水確率の日時(ここから6時間分)
        • pop 降水確率(%)
      • minTemp 最低気温
      • maxTemp 最高気温
      • summary 天気予報のサマリー
    • oneWeek 週間予報
      • date 予報の日時
      • weather 天気
      • pop 降水確率(%)
      • reliability 信頼度(Aが高い)
      • minTemp 最低気温
      • minTempLower 最低気温の下限値
      • minTempUpper 最低気温の上限値
      • maxTemp 最高気温
      • maxTempLower 最高気温の下限値
      • maxTempUpper 最高気温の上限値
      • summary 天気予報のサマリー

エリアコード(area_code)

天気予報を取得できる地域のエリアコード(area_code)一覧です。あわせて気象庁のホームページも確認して、エリアいくつ分の予報データが取得できるのか、ご確認ください。
なお、area_codeとホームページのURLが一致しない場合がありますのでご注意ください(2024年3月時点では、十勝地方と奄美地方)。

area_code 地域
011000 北海道地方 / 宗谷地方
012000 北海道地方 / 上川・留萌地方
013000 北海道地方 / 網走・北見・紋別地方
014030 014100 北海道地方 / 十勝地方
014100 北海道地方 / 釧路・根室地方
015000 北海道地方 / 胆振・日高地方
016000 北海道地方 / 石狩・空知・後志地方
017000 北海道地方 / 渡島・檜山地方
020000 東北地方 / 青森県
030000 東北地方 / 岩手県
040000 東北地方 / 宮城県
050000 東北地方 / 秋田県
060000 東北地方 / 山形県
070000 東北地方 / 福島県
080000 関東甲信地方 / 茨城県
090000 関東甲信地方 / 栃木県
100000 関東甲信地方 / 群馬県
110000 関東甲信地方 / 埼玉県
120000 関東甲信地方 / 千葉県
130000 関東甲信地方 / 東京都
140000 関東甲信地方 / 神奈川県
150000 北陸地方 / 新潟県
160000 北陸地方 / 富山県
170000 北陸地方 / 石川県
180000 北陸地方 / 福井県
190000 関東甲信地方 / 山梨県
200000 関東甲信地方 / 長野県
210000 東海地方 / 岐阜県
220000 東海地方 / 静岡県
230000 東海地方 / 愛知県
240000 東海地方 / 三重県
250000 近畿地方 / 滋賀県
260000 近畿地方 / 京都府
270000 近畿地方 / 大阪府
280000 近畿地方 / 兵庫県
290000 近畿地方 / 奈良県
300000 近畿地方 / 和歌山県
310000 中国地方(山口県を除く) / 鳥取県
320000 中国地方(山口県を除く) / 島根県
330000 中国地方(山口県を除く) / 岡山県
340000 中国地方(山口県を除く) / 広島県
350000 九州北部地方(山口県を含む) / 山口県
360000 四国地方 / 徳島県
370000 四国地方 / 香川県
380000 四国地方 / 愛媛県
390000 四国地方 / 高知県
400000 九州北部地方(山口県を含む) / 福岡県
410000 九州北部地方(山口県を含む) / 佐賀県
420000 九州北部地方(山口県を含む) / 長崎県
430000 九州北部地方(山口県を含む) / 熊本県
440000 九州北部地方(山口県を含む) / 大分県
450000 九州南部・奄美地方 / 宮崎県
460040 460100 九州南部・奄美地方 / 奄美地方
460100 九州南部・奄美地方 / 鹿児島県(奄美地方除く)
471000 沖縄地方 / 沖縄本島地方
472000 沖縄地方 / 大東島地方
473000 沖縄地方 / 宮古島地方
474000 沖縄地方 / 八重山地方

参考にさせていただいた情報

どうもありがとうございます!

11
3
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
3