Power Automate for desktopを使ってみよう ー （上級編）気象データ取得の自動化

皆さんこんにちは、マイクロソフトの川端です。
Power Automate for desktop (通称PAD) を使い始める方向けのトレーニングコンテンツを提供します。
気象庁から提供されている一般公開データをPADで自動取得する方法を題材にしています。

[初級編はこちら]

# 1. 事前準備
- 最新版のPower Automate for desktopのダウンロード：https://flow.microsoft.com/ja-jp/desktop/
    - **2022年12月09日 時点の最新版は2.27です（→[最新版の確認方法]）。**
    - 最新版でない場合には以下よりインストーラーをダウンロードしお手持ちの端末環境でインストールしてください
        -  https://docs.microsoft.com/ja-jp/power-automate/desktop-flows/install#install-power-automate
- インストール、初期セットアップ手順: ロボ研@K2_kzyさんがまとめて頂いている内容が分かりやすいです。
    - https://qiita.com/K2_kzy/items/b8b22edbf56b65248949#2-%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%A9%E3%83%BC%E8%B5%B7%E5%8B%95
- 本セッションでは出来る限り動作環境を合わせるため、ブラウザはEdgeをご利用頂き、Edgeが無い場合にはChromeをお使いください。
- データ取得対象ページ
    - 気象庁天気予報データ
        - https://www.jma.go.jp/bosai/forecast/
    - 東京の天気予報(area_code=130000)
        - https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=130000
    - 参考（上級編で扱います）APIによるデータ(json)取得対象（東京）
        - https://www.jma.go.jp/bosai/forecast/data/forecast/130000.json

# 2. 上級編
上級編では、PADから気象庁で提供されているWebサービス（API）を利用しデータを取得、その後加工して、複数の地域の気象情報のデータをエクセルファイルへ出力できるようにします。

以下の構成を進めていく際には、作成途中でも、随時保存と実行を行い、正しく動くことを確認していくのがPADをはじめとするRPAツールのコツです！

### Webサービス（API)の情報を取得しよう
#### 1.APIコールでデータを取得するための変数の設定など準備を行います
- 変数の設定アクションでarea_codeという変数を設定し、地域番号（東京：130000)を設定します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/cd50ae71-b015-53ee-541d-b528711f0eb3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/dab467ac-077e-2ef9-cdea-10cc4e580f2c.png)
- また、同様にもう一つ変数の設定アクションでarea_numという変数を設定し、初期値を0とします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/4752b2f3-d5b7-5aa2-6553-e3be21098901.png)

#### 2.ウェブサービスの呼び出しを設定します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/0b5de1d2-df30-ec19-9d89-07641a38880a.png)

- 以下の項目を設定します
    - URL:https://www.jma.go.jp/bosai/forecast/data/forecast/%area_code%.json
    - メソッド：Get
    - 受け入れ：application/xml
    - コンテンツタイプ:application/xml
    - 応答を保存：テキストを変数に変換します(Webページ用)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/63513e13-a09c-b554-c0a9-fb72803773e7.png)

- 実際に実行してみると、Webサービスの応答結果がWebServiceResponse変数に格納されていることが確認できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/090c849f-7347-4ed0-95d7-d9bb6dc9f05b.png)

### 取得したデータ(JSON形式)を加工しよう
#### 1.Webサービスから得られたデータをJSON形式として内部で扱えるようにします
- JSONをカスタムオブジェクトに変換するアクションを追加します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/419ec518-d0a7-570d-a079-a8e316d3a3dd.png)
- Webサービスから返ってきたデータ(WebServiceResponse）が受け渡されるようにしましょう
    - 標準でJsonAsCustomObjectに保存されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/0415585d-6f77-3a09-8afb-a11f2d41f32b.png)
- 実際に得られたデータはブラウザでも確認することができますが、
    - https://www.jma.go.jp/bosai/forecast/data/forecast/130000.json
- データを扱う際は、PADとは別にテキストエディタで内容が確認できるようにしましょう。Visual Studio Codeなどを使うとよいでしょう
    - ドキュメントのフォーマットをすることで、JSON形式のデータがより見やすくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/e31ec042-e1d8-e1ae-2c20-6f488c875c94.png)
    - 整形後はこのように参照できます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/7f39000a-d047-629c-4755-2e512cf2e668.png)

#### 2.JSONデータを指定し、PAD内部で扱いやすいデータ形式とする
- [datetimeをテキストに変換]のアクションを追加します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/7beba517-f250-9b4b-3f7a-90698b4c9a31.png)

- 変換するdatetimeに
    - %JsonAsCustomObject[0]['timeSeries'][0]['timeDefines'][0]%
    - を入力します。実際のJSON形式のデータとの対応関係は、テキストエディタ等で開いた実際のJSONデータとの対応関係で把握されることをお勧めします。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/1bcb80ee-b406-7a7f-560b-735a0575007d.png)

- 標準形式に
    - 短い日付形式を選択することで、JsonAsCustomObject上は"2021-09-03T05:00:00+09:00"というデータがPAD内部で持つFormattedDateTimeとして"2021/09/03"という形式に変換されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/f3775861-6538-8e31-d37e-03de09178af6.png)

### For eachのループを設定し、地域の気象データをまとめてエクセルファイルへ書き込もう
- [Excelの起動] アクションを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/46c24cfc-1b1d-6cf0-aeaf-7453ea7fcbaa.png)
- [Excelワークシート] に書き込みを追加します
    - 書き込む値に先ほどの短い日付形式のFormattedDateTime変数を指定し、1行1列目を指定するのに、行に%area_num+1%を指定します。これは後続の処理でIncrementする変数として扱い動作させるためです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/3dc3d3f8-25de-e5fd-d174-42682ce3fa88.png)
- 正しく実行されると以下のような結果が得られます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/6cd82d8c-cc45-ad45-2baf-d9d3ef227f5e.png)
- 続いてFor eachのループを設定していきます。
    - 反復処理を行う値として以下の値を指定します。
        - %JsonAsCustomObject[0]['timeSeries'][0]['areas']%
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/dc45a034-c257-71b8-4296-d43b16d0002e.png)
    - これはareas配下にある４つの項目（東京地方、伊豆諸島北部、伊豆諸島南部、小笠原諸島）のデータ(key-value storeの項目)に基づき、ループ処理で書き込みを行うため、このように指定します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/b64e294d-da46-9a14-33a7-798209b0bb37.png)
- For eachループの中身としては[Excelワークシートに書き込み]アクションを以下のように４つ設定していきます（途中、アクションをコピーペーストすると作業しやすいでしょう）。
    - [Excelワークシートに書き込み]アクション１（番号）：
        - 書き込む値：%area_num+1%
        - 書き込みモード：指定したセル上
        - 列：2
        - 行：%area_num + 1%
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/a1671974-77fd-7a63-22fb-59a3b4234f6b.png)
    - [Excelワークシートに書き込み]アクション２（エリア情報）：
        - 書き込む値：%JsonAsCustomObject[0]['timeSeries'][0]['areas'][area_num]['area']['name']%
        - 書き込みモード：指定したセル上
        - 列：3
        - 行：%area_num + 1%
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/603756be-8863-8e00-4bc7-80ad655a35a0.png)
    - [Excelワークシートに書き込み]アクション３（天気情報）：
        - 書き込む値：%JsonAsCustomObject[0]['timeSeries'][0]['areas'][area_num]['weathers'][0]%
        - 書き込みモード：指定したセル上
        - 列：4
        - 行：%area_num + 1%
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/45775dda-0a4c-ae03-b265-eccd7e0f5936.png)
    - [Excelワークシートに書き込み]アクション4(風情報）：
        - 書き込む値：%JsonAsCustomObject[0]['timeSeries'][0]['areas'][area_num]['winds'][0]%
        - 書き込みモード：指定したセル上
        - 列：5
        - 行：%area_num + 1%
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/7a5bb148-727e-5068-2253-5a4550289e5e.png)
- 最後に、東京だけではない他のエリアでも同様の処理をするため、[変数を大きくする]アクションをFor eachループの中に追加します
    - 変数名：%area_num%
    - 大きくする数値：1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/f652c337-a634-8a81-ee5b-8e40e7543a99.png)
- 以上、実際に実行してみると以下のような値が書き込まれることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/311a4d62-10c2-cef9-d28b-bc9d4a1debbb.png)

- [最後にExcelを閉じる]アクションで書き込まれた内容を保存します。
全体の構成は以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/2ade651a-c5c8-c305-45d0-ec74fe92d34c.png)

# 3.まとめ
上級編では、Webサービスの呼び出しから得られたデータの加工、JSONオブジェクトからのループ処理によるExcelワークシートへの書き込みを行いました。RPAでは、取得したデータをうまく処理して後続のプロセスにつなげることがポイントになるケースが多く、このようなデータ操作を練習していただくことで、Power Automate Desktopのさらなる利活用につなげていただけましたら幸いです。

[最新版の確認方法]:https://qiita.com/YutoKa/private/bd5047681bbdb73b82bd
[公式ドキュメント]:https://docs.microsoft.com/ja-jp/power-automate/desktop-flows/introduction
[Power Automate Community]:https://powerusers.microsoft.com/t5/Microsoft-Power-Automate/ct-p/MPACommunity
[初級編はこちら]:https://qiita.com/YutoKa/items/43dc0ac25e28192a4d78


# 補足
「Webサービスを呼び出します」がNWポリシーうまくいかない場合
変数の設定 WebServiceResponseから、以下の値を設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/2dc88520-2c85-77e2-9f3b-99527d5422eb.png)

```
[{"publishingOffice":"気象庁","reportDatetime":"2022-12-16T11:00:00+09:00","timeSeries":[{"timeDefines":["2022-12-16T11:00:00+09:00","2022-12-17T00:00:00+09:00","2022-12-18T00:00:00+09:00"],"areas":[{"area":{"name":"東京地方","code":"130010"},"weatherCodes":["111","212","101"],"weathers":["晴れ　夜　くもり","くもり　夜　雨","晴れ　時々　くもり"],"winds":["北の風","北の風　後　南の風","北西の風　やや強く　後　南西の風　やや強く"],"waves":["０．５メートル","０．５メートル","１メートル"]},{"area":{"name":"伊豆諸島北部","code":"130020"},"weatherCodes":["111","214","101"],"weathers":["晴れ　夜　くもり","くもり　夕方　から　雨","晴れ　時々　くもり"],"winds":["西の風　強く　後　北東の風","北東の風　後　西の風　新島　では　後　西の風　やや強く","西の風　強く"],"waves":["３メートル　後　２メートル　ただし　新島　では　３メートル","２メートル　後　１．５メートル　ただし　新島　では　２メートル","２メートル　後　３メートル　ただし　新島　では　２．５メートル　後　４メートル"]},{"area":{"name":"伊豆諸島南部","code":"130030"},"weatherCodes":["111","214","200"],"weathers":["晴れ　夜　くもり","くもり　昼過ぎ　から　雨","くもり"],"winds":["西の風　やや強く　三宅島　では　西の風　強く","西の風　後　北西の風　強く","西の風　強く"],"waves":["３メートル","２．５メートル","３メートル　後　４メートル"]},{"area":{"name":"小笠原諸島","code":"130040"},"weatherCodes":["101","101","202"],"weathers":["晴れ　時々　くもり","晴れ　時々　くもり","くもり　一時　雨"],"winds":["北東の風","東の風　後　南の風　やや強く","南の風　やや強く　後　北の風"],"waves":["２メートル　うねり　を伴う","２メートル　うねり　を伴う","２メートル　後　２．５メートル　うねり　を伴う"]}]},{"timeDefines":["2022-12-16T12:00:00+09:00","2022-12-16T18:00:00+09:00","2022-12-17T00:00:00+09:00","2022-12-17T06:00:00+09:00","2022-12-17T12:00:00+09:00","2022-12-17T18:00:00+09:00"],"areas":[{"area":{"name":"東京地方","code":"130010"},"pops":["0","10","10","20","30","70"]},{"area":{"name":"伊豆諸島北部","code":"130020"},"pops":["10","10","10","20","80","80"]},{"area":{"name":"伊豆諸島南部","code":"130030"},"pops":["10","10","20","40","90","90"]},{"area":{"name":"小笠原諸島","code":"130040"},"pops":["10","10","10","10","10","20"]}]},{"timeDefines":["2022-12-16T09:00:00+09:00","2022-12-16T00:00:00+09:00","2022-12-17T00:00:00+09:00","2022-12-17T09:00:00+09:00"],"areas":[{"area":{"name":"東京","code":"44132"},"temps":["15","15","5","11"]},{"area":{"name":"大島","code":"44172"},"temps":["14","14","6","13"]},{"area":{"name":"八丈島","code":"44263"},"temps":["15","15","10","14"]},{"area":{"name":"父島","code":"44301"},"temps":["23","23","18","23"]}]}]},{"publishingOffice":"気象庁","reportDatetime":"2022-12-16T11:00:00+09:00","timeSeries":[{"timeDefines":["2022-12-17T00:00:00+09:00","2022-12-18T00:00:00+09:00","2022-12-19T00:00:00+09:00","2022-12-20T00:00:00+09:00","2022-12-21T00:00:00+09:00","2022-12-22T00:00:00+09:00","2022-12-23T00:00:00+09:00"],"areas":[{"area":{"name":"東京地方","code":"130010"},"weatherCodes":["212","101","101","101","200","202","101"],"pops":["","10","10","10","40","50","10"],"reliabilities":["","","A","A","B","C","A"]},{"area":{"name":"伊豆諸島北部","code":"130020"},"weatherCodes":["214","101","101","101","202","202","201"],"pops":["","20","20","20","50","50","20"],"reliabilities":["","","A","A","C","C","A"]},{"area":{"name":"伊豆諸島南部","code":"130030"},"weatherCodes":["214","200","201","201","202","202","200"],"pops":["","40","30","30","50","60","40"],"reliabilities":["","","A","A","C","B","B"]},{"area":{"name":"小笠原諸島","code":"130040"},"weatherCodes":["101","202","201","200","202","202","200"],"pops":["","60","30","40","50","50","40"],"reliabilities":["","","C","C","C","C","B"]}]},{"timeDefines":["2022-12-17T00:00:00+09:00","2022-12-18T00:00:00+09:00","2022-12-19T00:00:00+09:00","2022-12-20T00:00:00+09:00","2022-12-21T00:00:00+09:00","2022-12-22T00:00:00+09:00","2022-12-23T00:00:00+09:00"],"areas":[{"area":{"name":"東京","code":"44132"},"tempsMin":["","3","1","2","3","4","4"],"tempsMinUpper":["","4","3","3","4","6","6"],"tempsMinLower":["","1","-1","0","1","0","3"],"tempsMax":["","11","9","10","12","14","13"],"tempsMaxUpper":["","13","11","12","15","17","16"],"tempsMaxLower":["","8","7","8","10","10","10"]},{"area":{"name":"大島","code":"44172"},"tempsMin":["","5","5","5","7","10","8"],"tempsMinUpper":["","7","7","7","9","12","10"],"tempsMinLower":["","3","3","3","6","8","6"],"tempsMax":["","10","9","11","13","15","12"],"tempsMaxUpper":["","12","11","13","15","18","16"],"tempsMaxLower":["","9","8","10","12","14","10"]},{"area":{"name":"八丈島","code":"44263"},"tempsMin":["","9","8","8","10","12","10"],"tempsMinUpper":["","10","9","10","12","14","12"],"tempsMinLower":["","7","6","7","9","11","8"],"tempsMax":["","13","11","13","17","17","15"],"tempsMaxUpper":["","16","12","15","19","19","18"],"tempsMaxLower":["","12","10","11","15","16","13"]},{"area":{"name":"父島","code":"44301"},"tempsMin":["","19","18","17","18","19","19"],"tempsMinUpper":["","21","19","19","19","21","20"],"tempsMinLower":["","18","17","16","16","18","17"],"tempsMax":["","24","22","21","22","23","23"],"tempsMaxUpper":["","25","23","22","24","25","24"],"tempsMaxLower":["","23","21","20","21","22","22"]}]}],"tempAverage":{"areas":[{"area":{"name":"東京","code":"44132"},"min":"3.2","max":"11.5"},{"area":{"name":"大島","code":"44172"},"min":"6.0","max":"13.0"},{"area":{"name":"八丈島","code":"44263"},"min":"9.4","max":"14.9"},{"area":{"name":"父島","code":"44301"},"min":"17.7","max":"22.3"}]},"precipAverage":{"areas":[{"area":{"name":"東京","code":"44132"},"min":"0.3","max":"9.9"},{"area":{"name":"大島","code":"44172"},"min":"3.1","max":"23.3"},{"area":{"name":"八丈島","code":"44263"},"min":"18.0","max":"42.1"},{"area":{"name":"父島","code":"44301"},"min":"5.5","max":"26.6"}]}}]
```