きっかけ
PowerAutomateで固定Excelファイルからテーブル操作する場合、UIのプルダウンから設定して簡単に情報操作できます。
ただ、年度別ファイルなど、動的ファイルを操作する場合、場所・ドキュメントライブラリ・ファイル・テーブルといったUIが内部で処理しているID等の情報を事前取得して「カスタム値」設定しなければならないのですが、これが結構面倒くさいです。
PowerAutomate:子フローの作成 をベースに、動的Excelテーブル情報取得を子フロー化すると幸せになれそうと思い、実装してみましたので内容を紹介します。
なお、情報を取得するExcelファイルは以下にある前提です。
- SharePoint:Shared Documents配下(私はこれ以外使わなかったので💦)
- OneDrive:OneDrive配下
子フロー全体像
条件分岐の中はちょっと複雑(後述)ですが、構成は以下の通りです。
①トリガ設定
親フローからは3つの引数を渡します。
- [必須:文字列] SharePointURL
SharePointの「テナント別ドメイン+sites+サイトパス(第1階層)」、OneDriveの場合はSharePointの「テナント別ドメイン+personal+個人パス(第1階層)」をhttps://から指定します。
例1)https://hoge.sharepoint.com/sites/hoge/
例2)https://hoge-my.sharepoint.com/personal/id0000_hoge_com/ - [必須:文字列] ファイルパス
Shared Documents、もしくはOneDriveからExcelファイルまでのパスを指定します。SharePointの場合、「/Shared Documents」を除いてそのあとのパスを指定します(先頭は「/」)。
例)/hoge/fuga/test.xlsx - [任意:文字列] テーブル名
テーブル名を指定します。テーブルのないExcelを操作する場合もあるので、任意指定にします。
フィールドはデフォルトで「必須」設定となります。任意にするには対象フィールドの三点メニューから「フィールドをオプションにします」を選択してください。
②変数初期化
『変数を初期化する』で7つの変数を設定します。初期値設定するのは以下3つです。
- SharePointURL
ブラウザでExcelを表示する場合に余計な文字が加わることがあるので、引数で渡された値に含まれる一部値を除去して設定します。
@{replace(replace(trim(triggerBody()?['text']),'/:f:/r',''),'/:x:/r','')}
- ファイルパス
引数で渡された値を設定します。
@triggerBody()?['text_1']
- テーブル名
引数で渡された値を設定します。
@triggerBody()?['text_2']
トリガ設定手順により「text」、「text_1」、「text_2」は違う名前になっている可能性があります。
③グループID/ドライブID設定
③-1) SharePointドライブ情報のHTTP要求
『SharePoint に HTTP 要求を送信します』でGraph REST API連携してドライブ一覧を取得します。
- サイトのアドレス:(カスタム値)
@variables('SharePointURL')
- 方法:
GET
- URI:
_api/v2.0/drives/
- ヘッダ:
accept|application/json
③-2) SharePointドライブ情報の応答あり?
『条件』でAPI連携結果が取得できたか条件分岐設定します。
- 左辺: (式)
body('SharePointドライブ情報のHTTP要求')?['value']
- 条件:次の値に等しくない
- 右辺: (式)
null
三点メニュー「実行条件の構成」を選択し、失敗時もチェックを入れます。
失敗時の設定を入れない場合、パラメータミスなどで子フローが停止したとしても、呼び出し元の親フローに応答が返らなくなり処理が止まらなくなってしまいます。
③-3)ドライブ情報抽出
『アレイのフィルター処理』でAPI応答配列のうち、nameが「ドキュメント」「OneDrive」に一致するものを抽出します。条件は「詳細設定モードで編集」から指定します。
- 差出人:(式)
body('SharePointドライブ情報のHTTP要求')?['value']
- 条件:
@or(equals(item()?['name'], 'ドキュメント'),equals(item()?['name'], 'OneDrive'))
③-4)ドキュメント or OneDriveあり?
『条件』で3)の結果が1件かどうかを判定します。
- 左辺:(式)
length(body('ドライブ情報抽出'))
- 条件:次の値に等しい
- 右辺:1
③-5)ドライブIDの設定
『変数の設定』で3)の抽出結果からドライブIDを設定します。
値:@{body('ドライブ情報抽出')?[0]['id']}
③-6)グループ属性あり?
『条件』で③-3)の抽出結果に「owner/group」属性が含まれるか条件分岐設定します。
- 左辺: (式)
body('ドライブ情報抽出')?[0]?['owner']?['group']
- 条件:次の値に等しくない
- 右辺: (式)
null
③-7)グループIDの設定
『変数の設定』で3)の抽出結果からドライブIDを設定します。
値:groups/@{body('ドライブ情報抽出')?[0]['owner']['group']['id']}
先頭の固定文字列「groups/」をお忘れなく。。。
③-8)エラーメッセージ設定②
『変数の設定』でエラーメッセージに指定SharePointURLではドキュメント/OneDriveのドライブ情報が取得できなかった旨の値を設定します。
③-9) エラーメッセージ設定①
『変数の設定』でエラーメッセージに指定SharePointURLが正しくない旨の値を設定します。
④ファイルID設定
1)SharePointドライブ項目情報のHTTP要求
『SharePoint に HTTP 要求を送信します』でGraph REST API連携してドライブの項目を取得します。
- サイトのアドレス:(カスタム値)
@variables('SharePointURL')
- 方法:
GET
- URI:
_api/v2.0/drives/@{variables('ドライブID')}/root:@{variables('ファイルパス')}
- ヘッダ:
accept|application/json
④-2) SharePointドライブ項目情報の応答あり?
『条件』でAPI連携結果が取得できたか条件分岐設定します。
- 左辺: (式)
body('SharePointドライブ項目情報のHTTP要求')?['@odata.context']
- 条件:次の値に等しくない
- 右辺: (式)
null
三点メニュー「実行条件の構成」を選択し、失敗時もチェックを入れます。
失敗時の設定を入れない場合、パラメータミスなどで子フローが停止したとしても、呼び出し元の親フローに応答が返らなくなり処理が止まらなくなってしまいます。
④-3)ファイルIDの設定
『変数の設定』で④-3)の抽出結果からドライブIDを設定します。
値:@{body('SharePointドライブ項目情報のHTTP要求')?['id']}
④-4)前処理でエラーなし?
『条件』で前段処理でエラーメッセージが設定されているか条件分岐設定します。
- 左辺:(式)
variables('エラーメッセージ')
- 条件:次の値に等しい
- 右辺:(式)
null
④-5)エラーメッセージ設定③
『変数の設定』でエラーメッセージに指定ファイルパスが正しくない旨の値を設定します。
⑤Excelテーブル情報取得
⑤-1)テーブルの取得
『テーブルの取得』で今までの処理で取得したグループID・ドライブID・ファイルIDを用いて、指定パスExcelのテーブル一覧を取得します。
- 場所:(カスタム値)(式)
variables('グループID')
- ドキュメントライブラリ:(カスタム値)(式)
variables('ドライブID')
- ファイル:(式)
variables('ファイルID')
⑤-2)テーブルあり?
『条件』でテーブル情報が取得できたか条件分岐設定します。
- 左辺:
@body('テーブルの取得')?['value']
- 条件:次の値に等しくない
- 右辺:
@null
三点メニュー「実行条件の構成」を選択し、失敗時もチェックを入れます。
失敗時の設定を入れない場合、パラメータミスなどで子フローが停止したとしても、呼び出し元の親フローに応答が返らなくなり処理が止まらなくなってしまいます。
⑤-3)引数でテーブル名の指定あり?
『条件』でテーブル情報が取得できたか条件分岐設定します。
- 左辺: (式)
variables('テーブル名')
- 条件:次の値に等しくない
- 右辺: (式)
null
⑤-4)指定テーブル名で抽出
『アレイのフィルター処理』でAPI応答配列のうち、nameが「ドキュメント」「OneDrive」に一致するものを抽出します。条件は「詳細設定モードで編集」から指定します。
- 差出人:(式)
body('SharePointドライブ情報のHTTP要求')?['value']
- 左辺:(式)
item()?['name']
- 条件:次の値に等しい
- 右辺:(式)
variables('テーブル名')
⑤-5)テーブル名一致あり?
『条件』で引数指定したテーブル情報が取得できたか条件分岐設定します。
- 左辺:(式)
length(body('指定テーブル名で抽出'))
- 条件:次の値に等しい
- 右辺:1
⑤-6)指定テーブルのテーブルIDの設定
『変数の設定』でテーブルIDに指定テーブル名で抽出できたテーブル情報のIDを設定します。
- 値:
@{body('指定テーブル名で抽出')?[0]?['id']}
⑤-7)エラーメッセージ設定④
『変数の設定』でエラーメッセージに指定テーブル名が正しくない旨の値を設定します。
⑤-8)テーブル配列の最初の値をテーブルIDに設定
『変数の設定』でテーブルIDに取得したテーブル配列の最初のIDを設定します。
- 値:
@{body('テーブルの取得')?['value'][0]?['id']}
⑥応答設定
『PowerApp または Flow に応答する』で取得したパラメータ、エラーメッセージを返り値として設定します。
- グループID:
@variables('グループID')
- ドライブID:
@variables('ドライブID')
- ファイルID:
@variables('ファイルID')
- テーブルID:
@variables('テーブルID')
- エラーメッセージ:
@variables('エラーメッセージ')
本フローではExcelやSharePointなど適切に権限付与しなければ使えないアクションが含まれています。権限付与は子フローの権限設定変更に記載してるので参考にしてください。