Power Automate | Json形式のデータ変換 | CSVファイルの生成
- 2022.06.09
- Power Automate

今回は前回のブログの続きです。技術検証になります。
前回の記事を見ていない方は以下からどうぞ↓
前回までは、OpenAPIからカスタムコネクタを用いてJsonデータを取得しました。
今回のゴールは Open-Meteoから取得したJsonデータを、PowerAutomateで加工します。
Open-Meteoから取得されるjsonデータの形式
jsonデータの形は以下の様になっています。
今回私が欲しいデータは “hourly”の中にある”temperature_2m”と”time”です。
この2つの項目はそれぞれArrayになっており、各インデックスが同一グループになっている感じです。
{
"generationtime_ms":1.5730857849121094,
"longitude":139.625,
"hourly":{
"temperature_2m":[17,17.7, ...以下略... ],
"time":["2022-06-08T00:00","2022-06-08T01:00", ...以下略...]
},
"latitude":35.625,
"hourly_units":{
"temperature_2m":"°C",
"time":"iso8601"
},
"elevation":20.84375,
"utc_offset_seconds":0
}
PowerAutomateでjsonを扱う
jsonデータを扱うには「JSONの解析」を利用します。

コンテンツには「body:カスタムコネクタから取得される出力結果」を設定します。

スキーマは「サンプルから生成」を行います。
以下の画面に、Open-Meteoから出力されるjsonデータをコピペします。

スキーマが自動生成されます。今回は以下のような感じです。
{
"type": "object",
"properties": {
"generationtime_ms": {
"type": "number"
},
"longitude": {
"type": "number"
},
"hourly": {
"type": "object",
"properties": {
"temperature_2m": {
"type": "array"
},
"time": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"latitude": {
"type": "number"
},
"hourly_units": {
"type": "object",
"properties": {
"temperature_2m": {
"type": "string"
},
"time": {
"type": "string"
}
}
},
"elevation": {
"type": "number"
},
"utc_offset_seconds": {
"type": "integer"
}
}
}
Jsonの解析結果を扱う
前述でも述べた通り、今回欲しいデータは「hourly>temperature_2m」と「hourly>time」です。
これを最終的には
time | temp
——————————
time[0] | temperature_2m[0]
time[1] | temperature_2m[1]
time[2] | temperature_2m[2]
…
と出力したいです。
と言うことで、これら2つの項目をまずは配列変数に格納します。
①配列変数の初期化
まずは変数を初期化します。今回は2つの配列変数を作成します。

また初期値には、timeとtemperature_2mを格納します。以下の様な感じです。
※ちなみに timeもtemperature_2mはそれぞれ2つずつ存在します。
1つは「hourly_units」の中にある項目、もう1つはそれぞれのリストデータ(全データがくっついている状態のもの)です。今回は後者(リストデータを選びます)

③2つの変数を初期化する
データ加工用に2つの変数を新たに定義します。
・配列変数:Json配列(CSV作成のため、time:temperature の組み合わせをJson形式で作成)
・カウンタ:後述のApply to eachにて、Json配列のインデックスを指定する際に使用
以下の様に設定しました。

④Json配列の作成
ここでは、timeとtemperature(temp)を1セットにしたJsonファイルを作成します。
「Apply to each」は「配列の長さ分」繰り返しが行われます。
今回は Arr_time(Arr_tempも同様の長さなので、どっちでも良い)の長さ分、繰り返しを行います。

Json配列変数
Json配列変数は、Arr_timeおよびArr_tempの値を動的に設定します。
以下の様に記述することで、Apply to eachが繰り返されるたびにCountの値が+1され、各配列のインデックスが増えていきます。
{
"time": variables('Arr_time')[variables('Count')]
"temp": variables('Arr_temp')[variables('Count')]
}
⑤CSVテーブルの生成
先ほど作成したJson配列を元に、csvテーブルを作成します。
最終的にCSVファイルを作成する際に、このアクションの出力結果である「csvテーブル」が必要になります。
今回は以下の様に設定しました。

⑥csvファイル生成
最後に、CSVテーブルアクションで生成した「出力」結果をもとに、CSVファイルを作成します。
・フォルダーのパス:OneDrive Businessの適切な置き場を指定
・ファイル名:適当な名前
・ファイルコンテンツ:「出力」←csvテーブルのこと

以上のステップでCSVファイルが生成されます。
実際に動かしてみる
実際にフローを実行しましょう。指定したフォルダーのパス内にファイルが生成されていればOKです。
私の場合は、以下の様な中身になっています。

ボトルネックを見てみる
実際に処理に時間が掛かる工程を確認します。
Apply to eachが思った以上に処理に時間が掛かっているようです。(ここはJson配列を作成する処理ですね。)
今後どういった改善ができるかは、要検討したいと思います。

ではまた!
エラー: データの取得に失敗しました。
-
前の記事
Power Automate | カスタムコネクタでAPI連携 |Open-Meteo連携 2022.06.08
-
次の記事
PowerAutomate x Outlook x Teams | カレンダー | 本日の予定を連絡する 2022.06.14