はじめに
Power Automate
を使う中でSharePoint
の操作自動化は、つねづね焦点に当たります。
なかでも`ファイルの作成'、業務の中で活躍するシーンが多い印象です。
しかしながらファイルの作成
は、既にあるファイルを上書きしてしまいます。
新しいフォルダーの作成
は、存在するフォルダを指定してもエラーになりません
2024.03.31検証
2024.03.30 - 2024.03.31の期間に掲載した情報に誤りがあったこと、お詫び申し上げます。
またファイルの作成
に限らず、ファイル
・フォルダ
の存在チェックはフローの中で必要とするシーンが発生します。
手っ取り早いファイル・フォルダの存在チェック方法(Power Automateで)
今回、その方法を編み出そうとしたことが記事のきっかけです。
将来的にファイルの存在確認
のアクションも登場しそうですが、現時点での対策の検討として記事に残します。
記事の記載時期は2024年3月30日です
対策方法の検討
Power Automateのアクションで対策する方法は、下記の二点で考えられます。
-
ファイルの取得 (プロパティのみ)
をフィルター クエリ
を用いて活用する -
SharePoint REST サービス
で何とかする
Apply to each
、For each
、それぞれに適用する
は検討対象から外します。
SharePoint REST サービス
は個人的に難易度が高い印象ですが、選択肢に含めて検証をしてみました。
検証結果
-
SharePoint REST サービス
によるフォルダー
・ファイル
の抽出 - 既定のアクションによる
フォルダー
・ファイル
の抽出
上記のアプローチを検証してみました。
結論
- (ファイルの場合)
ファイルの取得 (プロパティのみ)
のフィルター クエリ
でカバーできそう -
GetFolderByServerRelativeUrl
+/ListItemAllFields
が万能
1. (ファイルの場合)ファイルの取得 (プロパティのみ)
のフィルター クエリ
でカバーできそう
ファイルの取得 (プロパティのみ)
では、フィルター クエリ
が活用できます。
ファイル名(拡張子付き)でファイルを特定するには、このような形。
Microsoft 吉野さんの記事を参考にさせていただきました🙇🙇
対象にしたフォルダの階層を度外視して、複数ファイルを抽出することができます。
FileLeafRef eq 'ファイル名.拡張子'
で特定できることは 非常に楽。
length関数で判定条件を設定できるため、扱いやすい印象です。
length(outputs('ファイルの取得_(プロパティのみ)')?['body/value'])
■ フォルダーの場合
フォルダーの一覧
アクションが挙げられます。
しかしファイルの取得 (プロパティのみ)
と異なり、フィルター
のオプションが既定で存在しません。
2024.03.30現在
アレイのフィルター処理
を使い、抽出する方法が検討できますが、処理速度に課題が発生するかもしれません。
一度に大きなデータをアクションで取得することは遅延の原因につながります。
(大きなデータになるような)運用をするな!と言いたいところですが・・・、むずかしい現場もあるでしょう
ファイルの場合は ファイルの取得 (プロパティのみ)
が活用できそうですが、フォルダの場合に課題があります
2. SharePoint REST サービス GetFolderByServerRelativeUrl(Value)/ListItemAllFields
GetFolderByServerRelativeUrl は、SharePointサイト内の相対パスでフォルダを取得します
検証を進める中で、ファイル・フォルダ問わず SharePoint REST サービス GetFolderByServerRelativeUrl(Value)/ListItemAllFields
が万能 という印象を受けました。
前提としてGetFolderByServerRelativeUrl
には、存在するドキュメントライブラリ
が設定されていることが必要です。
アクションの詳細
SharePoint に HTTP 要求を送信
アクションを下記の通り実施します。
項目 | 値 |
---|---|
サイトのアドレス | SharePointサイトの名前 |
方法 | GET |
URL | _api/web/GetFolderByServerRelativeUrl('ファイルかフォルダの相対パス')/ListItemAllFields |
- ヘッダー
項目 | 値 |
---|---|
Accept | application/json;odata=verbose |
Content-Type | application/json |
{
"Accept " : "application/json;odata=verbose",
"Content-Type" : "application/json"
}
ファイルかフォルダの相対パス
は、エンコードの有無問わず実行することができます
GetFolderByServerRelativeUrl
の引数がファイル
であれフォルダ
であれ、ドキュメントライブラリ
が存在している場合、結果を得られます。
{
"d": {
"ListItemAllFields": null
}
}
一貫した戻り値が返ってくるので、判定がシンプルです。
empty(body('アクションの名前')?['d']?['GUID'])
存在していればfalse
、そうでなければtrue
を返します。
相対パス
がフォルダーの場合でも同様の結果が得られます。
ドキュメントライブラリ
内のID
も取得でき、汎用的に扱える印象を受けます。
今後の対策
私の対策としては、ファイル
、フォルダー
問わず、GetFolderByServerRelativeUrl('ファイルかフォルダの相対パス')/ListItemAllFields
で判定を一本化させたいなと感じました。
SharePoint REST サービス
は難解に見えますが
- レスポンスの速さ
- 万能さ
といった利点が大きい。
APIをひらすら検証してみる中で思わぬ収穫がありましたが、もっと良いやり方も模索していきたいものです🧐