【PowerAutomate】設定ファイルから読み込むファイルを切り替える

# きっかけ

　テストと運用で、ファイルを切り替えたい目的により試行錯誤しました。
　複数のフローにまたがるため再利用しやすい形に落とし込みたい、Excelのファイルから読み込むのはまあいい、しかしExcelのIF文もしくはSwitch文を修正するのは不毛に感じる――といった自分の要望から、再利用しやすそうなやり方を考えました。
　設定リストをArrayListみたくに取り扱いたい、というのがこの実装のはじまりです。


# 読み込む設定ファイル

　以下のような感じのファイルを、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)

　このフローは、パーツ利用（コピペ）を想定しています。スコープ内のスコープ（１）（２）といった単位で適宜コピーしやすいように構成しています。
　ですが、変数の初期化はどうしても一緒にまとめられません。なので、スコープ外に、「変数定義 env」「変数定義　filename」をスコープ外で定義しています。（１）（２）（３）にはいずれかの変数が組み込まれているので、適宜変数の初期化をお願いします。

　なお、このページの要望を求めている人にはおおよそ感じることができそうな内容は、省略しています。


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

※注意：以下より「」の指定は選択できるものですが、そのままの表記の場合は直接入力するものとなります。

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

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


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

　これにより、（１－１）の全行を二次配列で読み込んでくれます。以下のような形式で読み込まれます。
- 使用アクション：「データ操作」＞「選択」
- 開始：「（１－１）設定ファイルを読み込む」＞「value」
- マップ　key：「（１－１）設定ファイルを読み込む」＞「skey」
- マップ　value：「（１－１）設定ファイルを読み込む」＞「svalue」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36476/9b52661b-81f5-a68d-cd7e-2bf26c92ed7b.png)

## （２）key envの値を取得する
　このスコープは、上記で取得した設定情報から一意のkeyのvalueを取得します。これにより、必要になったタイミングで必要になった変数を定義し、利用することが可能になります。
　ここでは取得したいkeyはenvとなっています。これ以外のkeyを取得したい場合、（a）「envのデータ取得」の次の値に等しい文字列を変更し、(b)「envのvalueを取得する」の「変数の設定」の「名前」を変更する、の2点で対応が可能になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36476/9dc4e4de-9386-1e75-a1f6-572ada9eaaad.png)


### （２－１）envのデータ取得
 （１－２）の設定情報から取得したいkeyにのみデータを絞り込みます。今回の場合は"env"。

- 使用アクション：「データ操作」＞「アレイのフィルター処理」
- 差出人：「（１－２）key／valueで読み込む」＞「出力」
- 次の値に等しい　左辺： item()?['key']
- 次の値に等しい　右辺： env

### （２－２）envデータをJSON解析する
 （２－１）で絞り込んだデータを、JSON解析をかけます。成功すると、変数に「key」と「value」が選べるようになります
- 使用アクション：「データ操作」＞「JSONの解析」
- コンテンツ：「（２－１）keyのデータ取得」＞出力
-  スキーマは以下：

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

### （２－３）envのvalueを取得する
 アレイ扱いのためどうしてもループ取得になります。2行あった場合には考慮していないです。

-  使用アクション：「コントロール」＞「Apply to each」
- 以前の手順から出力を選択：「（２－２）データをJSON解析する」＞「本文」
- 変数の設定/名前：「env」
- 変数の設定/値：items('（２－３）valueを取得する')['value']


## （３）環境用に沿ったファイルを取得する

　ここのスコープは、（１）（２）を使った応用です。ここでは、上記のスコープ（２）で取得したenvのvalueを利用し、別の設定項目のファイルパスを使ってファイルを読み込みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36476/c20da518-c028-c3a2-0abd-922e31be9271.png)

　毎回参照しに行くのが面倒になってきたので変数を以下にまとめます。

### （３－１）特定のkeyの値を取得する（env.filename）

- 早速（２）をコピーして利用
-  ここではenvのvalueを使ってkeyを生成します。今回の場合は、取得したい値のkeyは「stg.filename」となり、取得する値は「/テスト用/stg.xlsx」となります

### （３－２）env.filenameで指定ファイルを取得する

　このスコープはこちらを参考しました。設定方法については以下を参照してください。

https://qiita.com/mizukyf/items/081023dbf03609a321e3

### （３－２－１）SharePoint に HTTP 要求を送信します

-  使用アクション：「SharePoint」＞「SharePoint に HTTP 要求を送信します」
-  サイトのアドレス：任意
-  方法：「GET」
-  URI：_api/v2.0/drive/root:/「filename」
- ヘッダー/キー：accept
- ヘッダー/値：application/json

### （３－２－２）表内に存在する行を一覧表示

-  使用アクション：「Excel Online（Business）」＞「表内に存在する行を一覧表示」
-  場所：任意
-  ドキュメントライブラリ：「ドキュメント」
-  ファイル：outputs('（３－２－１）SharePoint_に_HTTP_要求を送信します')?['body']['id']
-  テーブル：任意


# この実装の利点

　このフローの利点は、変数を用意する以外は、アクションの追加削除をすることなく、変数などの修正対応のみで、設定情報（key/valueのvalue値）を取得することができる点です。
　フローの最初で、（１）のスコープで一度読み込むと、（２）を繰り返すことで、必要なタイミングに必要な設定値を切り出して取得することが可能です。 

# 補足：動的Excelへのデータ取得と更新について

　このやり方の欠点は、ユニークなExcelファイルを読み込まないため、カラムの指定を自分でがんばらなければならない所です。

## データ取得時

 データ取得時は、itemsを自分で記入します。
 [Column Name]を項目名に変更します。

```
item()?['[Column Name]']
```


## データ更新時
　データ更新時は、JSON方式で記入します。
　[Column Name]を項目名に、[Value]を変更したい項目にします。

```
{
"[Column Name]": "[Value]",
"[Column Name]": "[Value]",
"[Column Name]": "[Value]"
}
```

参考URL：
- https://powerusers.microsoft.com/t5/Building-Flows/PROVIDE-ITEM-PROPERTIES-IN-EXCEL-ONLINE/m-p/757552/highlight/true#M104564