SharePoint には、リスト とは別にドキュメントライブラリというのが存在します。
SharePoint の リスト については、モダンサイトにすれば5000件問題から解放されるみたいな話があるのですが・・・
※詳しいお話は、太田さんがまとめてくれています!
idea.toString(); SharePoint Online モダン リストの 5,000 件問題対応と 20,000 件問題の回避方法
こと、ドキュメントライブラリについては、5000件を超えると明示的に以下のような警告が表示されるようになります。
まぁ、だから何だ?ってお話なんですけど、今回意外なところでこの問題にぶつかりました。
そもそも ドキュメントライブラリのアイテムって?
ドキュメントライブラリだから、アイテムのカウントは当然ファイル単位と思われている方も多いかと思います。
しかし、調査した結果 フォルダもカウントに含まれる ことが分かりました。
まぁ、考えてみれば当然っちゃ当然なのですが・・・
この図のように、フォルダ「1」に
ファイル「1.xlsx」が入っている場合
フォルダ「1」を構成するアイテム数は2となります。
一般的なファイルサーバーのような扱いをしている場合は、フォルダに複数のファイルやフォルダが格納されていると思いますので、ドキュメントライブラリのアイテム数は尋常じゃない個数になるということは想像に難しくないでしょう。
今回問題が起きたところ
Power Automate を組んでいるときに、当該フォルダのファイルの一覧を取得しようとして、以下のようなフローを組みました。
結果は、アイテム数が5000件を行かない場合は、明示的に配列データとして一覧を取得することができました。
ところが、5000件を超えると、以下のようなエラーが出るようになります。
かと思えば、環境によってはエラーにはならず、空の配列だけが出力されることもあります。
※つまり処理が継続してしまう。
でも、フォルダも指定しているので、そんな全件検索を使用しているつもりはないと思うのですが、明示的にOdata の Filter クエリを投げないと出力できないようです。
じゃあクエリをなげるか・・・
クエリを投げるようにすればいいっぽいので、作成日を適当に入れて検索してみました。
しかし・・・
5000件未満のファイル取得はうまくいく
以下のように、フィルタークエリを作成日を指定して実施したところ、きちんと出力されるようになりました。
・・・が
5000件以上のファイル取得はうまくいかない
同様のクエリを、5000件以上のフォルダに対して同様に行ったところ・・・
ご覧のように、取得することができません・・・。
フォルダのIDを元に検索するのが一番確実・・・?
冒頭で申しました通り、フォルダもまた1アイテムです。
基本的にフォルダが作成された後でないとファイルをフォルダ内に「作成」されることはありませんので、当該フォルダのIDを取得して、それをフィルタクエリに入れてあげれば、5000アイテムを超えるドキュメントライブラリであっても検索されるようになりました。
ただし、あくまで
格納先のフォルダができた後にファイルがそのフォルダに作成されることが前提の仕様となりますので、予めファイルが作成されていて、そのフォルダに移動するといった場合は、IDが作成時より若いと思われますので、そういう場合は一工夫する必要があるかと思います。