【Power Automate】変数を外出しし、設定ファイル化して利用する

# 概要

　Power Automateで変数を外出ししたい要望とは、ある程度Power Automateをいじくってくると出てきます。特にメッセージ関連。メッセージフォーマットだけ変えたいんよ、そんでもってフローが複数にまたがるんや――そんなわけで、変数を設定ファイルで取り扱えるようにしました。Power Automateで設定ファイルを作ってSwitchを使ってもういやだ、そんなのはもう味わいたくない人向けです。


　もともとは、下記のフローを切り出した内容です。

https://qiita.com/nomico/items/8ad48bda8f49bcde60a4


# 読み込む設定ファイル

　設定ファイルは、以下のような感じのファイルを、key/value=プロパティ名/値として読み込みます。sがなぜついているかは、PowerAutomateはvalueはよく使われるので非常に紛らわしくなるためです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36476/8e488a52-f51f-3a9d-6a3d-344c32f0ab52.png)

# 全体のフローと利用方法
　設定ファイルを読み込み、変数を読み込むまでを実装しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36476/6579fc47-cce4-73d8-205b-a57a5796e96a.png)

　このフローは、パーツ利用（コピペ）を想定しています。スコープ内のスコープ（１）（２）といった単位で適宜コピーしやすいように構成しています。
　このページで紹介するのは（１）（２）です。（１）で設定ファイルを読み込み、（２）で変数を取得する役割を持ちます。


## （１）設定ファイルを読み込む
　このスコープは設定ファイルを読み込み、フロー内で取り扱えられるようになります。Excelから直接変数に値を取り込む場合、IF文の縦展開やらSwitch文の横展開やらえらい羽目になります。それらを回避したいため、アレイで読み込みます。アレイは一次元配列しか取り込めないみたく勝手に思い込んでましたが、どうやら複雑な配列もどんとこいのようです。
　この（１）は、設定ファイルの読み込みのため、フローの最初の1回目だけ実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36476/8b4bde81-1843-7833-7dd9-2d3e82705407.png)


### （１－１）設定ファイルを読み込む

- 「Excel」の「表内に存在する行を一覧表示」を利用。
- 設定ファイルを指定します。ここではテスト用フォルダにあるsetting.xlsxファイルを使います。

### （１－２）key／valueで読み込む

- 「データ操作」の「選択」を利用。
- これにより、（１－１）の全行を二次配列で読み込んでくれます。以下のような形式で読み込まれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36476/9b52661b-81f5-a68d-cd7e-2bf26c92ed7b.png)



## （２）keyの値を取得する
　このスコープは、上記で取得した設定情報から一意のkeyのvalueを取得します。これにより、必要になったタイミングで必要になった変数を定義し、利用することが可能になります。
　（２）は（１）と異なり、変数を取得したい毎に毎回実行します。

　変更箇所は、以下の通り。

- （２－１）env
- （２－３）変数の設定/名前

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36476/1663c7a5-0170-8749-a385-1d59edb3e235.png)



（２）を実行する直前で変数を定義し、上記の変更箇所を修正して読み込む、てのが一番わかりやすく、どの変数をどのタイミングで定義したのかがわかりやすいです。

### （２－１）keyのデータ取得
- （１－２）の設定情報から取得したいkeyにのみデータを絞り込みます。今回の場合は"env"
- 「データ操作」の「アレイのフィルター処理」を利用。  
-  「本文」は（１－２）の出力データ
-  keyは、（１－２）で指定したkeyを取得するための「item()?['key']」

### （２－２）データをJSON解析する
　データは（２－１）で一意に取得したはずですが、形状はJSON形式のままなので、これを変換します。

- （２－１）で絞り込んだデータを、JSON解析をかけます。成功すると、変数に「key」と「value」が選べるようになります
- 「データ操作」の「JSONの解析」を利用
-  「コンテンツ」は（２－１）の出力
-  スキーマは以下。コピペの場合、変更は不要です。

```
{
    "type": "array",
    "items": {
        "type": "object",
        "properties": {
            "key": {
                "type": "string"
            },
            "value": {
                "type": "string"
            }
        },
        "required": [
            "key",
            "value"
        ]
    }
}
```

### （２－３）valueを取得する
- アレイ扱いのためどうしてもこうなる。
- 「コントロール」の「Apply to each」を利用
- 「以前の手順から出力を選択」には、（２－２）の「本文」を指定します


# 使用例

　実際の使用例としては、以下のような感じで使います。

1. （１）設定ファイルを読みこみたいファイルに設定します。
- （１）（２）のスコープをそれぞれコピーします。
- （１）（２）を使いたいフローにペーストします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36476/3a918b8f-dc48-6957-0b00-cd8cf79c879c.png)
 
- （２）を以下のような感じで編集します。変数名とkeyは、統一しておくとどのデータを読み込んだか名称でわかるので便利です。

![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36476/fd8205cc-1ee1-6c1f-4044-346866edc847.png)

　（１）（２）のフローは、基本使う設定ファイルを指定し、コピペ用のフローを作って準備しておきます。そうすると、複数フローにまたがっても、変数の取得をスムーズに行えるようになるかと思います。