LoginSignup
6
9

Power AutomateでSharePointのファイル・フォルダの存在を調べる

Last updated at Posted at 2024-03-30

はじめに

Power Automateを使う中でSharePointの操作自動化は、つねづね焦点に当たります。
なかでも`ファイルの作成'、業務の中で活躍するシーンが多い印象です。

しかしながらファイルの作成は、既にあるファイルを上書きしてしまいます。

新しいフォルダーの作成は、存在するフォルダを指定してもエラーになりません
2024.03.31検証

2024.03.30 - 2024.03.31の期間に掲載した情報に誤りがあったこと、お詫び申し上げます。

またファイルの作成に限らず、ファイルフォルダの存在チェックはフローの中で必要とするシーンが発生します。

手っ取り早いファイル・フォルダの存在チェック方法(Power Automateで)

今回、その方法を編み出そうとしたことが記事のきっかけです。
将来的にファイルの存在確認のアクションも登場しそうですが、現時点での対策の検討として記事に残します。

記事の記載時期は2024年3月30日です

対策方法の検討

Power Automateのアクションで対策する方法は、下記の二点で考えられます。

  1. ファイルの取得 (プロパティのみ)フィルター クエリを用いて活用する
  2. SharePoint REST サービスで何とかする

Apply to eachFor eachそれぞれに適用するは検討対象から外します。

SharePoint REST サービスは個人的に難易度が高い印象ですが、選択肢に含めて検証をしてみました。

検証結果

  • SharePoint REST サービスによるフォルダーファイルの抽出
  • 既定のアクションによるフォルダーファイルの抽出

上記のアプローチを検証してみました。

image.png

結論

  1. (ファイルの場合)ファイルの取得 (プロパティのみ)フィルター クエリでカバーできそう
  2. GetFolderByServerRelativeUrl + /ListItemAllFields が万能

1. (ファイルの場合)ファイルの取得 (プロパティのみ)フィルター クエリでカバーできそう

ファイルの取得 (プロパティのみ)では、フィルター クエリが活用できます。
ファイル名(拡張子付き)でファイルを特定するには、このような形。

Microsoft 吉野さんの記事を参考にさせていただきました🙇🙇

対象にしたフォルダの階層を度外視して、複数ファイルを抽出することができます。
FileLeafRef eq 'ファイル名.拡張子'で特定できることは 非常に楽

image.png

length関数で判定条件を設定できるため、扱いやすい印象です。

example
length(outputs('ファイルの取得_(プロパティのみ)')?['body/value'])

■ フォルダーの場合

フォルダーの一覧アクションが挙げられます。
しかしファイルの取得 (プロパティのみ)と異なり、フィルターのオプションが既定で存在しません。

2024.03.30現在

アレイのフィルター処理を使い、抽出する方法が検討できますが、処理速度に課題が発生するかもしれません。
一度に大きなデータをアクションで取得することは遅延の原因につながります。

(大きなデータになるような)運用をするな!と言いたいところですが・・・、むずかしい現場もあるでしょう

ファイルの場合は ファイルの取得 (プロパティのみ)が活用できそうですが、フォルダの場合に課題があります

2. SharePoint REST サービス GetFolderByServerRelativeUrl(Value)/ListItemAllFields

GetFolderByServerRelativeUrl は、SharePointサイト内の相対パスでフォルダを取得します

検証を進める中で、ファイル・フォルダ問わず SharePoint REST サービス GetFolderByServerRelativeUrl(Value)/ListItemAllFieldsが万能 という印象を受けました。

前提としてGetFolderByServerRelativeUrlには、存在するドキュメントライブラリが設定されていることが必要です。

アクションの詳細

SharePoint に HTTP 要求を送信 アクションを下記の通り実施します。

image.png

項目
サイトのアドレス 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の引数がファイルであれフォルダであれ、ドキュメントライブラリが存在している場合、結果を得られます。

image.png

存在しないファイル
{
  "d": {
    "ListItemAllFields": null
  }
}

一貫した戻り値が返ってくるので、判定がシンプルです。

GUIDで存在を確認する
empty(body('アクションの名前')?['d']?['GUID'])

存在していればfalse、そうでなければtrueを返します。
相対パスがフォルダーの場合でも同様の結果が得られます。

image.png

ドキュメントライブラリ内のIDも取得でき、汎用的に扱える印象を受けます。

今後の対策

私の対策としては、ファイルフォルダー問わず、GetFolderByServerRelativeUrl('ファイルかフォルダの相対パス')/ListItemAllFieldsで判定を一本化させたいなと感じました。

SharePoint REST サービスは難解に見えますが

  • レスポンスの速さ
  • 万能さ

といった利点が大きい。
APIをひらすら検証してみる中で思わぬ収穫がありましたが、もっと良いやり方も模索していきたいものです🧐

6
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
9