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

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

https://qiita.com/advent-calendar/2021/google-apps-script

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

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

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

```javascript
  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のライブラリーとしてコードと一緒に公開しました。

# 使い方

ライブラリーとして公開しています。[最新のコードはこちら](https://script.google.com/d/1AbYCEz2JpHu58yKf15_wcSXEC55xrHO9-XyYuovxRM3IVRCsx44k1bo5/edit?usp=sharing)です。
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6760/796eead3-2d60-4e31-d8d8-8a105bcf32f9.png)
あとは、スクリプトから```WeatherForecast.fetchForecast('130000');```を呼び出せばOKです。取得できるJSONは次のようになります（データ構造の詳しい説明は後述します）。

```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": "北の風　後　東の風　２３区西部　では　北の風　やや強く",
          "wave": "１．５メートル　後　０．５メートル",
          "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].wave`は`undefined`になります。

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

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

# 予報データの構造

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6760/71a05bb6-446c-2843-26da-2eefeb664816.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6760/668d8b11-ce77-5546-6b34-98e5aca8c2f9.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 | [北海道地方 / 宗谷地方](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=011000) |
| 012000 | [北海道地方 / 上川・留萌地方](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=012000) |
| 013000 | [北海道地方 / 網走・北見・紋別地方](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=013000) |
| ~~014030~~ 014100 | [北海道地方 / 十勝地方](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=014030) |
| 014100 | [北海道地方 / 釧路・根室地方](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=014100) |
| 015000 | [北海道地方 / 胆振・日高地方](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=015000) |
| 016000 | [北海道地方 / 石狩・空知・後志地方](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=016000) |
| 017000 | [北海道地方 / 渡島・檜山地方](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=017000) |
| 020000 | [東北地方 / 青森県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=020000) |
| 030000 | [東北地方 / 岩手県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=030000) |
| 040000 | [東北地方 / 宮城県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=040000) |
| 050000 | [東北地方 / 秋田県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=050000) |
| 060000 | [東北地方 / 山形県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=060000) |
| 070000 | [東北地方 / 福島県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=070000) |
| 080000 | [関東甲信地方 / 茨城県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=080000) |
| 090000 | [関東甲信地方 / 栃木県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=090000) |
| 100000 | [関東甲信地方 / 群馬県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=100000) |
| 110000 | [関東甲信地方 / 埼玉県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=110000) |
| 120000 | [関東甲信地方 / 千葉県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=120000) |
| 130000 | [関東甲信地方 / 東京都](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=130000) |
| 140000 | [関東甲信地方 / 神奈川県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=140000) |
| 150000 | [北陸地方 / 新潟県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=150000) |
| 160000 | [北陸地方 / 富山県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=160000) |
| 170000 | [北陸地方 / 石川県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=170000) |
| 180000 | [北陸地方 / 福井県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=180000) |
| 190000 | [関東甲信地方 / 山梨県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=190000) |
| 200000 | [関東甲信地方 / 長野県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=200000) |
| 210000 | [東海地方 / 岐阜県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=210000) |
| 220000 | [東海地方 / 静岡県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=220000) |
| 230000 | [東海地方 / 愛知県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=230000) |
| 240000 | [東海地方 / 三重県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=240000) |
| 250000 | [近畿地方 / 滋賀県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=250000) |
| 260000 | [近畿地方 / 京都府](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=260000) |
| 270000 | [近畿地方 / 大阪府](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=270000) |
| 280000 | [近畿地方 / 兵庫県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=280000) |
| 290000 | [近畿地方 / 奈良県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=290000) |
| 300000 | [近畿地方 / 和歌山県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=300000) |
| 310000 | [中国地方（山口県を除く） / 鳥取県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=310000) |
| 320000 | [中国地方（山口県を除く） / 島根県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=320000) |
| 330000 | [中国地方（山口県を除く） / 岡山県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=330000) |
| 340000 | [中国地方（山口県を除く） / 広島県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=340000) |
| 350000 | [九州北部地方（山口県を含む） / 山口県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=350000) |
| 360000 | [四国地方 / 徳島県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=360000) |
| 370000 | [四国地方 / 香川県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=370000) |
| 380000 | [四国地方 / 愛媛県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=380000) |
| 390000 | [四国地方 / 高知県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=390000) |
| 400000 | [九州北部地方（山口県を含む） / 福岡県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=400000) |
| 410000 | [九州北部地方（山口県を含む） / 佐賀県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=410000) |
| 420000 | [九州北部地方（山口県を含む） / 長崎県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=420000) |
| 430000 | [九州北部地方（山口県を含む） / 熊本県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=430000) |
| 440000 | [九州北部地方（山口県を含む） / 大分県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=440000) |
| 450000 | [九州南部・奄美地方 / 宮崎県](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=450000) |
| ~~460040~~ 460100 | [九州南部・奄美地方 / 奄美地方](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=460040) |
| 460100 | [九州南部・奄美地方 / 鹿児島県（奄美地方除く）](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=460100) |
| 471000 | [沖縄地方 / 沖縄本島地方](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=471000) |
| 472000 | [沖縄地方 / 大東島地方](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=472000) |
| 473000 | [沖縄地方 / 宮古島地方](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=473000) |
| 474000 | [沖縄地方 / 八重山地方](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=474000) |

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

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

- [気象庁JSONデータ](https://qiita.com/michan06/items/48503631dd30275288f7)
- [TorishimaさんのForecast.Const.TELOPSに関するツイート](https://twitter.com/izutorishima/status/1364455657169031169)