SharePointリストのフォルダ操作とPower Automate連携(HTTPリクエスト・トリガー条件)

「SharePointリストってフォルダ作れないの?」と質問されたので、フォルダのつくり方とPower Automateからの連携方法をメモ。

SPOリストにフォルダは作成可能だけど、安易に使うと権限管理のカオス化や「5000件問題」から派生する問題にハマる危険性があるため、基本的には非推奨。

本記事では、リストでフォルダを使うメリット・デメリットのリアルを解説した上で、Power Automateを使ったフォルダ操作方法をまとめてみた。

標準アクションでは不可能な「HTTPリクエストを使ったフォルダ内アイテムの作成」や{Path}プロパティを活用して「特定フォルダの更新だけをトリガーする」条件式の書き方とかを解説。

スポンサーリンク

そもそもSharePointリストでフォルダを使うべきか?(基本は非推奨)

結論から言うと、SharePointリストでフォルダを作成するのはデメリットが大きいため、基本的には推奨されないらしい。

フォルダで分けたい場合は、「部署」や「ステータス」などの「列」を作成し、ビューの「グループ化」や「フィルター」を使って仮想的にフォルダのように見せるのがおすすめ。

とはいえ、要件によってはフォルダが必要になるケースもあるかもしれないので、まずはメリットとデメリットを簡単にまとめてみた。

メリット1:アクセス権限の分割

フォルダ単位で権限を付与できるため、「このフォルダはA部署だけが編集可能」といった特定のアクセス制御を設定可能。

ただし、この手軽さが後述の「権限管理のカオス化」にもつながる。

メリット2:5000件問題(リストビューのしきい値)の回避策になる

SharePointには「1回の表示やクエリで5000件以上のアイテムを処理しようとするとエラーになる」という仕様がある。

フォルダはそれぞれが独立したコンテナとして扱われるため、1つのフォルダ内のアイテム数を5000件未満に抑えることで、このしきい値エラーを回避してビューを表示できるようになる。

とは言えもちろん、フォルダで回避する前に、まずはインデックスを作成してビューの絞り込みで対処できないか検討するのが王道。

デメリット1:フォルダを跨いだ全体検索や集計が困難になる

リスト本来の強みである「列を使った柔軟な絞り込みや並べ替え」が使いにくくなるのが大きなデメリット。

フォルダの中に入り込まないとアイテムが見えないので、データベースとしての利便性が大きく損なわれ、横断的な集計が非常に面倒になってしまう。

デメリット2:権限管理がカオスになる

リストアイテムごとの権限制御ほどではないにしろ、フォルダごとに細かく権限を設定すると、メンテナンスが大変になる。

であれば、SharePointリスト自体を分けちゃった方がやっぱりよい。

デメリット3:5000件問題の派生トラップ

フォルダで5000件問題を回避できても、以下には気を付ける必要がある。。

  • フラット表示の罠: フォルダを無視して全件表示する設定のビューを使うと、合計が5000件を超えていれば当然エラーになる
  • 親フォルダ変更の罠: フォルダ内の総アイテム数が5000件を超えた状態だと、親フォルダ自身の「名前変更」や「権限変更」を行うとエラーで弾かれる。

ということで、リストにフォルダを作ることはあまりしないかもしれないけど、せっかく調べたので「リストにフォルダを作る方法」と「Power Automateから操作する方法」を次章で解説。

SharePointリストにフォルダを作成する方法

まずは対象のリストに移動して、右上の[歯車]マークから、[リストの設定]を選択。
[詳細設定]を選んで、
「[新しいフォルダー]コマンドを表示する」をオンにする。
これでリストにフォルダを作れるようになる。

Power AutomateからSharePointリストのフォルダを操作する

続いてPower Automateからこのフォルダに対し、アイテムを作成したりしてみる。

フォルダ内にリストアイテムを作成する

標準アクションではフォルダ内にアイテムを作成できないため「SharePoint に HTTP 要求を送信します」を使用する。

以下のように「AddValidateUpdateItemUsingPath」を使用し、フォルダへのパスとアイテムに追記したい情報をPOSTで送る。
※フォルダへのパスは「decodeUriComponent」で変換すること
メソッド : POST
URL : _api/web/lists/getbytitle('【リスト名】')/AddValidateUpdateItemUsingPath
Body : 
{
    "listItemCreateInfo": {
        "FolderPath": {
            "DecodedUrl": "@{decodeUriComponent(【ここにフォルダまでのURL(/sites/サイト名/Lists/リスト名/フォルダ名】)}"
        }
    },
    "formValues": [
        {
            "FieldName": "Title",
            "FieldValue": "xxx"
        },
        {
            『ここにプロパティを追記していく』
        }
    ],
    "bNewDocumentUpdate": false
}
実行するとこんな感じでフォルダ内にアイテムが作成される。

フォルダ内のアイテムを一覧にする

続いてフォルダ内のアイテムを一覧にする方法。動作確認のためフォルダ外にアイテムを追加。
標準アクション「複数の項目の取得」をそのまま使用すると、フォルダ内外のアイテムとフォルダがリストアップされる。

そこで、[エントリをフォルダに制限する]オプションにフォルダへのパスを書いてあげると、
無事該当フォルダ内のアイテム(とフォルダ)をリストアップできる。

フォルダにアイテムができたときだけフローを起動する

最後、フォルダにアイテムができたときだけフローをトリガーする方法。

これはトリガーの条件式にPathを使うことで実現できそう。
// ルート以外(フォルダの中)にアイテムが作成されたとき
@not(equals(triggerOutputs()?['body/{Path}'], 'Lists/【リスト名】/'))

// 特定のフォルダ以下にアイテムが作成されたとき
@startsWith(triggerOutputs()?['body/{Path}'], 'Lists/【リスト名】/【フォルダ名】/')
先ほどのトリガー条件式を追加して、アイテムをフォルダ内外に追加すると、フォルダ内に追加したときだけPower Automateは動作した。

あくまで簡単な動作確認のため、本番で使用する場合はきちんとテストすることを推奨

ということであまり使う機会のなさそうなSharePointリストのフォルダだけど、一応Power Automateからも操作できるので、そのうち使用することがあるかも。

コメント

タイトルとURLをコピーしました