子フロー：動的Excelファイル＋テーブル情報取得

# きっかけ

PowerAutomateで固定Excelファイルからテーブル操作する場合、UIのプルダウンから設定して簡単に情報操作できます。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/24ebedd1-d5bf-a4fc-9092-ed6e50fc7977.png">

ただ、年度別ファイルなど、動的ファイルを操作する場合、場所・ドキュメントライブラリ・ファイル・テーブルといったUIが内部で処理しているID等の情報を事前取得して「カスタム値」設定しなければならないのですが、これが結構面倒くさいです。

[PowerAutomate：子フローの作成](https://qiita.com/shutaro_y/items/d1f2e208d26584a08b1a)  をベースに、動的Excelテーブル情報取得を子フロー化すると幸せになれそうと思い、実装してみましたので内容を紹介します。
なお、情報を取得するExcelファイルは以下にある前提です。
* SharePoint：Shared Documents配下（私はこれ以外使わなかったので💦）
* OneDrive：OneDrive配下

＜親フロー処理内容＞
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/afc5d952-fb1e-1374-fdf1-0c675f6500f5.png">

＜実行結果＞
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/1b78d5d6-b16c-a4af-cd6a-1210bad2153e.png">


# 子フロー全体像
条件分岐の中はちょっと複雑（後述）ですが、構成は以下の通りです。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/97c7dd40-c5f4-8fb4-19f4-06813e72fee1.png">


# ①トリガ設定
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/3da693ca-a5fd-fe37-275d-86a3eef32e68.png">

親フローからは3つの引数を渡します。
* [必須：文字列] SharePointURL
SharePointの「テナント別ドメイン＋sites＋サイトパス(第１階層)」、OneDriveの場合はSharePointの「テナント別ドメイン＋personal＋個人パス（第１階層）」をhttps:\/\/から指定します。
例１）https://hoge.sharepoint.com/sites/hoge/
例２）https://hoge-my.sharepoint.com/personal/id0000_hoge_com/
* [必須：文字列] ファイルパス
Shared Documents、もしくはOneDriveからExcelファイルまでのパスを指定します。SharePointの場合、「/Shared Documents」を除いてそのあとのパスを指定します（先頭は「/」）。
例）/hoge/fuga/test.xlsx
* [任意：文字列] テーブル名
テーブル名を指定します。テーブルのないExcelを操作する場合もあるので、任意指定にします。

:::note warn
フィールドはデフォルトで「必須」設定となります。任意にするには対象フィールドの三点メニューから「フィールドをオプションにします」を選択してください。
:::

# ②変数初期化
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/7e111ed1-553f-246f-2b6f-1a5a00dc1191.png">

『変数を初期化する』で7つの変数を設定します。初期値設定するのは以下3つです。
* SharePointURL
ブラウザでExcelを表示する場合に余計な文字が加わることがあるので、引数で渡された値に含まれる一部値を除去して設定します。
`@{replace(replace(trim(triggerBody()?['text']),'/:f:/r',''),'/:x:/r','')}`
* ファイルパス
引数で渡された値を設定します。
`@triggerBody()?['text_1']`
* テーブル名
引数で渡された値を設定します。
`@triggerBody()?['text_2']`

:::note warn
トリガ設定手順により「text」、「text_1」、「text_2」は違う名前になっている可能性があります。
:::


# ③グループID/ドライブID設定
### ③-1) SharePointドライブ情報のHTTP要求
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/15bb2cf9-3a6b-1bd8-00b4-eaa9d8255e27.png">

『SharePoint に HTTP 要求を送信します』でGraph REST API連携してドライブ一覧を取得します。
* サイトのアドレス：(カスタム値)`@variables('SharePointURL')`
* 方法：`GET`
* URI：`_api/v2.0/drives/`
* ヘッダ：`accept|application/json`

https://learn.microsoft.com/ja-jp/graph/api/resources/drive?view=graph-rest-1.0


---
### ③-2) SharePointドライブ情報の応答あり？
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/90cbe312-7c2d-e45b-42c8-65b785b769c8.png">

『条件』でAPI連携結果が取得できたか条件分岐設定します。
* 左辺： (式)`body('SharePointドライブ情報のHTTP要求')?['value']` 
* 条件：次の値に等しくない
* 右辺： (式)`null`

三点メニュー「実行条件の構成」を選択し、失敗時もチェックを入れます。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/0f23ab4f-ab75-f89b-4de4-7e8b334a53e6.png">

:::note alert
失敗時の設定を入れない場合、パラメータミスなどで子フローが停止したとしても、呼び出し元の親フローに応答が返らなくなり処理が止まらなくなってしまいます。
:::

---
③-2)条件分岐以下の構成は以下の通りです。
<img width="1200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/9704b114-6df4-6e8c-404f-66eff68fde3f.png">

---
### ③-3)ドライブ情報抽出
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/0cefa4da-df78-8f16-e75d-b42c31cf22bf.png">

『アレイのフィルター処理』でAPI応答配列のうち、nameが「ドキュメント」「OneDrive」に一致するものを抽出します。条件は「詳細設定モードで編集」から指定します。
* 差出人：(式)`body('SharePointドライブ情報のHTTP要求')?['value']`
* 条件：`@or(equals(item()?['name'], 'ドキュメント'),equals(item()?['name'], 'OneDrive'))`

---

### ③-4)ドキュメント or OneDriveあり？
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/d1dedfa8-e793-8b40-941e-2be3380f56d2.png">

『条件』で3)の結果が1件かどうかを判定します。
* 左辺：(式)`length(body('ドライブ情報抽出'))`
* 条件：次の値に等しい
* 右辺：1
---

### ③-5)ドライブIDの設定
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/37499490-12a1-f22a-6232-948130555e19.png">

『変数の設定』で3)の抽出結果からドライブIDを設定します。
値：`@{body('ドライブ情報抽出')?[0]['id']}`

---

### ③-6)グループ属性あり？
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/100b765f-28c2-b4f0-6d25-2636b1460ba8.png">

『条件』で③-3)の抽出結果に「owner/group」属性が含まれるか条件分岐設定します。
* 左辺： (式)`body('ドライブ情報抽出')?[0]?['owner']?['group']` 
* 条件：次の値に等しくない
* 右辺： (式)`null`

---

### ③-7)グループIDの設定
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/9770d72e-92dd-6afa-7cfd-c53bab8d9688.png">

『変数の設定』で3)の抽出結果からドライブIDを設定します。
値：`groups/@{body('ドライブ情報抽出')?[0]['owner']['group']['id']}`

:::note warn
先頭の固定文字列「groups/」をお忘れなく。。。
:::
---

### ③-8)エラーメッセージ設定②
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/72ffb477-d71e-1bc6-3b68-7ef4fbf9fe36.png">

『変数の設定』でエラーメッセージに指定SharePointURLではドキュメント/OneDriveのドライブ情報が取得できなかった旨の値を設定します。

---

### ③-9) エラーメッセージ設定①
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/6b1ddb06-e3ba-18dc-137b-7aa6daddad22.png">

『変数の設定』でエラーメッセージに指定SharePointURLが正しくない旨の値を設定します。

---

# ④ファイルID設定
### 1)SharePointドライブ項目情報のHTTP要求
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/060e374b-ae75-ac84-47d5-4302abbf2ccf.png">

『SharePoint に HTTP 要求を送信します』でGraph REST API連携してドライブの項目を取得します。
* サイトのアドレス：(カスタム値)`@variables('SharePointURL')`
* 方法：`GET`
* URI：`_api/v2.0/drives/@{variables('ドライブID')}/root:@{variables('ファイルパス')}`
* ヘッダ：`accept|application/json`

https://learn.microsoft.com/ja-jp/graph/api/resources/driveitem?view=graph-rest-1.0

---

### ④-2) SharePointドライブ項目情報の応答あり？
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/42e0f2f3-fb40-710b-60ef-831fd9a77120.png">

『条件』でAPI連携結果が取得できたか条件分岐設定します。
* 左辺： (式)`body('SharePointドライブ項目情報のHTTP要求')?['@odata.context']` 
* 条件：次の値に等しくない
* 右辺： (式)`null`

三点メニュー「実行条件の構成」を選択し、失敗時もチェックを入れます。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/22fcdc94-9c6a-268a-63f4-0afebe068a68.png">

:::note alert
失敗時の設定を入れない場合、パラメータミスなどで子フローが停止したとしても、呼び出し元の親フローに応答が返らなくなり処理が止まらなくなってしまいます。
:::

---
④-2)条件分岐以下の構成は以下の通りです。
<img width="1200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/3605f15e-962c-35ab-3490-4f845f5a52e9.png">

---
### ④-3)ファイルIDの設定
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/d43ec2dd-b7cc-db74-071d-8a875f7cafd6.png">

『変数の設定』で④-3)の抽出結果からドライブIDを設定します。
値：`@{body('SharePointドライブ項目情報のHTTP要求')?['id']}`

---

### ④-4)前処理でエラーなし？
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/b259fb80-ce10-e35d-6aa9-fe0580c49307.png">

『条件』で前段処理でエラーメッセージが設定されているか条件分岐設定します。
* 左辺：(式)`variables('エラーメッセージ')`
* 条件：次の値に等しい
* 右辺：(式)`null`

---

### ④-5)エラーメッセージ設定③
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/2e2d712f-1ce8-aa71-2c33-027ac9ed2df1.png">

『変数の設定』でエラーメッセージに指定ファイルパスが正しくない旨の値を設定します。

---

# ⑤Excelテーブル情報取得
### ⑤-1)テーブルの取得
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/9f487926-4d72-ce3e-139d-cd0cf9daf8cf.png">

『テーブルの取得』で今までの処理で取得したグループID・ドライブID・ファイルIDを用いて、指定パスExcelのテーブル一覧を取得します。
* 場所：(カスタム値)(式)`variables('グループID')`
* ドキュメントライブラリ：(カスタム値)(式)`variables('ドライブID')`
* ファイル：(式)`variables('ファイルID')`

---

### ⑤-2)テーブルあり？
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/c53eccae-faaa-dfb1-236c-845cca2ee1ec.png">

『条件』でテーブル情報が取得できたか条件分岐設定します。
* 左辺： `@body('テーブルの取得')?['value']` 
* 条件：次の値に等しくない
* 右辺： `@null`

三点メニュー「実行条件の構成」を選択し、失敗時もチェックを入れます。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/7485c19a-6a59-92a3-4986-a96282676a74.png">

:::note alert
失敗時の設定を入れない場合、パラメータミスなどで子フローが停止したとしても、呼び出し元の親フローに応答が返らなくなり処理が止まらなくなってしまいます。
:::

---

⑤-2)条件分岐以下の構成は以下の通りです。
<img width="1200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/f9973cfc-8766-3177-a134-81679d18f08f.png">

---

### ⑤-3)引数でテーブル名の指定あり？
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/e18fa60b-5e21-812f-35e0-ac16fefaecb4.png">

『条件』でテーブル情報が取得できたか条件分岐設定します。
* 左辺： (式)`variables('テーブル名')` 
* 条件：次の値に等しくない
* 右辺： (式)`null`

---

# ⑤-4)指定テーブル名で抽出
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/a6cbaf60-2aec-2948-8b13-c02bddc47d11.png">

『アレイのフィルター処理』でAPI応答配列のうち、nameが「ドキュメント」「OneDrive」に一致するものを抽出します。条件は「詳細設定モードで編集」から指定します。
* 差出人：(式)`body('SharePointドライブ情報のHTTP要求')?['value']`
* 左辺：(式)`item()?['name']` 
* 条件：次の値に等しい
* 右辺：(式)`variables('テーブル名')` 

---

### ⑤-5)テーブル名一致あり？
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/e31a9452-1697-32da-9882-3cc64e4f7704.png">

『条件』で引数指定したテーブル情報が取得できたか条件分岐設定します。
* 左辺：(式)`length(body('指定テーブル名で抽出'))` 
* 条件：次の値に等しい
* 右辺：1

---

### ⑤-6)指定テーブルのテーブルIDの設定
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/33c42426-f2e5-43b3-4793-78ae9b1d313c.png">

『変数の設定』でテーブルIDに指定テーブル名で抽出できたテーブル情報のIDを設定します。
* 値：`@{body('指定テーブル名で抽出')?[0]?['id']}`

---

### ⑤-7)エラーメッセージ設定④
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/2e0e7806-eac3-40f9-6fea-4c8f69753110.png">

『変数の設定』でエラーメッセージに指定テーブル名が正しくない旨の値を設定します。

---

### ⑤-8)テーブル配列の最初の値をテーブルIDに設定
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/65ab0f1e-401c-4f0a-a313-5567d23f651d.png">

『変数の設定』でテーブルIDに取得したテーブル配列の最初のIDを設定します。
* 値：`@{body('テーブルの取得')?['value'][0]?['id']}`

---
# ⑥応答設定
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/c3f2a73b-079c-b645-71aa-76fb1752d7b0.png">

『PowerApp または Flow に応答する』で取得したパラメータ、エラーメッセージを返り値として設定します。
* グループID：`@variables('グループID')`
* ドライブID：`@variables('ドライブID')`
* ファイルID：`@variables('ファイルID')`
* テーブルID：`@variables('テーブルID')`
* エラーメッセージ：`@variables('エラーメッセージ')`

---

:::note warn
本フローではExcelやSharePointなど適切に権限付与しなければ使えないアクションが含まれています。権限付与は[子フローの権限設定変更](https://qiita.com/shutaro_y/items/67f3f0530d35dfb3d802#%E5%AD%90%E3%83%95%E3%83%AD%E3%83%BC%E3%81%AE%E6%A8%A9%E9%99%90%E8%A8%AD%E5%AE%9A%E5%A4%89%E6%9B%B4)に記載してるので参考にしてください。
:::