はじめに
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をひらすら検証してみる中で思わぬ収穫がありましたが、もっと良いやり方も模索していきたいものです🧐




