気象庁の天気予報をPowerAutomateDesktopで取得してExcelに自動的に書き込んでみた

#天候は店舗の売上/客数に重要なファクト

##はじめに
私の会社は商業施設の運営/管理を行っておりますが、店舗運営において天候は非常に重要なファクトです。天気や気温が売れる商品や来館するかどうかの大きな要素であり、また管理の部分でも安全で快適な空間づくりのため天候を把握しておくのはマスト事項です。

##本部は各地の天候を瞬時に把握するのは難しい
全国各地に施設を運営しているのですが、本部側で「●●地区の店舗のエリアって今後どういう天候だっけ？」とか「東日本全体での対策どうしようか？」といったエリアの天候をちょっと調べた上で物事を協議する際、わざわざサイトに行って調べるのはめんどくさい(それにいちいち各地の天候はわからない)ので自動的に取得できれば・・と思っておりました。

#直近1週間の天気予報を「自動的に」取得する

ということで、調べたい地区の天候を自動的に取得し、尚且つ売上や客数のデータに反映できる仕組みを考えてみました。

##使用したツール/参照サイト
[PowerAutomateDesktop](https://flow.microsoft.com/ja-jp/desktop/)
[スプレッドシート](https://www.google.com/intl/ja_jp/sheets/about/)
[気象庁HP(天気予報)](https://www.jma.go.jp/bosai/forecast/)
※気象庁の天気予報ページからJSON形式でデータを取得できるため、このページを使用

PowerAutomateDesktopを選定したのはローコードでデータを取得できること、必要なタイミングで起動させるだけでデータ取得が可能であることからが理由です。


#やりたいこと

**以下のフローをPowerAutomateDesktopで自動的に処理**

**①気象庁のHPから直近1週間の天気予報(天気/信頼性/最低・最高気温/平年の平均気温)を取得**
　(今回は広島地区を対象)

![スクリーンショット (285).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1803233/fc58d025-897b-6761-c2f9-f94b30e42b6b.png)

**②取得したデータをJSONに変換**

  <details><summary>コードを見る</summary>
```json:jma.go.jp
// 20210815125702
// https://www.jma.go.jp/bosai/forecast/data/forecast/340000.json
[
  {
    "publishingOffice": "広島地方気象台",
    "reportDatetime": "2021-08-15T11:00:00+09:00",
    "timeSeries": [
      {
        "timeDefines": [
          "2021-08-15T11:00:00+09:00",
          "2021-08-16T00:00:00+09:00",
          "2021-08-17T00:00:00+09:00"
        ],
        "areas": [
          {
            "area": {
              "name": "南部",
              "code": "340010"
            },
            "weatherCodes": [
              "200",
              "214",
              "203"
            ],
            "weathers": [
              "くもり　所により　昼前　雨",
              "くもり　夕方　から　雨",
              "くもり　時々　雨"
            ],
            "winds": [
              "北の風",
              "北の風　日中　南西の風",
              "北の風　後　南の風"
            ],
            "waves": [
              "０．５メートル",
              "０．５メートル",
              "０．５メートル　後　１メートル"
            ]
          },
          {
            "area": {
              "name": "北部",
              "code": "340020"
            },
            "weatherCodes": [
              "200",
              "200",
              "203"
            ],
            "weathers": [
              "くもり　所により　昼前　雨",
              "くもり　所により　夕方　から　雨",
              "くもり　時々　雨"
            ],
            "winds": [
              "北の風　後　北西の風",
              "北西の風　日中　南の風",
              "東の風　後　南の風"
            ]
          }
        ]
      },
      {
        "timeDefines": [
          "2021-08-15T12:00:00+09:00",
          "2021-08-15T18:00:00+09:00",
          "2021-08-16T00:00:00+09:00",
          "2021-08-16T06:00:00+09:00",
          "2021-08-16T12:00:00+09:00",
          "2021-08-16T18:00:00+09:00"
        ],
        "areas": [
          {
            "area": {
              "name": "南部",
              "code": "340010"
            },
            "pops": [
              "20",
              "10",
              "10",
              "20",
              "50",
              "60"
            ]
          },
          {
            "area": {
              "name": "北部",
              "code": "340020"
            },
            "pops": [
              "10",
              "10",
              "10",
              "10",
              "30",
              "40"
            ]
          }
        ]
      },
      {
        "timeDefines": [
          "2021-08-15T09:00:00+09:00",
          "2021-08-15T00:00:00+09:00",
          "2021-08-16T00:00:00+09:00",
          "2021-08-16T09:00:00+09:00"
        ],
        "areas": [
          {
            "area": {
              "name": "広島",
              "code": "67437"
            },
            "temps": [
              "30",
              "30",
              "23",
              "28"
            ]
          },
          {
            "area": {
              "name": "呉",
              "code": "67511"
            },
            "temps": [
              "29",
              "29",
              "24",
              "28"
            ]
          },
          {
            "area": {
              "name": "福山",
              "code": "67401"
            },
            "temps": [
              "30",
              "30",
              "22",
              "29"
            ]
          },
          {
            "area": {
              "name": "庄原",
              "code": "67116"
            },
            "temps": [
              "29",
              "29",
              "17",
              "27"
            ]
          }
        ]
      }
    ]
  },
  {
    "publishingOffice": "広島地方気象台",
    "reportDatetime": "2021-08-15T11:00:00+09:00",
    "timeSeries": [
      {
        "timeDefines": [
          "2021-08-16T00:00:00+09:00",
          "2021-08-17T00:00:00+09:00",
          "2021-08-18T00:00:00+09:00",
          "2021-08-19T00:00:00+09:00",
          "2021-08-20T00:00:00+09:00",
          "2021-08-21T00:00:00+09:00",
          "2021-08-22T00:00:00+09:00"
        ],
        "areas": [
          {
            "area": {
              "name": "広島県",
              "code": "340000"
            },
            "weatherCodes": [
              "214",
              "203",
              "203",
              "203",
              "202",
              "201",
              "201"
            ],
            "pops": [
              "",
              "80",
              "80",
              "80",
              "60",
              "30",
              "20"
            ],
            "reliabilities": [
              "",
              "",
              "B",
              "B",
              "C",
              "A",
              "A"
            ]
          }
        ]
      },
      {
        "timeDefines": [
          "2021-08-16T00:00:00+09:00",
          "2021-08-17T00:00:00+09:00",
          "2021-08-18T00:00:00+09:00",
          "2021-08-19T00:00:00+09:00",
          "2021-08-20T00:00:00+09:00",
          "2021-08-21T00:00:00+09:00",
          "2021-08-22T00:00:00+09:00"
        ],
        "areas": [
          {
            "area": {
              "name": "広島",
              "code": "67437"
            },
            "tempsMin": [
              "",
              "22",
              "23",
              "23",
              "23",
              "25",
              "26"
            ],
            "tempsMinUpper": [
              "",
              "25",
              "25",
              "26",
              "26",
              "26",
              "27"
            ],
            "tempsMinLower": [
              "",
              "21",
              "22",
              "22",
              "22",
              "23",
              "23"
            ],
            "tempsMax": [
              "",
              "27",
              "26",
              "27",
              "31",
              "32",
              "32"
            ],
            "tempsMaxUpper": [
              "",
              "28",
              "30",
              "32",
              "33",
              "35",
              "34"
            ],
            "tempsMaxLower": [
              "",
              "24",
              "25",
              "26",
              "29",
              "30",
              "29"
            ]
          }
        ]
      }
    ],
    "tempAverage": {
      "areas": [
        {
          "area": {
            "name": "広島",
            "code": "67437"
          },
          "min": "25.0",
          "max": "32.5"
        }
      ]
    },
    "precipAverage": {
      "areas": [
        {
          "area": {
            "name": "広島",
            "code": "67437"
          },
          "min": "5.4",
          "max": "33.5"
        }
      ]
    }
  }
]
```
</details>



**③Excelを起動する(予め客数データ(広島地区の店舗)を記録しているファイル)**

**④Excelに取得した天気予報データを書き込みます**

#結論#

![BwR2w6PxBtt5LvfDgb4c1629026118-1629026141.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1803233/d1dc07ac-43c5-078f-da8a-ac1026630828.gif)

向こう1週間の予報だけでなく、平年気温との差も自動計算しているので差分もわかります。


#PowerAutomateDesktop フロー作成

##フロー図　その１

![スクリーンショット (276).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1803233/710be517-d155-20bb-5dde-79112fee3b0c.png)

・エリア(広島地区)を選定（こうしておくと後で各エリアに設定が可能）
・気象庁HPを呼び出し、JSONをオブジェクト～テキストに変換
・Excelを起動（予め客数データを記録しているExcelデータを指定）
・Excelに書き込み（天気や気温、信頼度、平年気温にあたる個所を指定し書き込み）
・予報の最高・最低気温と平年気温の差を自動計算

この地点でExcelを起動してみると・・

##天気のテキストがない・・

天気のテキストがどこを探していても見つからず、よく見ると以下の謎の3桁のコードが存在していることに気づきました。

```json:jma.go.jp
 "weatherCodes": [
              "214",
              "203",
              "202",
              "200",
              "201",
              "101",
              "101"
            ],
```

weatherCodeと呼ばれるもので3桁の数値毎に天気の名称が決まっているとのことです。[詳しくはコチラ](https://twitter.com/izutorishima/status/1364455657169031169?s=20)

様々な解決方法があるとは思いますが、今回はPowerAutomateDesktopを活用し、Excel内で解決する方法を考えてみました。

・予めExcelにweatherCode一覧を別シートに書き込んでおく
・Excelに一旦weatherCodeを反映させる
・自動的にweatherCodeの右側を1列挿入する
・そこにVLOCKUP関数を用いて天気の名称を反映させる

![スクリーンショット (298).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1803233/a675f7a8-24f3-cf31-cae2-a548fd2697c3.png)


##フロー図　その２

![スクリーンショット (297).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1803233/ba09da9e-bcdc-9394-477c-9de7716702bf.png)




・Excelの1列挿入はフロー「44」参照
・空けた列に関数(VLOCKUP)を反映。フロー「45」以降参照


#仕組みをつくって感じたこと

・今まで手動で反映していたものが自動的に処理ができたことで作業時間を協議時間に活用することができると感じました。
・本記事では1店舗のみ抽出しましたが、この仕組みにて全店舗を自動的に抽出し各店舗や担当者へも共有できるようにしたいと思います。
・また、今回は「天候」のみでしたが公開されているAPIで取得可能なもの(例:コロナ予測値等)影響度合いが
特に大きい変数は同じ仕組みでつなげていきます。