横長なSwitchアクション・条件分岐はJSON Dictionaryですっきり短く

Power Automateでよくやる値の変換操作。
変換の分岐が少なければ条件分岐 (Conditionアクション) を入れ子にして対応したりしますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/8e49412c-539e-4c08-5de3-1a5183a554ad.png)
この図ではDepartmentという変数の値に応じて、Managerという変数の値の設定を分岐させています。


または、選択肢が多い場合には、Switchアクションを利用することもしばしばだと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/2f377a19-a195-a892-9fef-ea8534a3a22f.png)
わかりやすさでいえば、これらの分岐はわかりやすいですよね。直観的だし。ただ横に長くなりすぎて全体を見渡すのはすごく大変です。

そんなときに役立つ方法をご紹介します。

それがJSON Dictionaryを利用したマッピングです。

# 考え方

JSON Dictionaryでは、JSONオブジェクトで辞書を作ります。そしてマッピングは、入力をもとに辞書を引くことで実現されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/2ed39881-7f2d-e8d4-d538-f4510189cdce.png)

入力された値に応じて辞書を探して目当ての値を得ます。似たような方法として、変換用のテーブルを用意しておく方法があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/afdb4024-367b-d4c3-2b76-c1870e1a65d0.png)

この方法でも同じように入力に応じた値をテーブルから取得することはできます。Power Automateでの手続きの違いについては後程紹介します。

# Power Automateでの手続き
ここからは上の2つの方法をPower Automateでどうやって実現するかです。

## JSON Dictionaryの場合

まずは辞書を定義しましょう。これには**作成 (Compose)**アクションを使います。その入力に以下のようなJSONを書きます。

```json
{
    "IT":"John",
    "Finance":"Ellis",
    "HR":"Pieter",
    "Sales":"Mike"
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/398f5ca0-50ca-22f0-4fa0-80049733c64f.png)

あとは**Manager**という変数に値を設定するアクションで、以下の式を設定します。

```
outputs('Compose')?[variables('Department')]
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/6932bb32-09a4-c8ac-67e6-e24648be561a.png)

ここでやっているのは**『Composeというアクションで定義されたJSONの中で、Departmentの変数の値をキーに持つ部分を取り出して』**という問い合わせです。
例えばDepartment変数に「IT」が入っていれば、先ほど定義したJSONの中でキーが"IT"になっている部分の値、Johnが取り出されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/abc28b60-8948-2613-ab3f-73f7c0a0d525.png)

ということで、縦に置いた2アクションだけで値のマッピングが実現されました。


## 変換テーブルの場合

次に変換テーブルを使う場合です。この時も同様に、**作成 (Compose)**アクションで変換テーブルを定義しておきます。

```json
[
    {
        "Department": "IT",
        "Manager": "John"
    },
    {
        "Department": "Finance",
        "Manager": "Ellis"
    },
    {
        "Department": "HR",
        "Manager": "Pieter"
    },
    {
        "Department": "Sales",
        "Manager": "Mike"
    }
]
```
次に配列の中から"Department"の値が変数の値に等しい行を取り出します(たとえばDepartment変数がITなら、最初の一行目を取り出したい)。

これには **Filter array**アクションを使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/cab2c1b8-8508-62a3-ebf5-cba030dd932c.png)

ちょっとだけ面倒ですが、`item()?['Department']`のところだけ、式を書きます。

これで変換テーブルから対象の行を取得できました。でもこのままだとFilterの結果は1行だけの配列なので、その中のManagerを取り出すために以下の式を使う必要があります。

```
first(body('Filter_array'))?['Manager']
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/e353b390-7131-cbd6-128b-a10b3cf280d7.png)

このあたり、firstの使い方は[こちらのブログ](https://mofumofupower.hatenablog.com/entry/2020/09/07/160111)を参考にしてください。

さて、これで求めていたマッピングができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/ddd0a7bc-03a3-f747-1cc1-3e7cc609c4b7.png)

# おわり

今回はPower Automateのクラウドフローで、横長になりがちな値のマッピング処理をいかにすっきりさせるか、方法を2つご紹介しました。
どちらもメリデメあるんですが、個人的には、静的なマッピングなら断然JSON Dictionaryのほうが簡単かなと思います。（式を書くところも少ないし）

今回は配列やDictionaryを手で定義しましたが、なんらかのデータソースから引っ張ってくる場合でも手続きとしては同じです。
横長のフロー見にくいなーと思ったら試してみてください。

本体のほうのブログでも色々とPower Automateの小ネタを書いているので、見てみて下さい！

https://mofumofupower.hatenablog.com/archive/category/Power%20Automate