PowerApps│SharePointリスト5000件問題を解決する2つの方法

こんにちは、あんこ先生です。

SharePointリスト、アイテムが5000件を超えると正常に動作しなくなります。

なぜなら、サーバーに過度な負荷がかかることを回避するための防衛機能だからです。

そのため、アイテムが5000件を超えないように制御しないといけません。

とはいえ、どうしても5000件に収まらないこともありますよね。

そこで、今回は「5000件超えても大丈夫」と「5000件超えないよう自動でアイテム削除」の方法を紹介します。

この記事を読めば、もう5000件問題は怖くない。

SharePointリスト5000件問題を解決する2つの方法

いつかは必ず立ちはだかる、リスト5000件問題に悩まれていませんか?


リスト5000件問題とは

SharePointリストのアイテムが5,000件を超えると、しきい値エラーが発生することがあります。

このしきい値エラーが発生すると、そのリストの参照が一切されません。

これは委任できるFilter関数などを用いても回避できない曲者です。

つまり、ある日を境にギャラリーの中身が表示されたり表示されなくなったりする症状が現れます。

そしてだましだまし使い続けると、完全に表示されなくなります。

この問題を解決する方法は2つありますので、それを紹介していきます。

SharePointリストにインデックス列を作成する


インデックスについて

ひとつめは、5000件を超えても動作するようインデックス列を追加する方法です。

いわゆる対処療法です。

データそのものには手を加えず、委任できるFilter関数などを機能させる列に作り替えます。

インデックスを付与しても、委任レコード上限500件は変わりません。

また、インデックスは最大20まで追加できますが、よく使う項目1つあれば事足りると思います。

いわゆる主キーとなる列を指定するのが効果的ですね。

種類として、単純インデックスと複合インデックスがありますが、特に気にしなくてよいです。


インデックスの型

インデックスに設定できる列の種類(データ型)は決まっています。

たくさんあるのでPowerAppsに関係あるところをピックアップしています。

サポートされている列の種類は次の通りです。

  1. 1行テキスト
  2. 選択肢 (単一値)
  3. 数値
  4. 日付
  5. ユーザーまたはグループ (単一値)
  6. Yes/No

複数行テキストや選択肢 (複数値)、集計値は設定できないので注意してください。


インデックスの作り方

作り方は至ってかんたんです。

まずSharePointのサイトコンテンツに移動します。

次にインデックスを付与したいリスト横の3点リーダから設定を押します。


するとリストの列一覧が表示されるので、最下段のインデックス付きの列を選びます。

インデックスは最大20個まで設定できます。

新規で設定するには、新しいインデックスの作成を押します。

そして、インデックスを付与したい列を選びます。


インデックス列の作成は以上です。

この列をキーにフィルターをかければアプリも正常に稼働します。

SharePointリストのアイテムを削除する

ふたつめは、5000件を超えないよう一定期間経過したアイテムを削除する方法です。

こちらは原因療法になります。

たとえば1年経過したアイテムを削除して、常に5000件以下に抑えることができればこの問題は起きません。

アプリのパフォーマンスにも直結するので、不要なアイテムは随時整理したいですね。

とはいえ、手動で削除すると誤って別のアイテムを消したり、消すことを忘れることがあります。

そのため、自動削除させた方が無難で効率的です。

自動削除する方法は次の2種類があります。


情報管理ポリシーでアイテムを自動削除する│SharePoint


ひとつめは、SharePointの機能を使った自動削除です。

アイテムを作成してから指定した期間を経過したものを削除していきます。

実行タイミングは週1回になります。

具体的にいつ行っているかはテナントによって異なるようです。

従って、きっちり1年経過したら削除するといったことは行えません。

確実としたい場合は、この後紹介するPowerAutomateを使った方法を採用してください。

テスト環境では情報管理ポリシーが表示されないため、この方法は行えないかもしれません。


情報管理ポリシーの設定方法

インデックス付与と同様の手順で設定したいリストのリストの設定を開きます。

その後、情報管理ポリシーからポリシーソースの変更を選びます。


次に、ライブラリとフォルダーにチェックを入れ、保持ステージを追加するを押します。


あとは削除させる条件を設定するだけです。


設定が完了すれば次のように表示されます。

あとは時期がくれば、該当するアイテムが自動で削除されます。


フローでアイテムを自動削除する│PowerAutomate

もうひとつの方法は、PowerAutomateでアイテムを削除させます。

こちらの方が、より細かく、正確に削除が行えます。

設定もそんなに難しくはありませんので、作ってみましょう。


スケジュール済みフローの作成

それでは、フローを作成していきます。

TeamsやPADのほうではないので注意してください。

ブラウザからPowerAutomateを開き、作成そしてスケジュール済みクラウドフローを押します。

名前以外は後工程で変更するので作成を押します。


フロー内部の作成

今回のフローは3ステップです。

  1. 開始トリガー
  2. SPOリスト条件抽出
  3. 抽出したレコードの削除

順番に作っていきましょう。


実行頻度の設定│トリガー

まず開始トリガーですが、業務時間外の朝6時に実行させるよう設定します。

間隔は1回、頻度は1日です。

これで毎日実行されます。

次にタイムゾーンですが、UTC+9の日本を選びます。

この際、開始時間最後尾のZを削除しておかないとUTC時刻で動かないないため、削除しておきます。

設定時間を6にすれば完成です。

プレビューに毎日の6:00に実行すると表示されていれば設定は完璧です。


削除対象の抽出│複数の項目の取得

つぎにSPOリストの抽出です。

サイトのアドレスとリスト名を入力します。

選択式なので悩まないと思います。

その後、詳細オプションを表示し、クエリフィルターに次を記述します。

Created lt '@{addDays(utcNow(),-7)}'

Createdは登録日、ltはより小さい、関数部分は本日から7日前の日付を返します。

この記述で、直近1週間を含まないそれ以前のデータを抽出します。

図解すると次の通りで、オレンジ部分以前が削除対象になります。

クエリフィルターに関数を利用する場合、その両端をシングルコーテーションで囲まないとエラーになります。相当沼りました。


不要データの削除│項目の削除

項目の削除でサイトのアドレスとリスト名を入力します。

ここも選択肢から先ほどと同じ内容を選択します。

IDは複数の項目の取得で得たIDを指定します。

この時点で自動で外側にApply to eachができあがり、抽出したデータの数だけ処理が繰り返されます。

これで、先ほど抽出したデータがすべて削除対象となります。

日付や条件を変えることで様々な削除の自動化が行えますよ。

また、他のSPOリストも削除したい場合は、下につなげていけばひとつのフローとして処理できます。

SharePointリスト5000件問題を解決する2つの方法のまとめ

今回はSharePointリスト5000件問題を解決する2つの方法を紹介しました。

今回PowerAppsの出番がありませんでしたが、アプリでアイテムを登録する際、古いものを削除させるのも手です。

しかし、SPOリストは削除する量が多いとレスポンスが低下するので少量に限ります。

削除量が多い場合は、だれも利用していない時間帯に自動で削除する仕組みを構築した方が効率的です。

このフローはひとつ作っておくと使いまわしできるのでおススメですよ。

委任問題や5000件問題の解決に!Dataverse for Teamsの使い方はコチラ。

ご支援よろしくおねがいします

この記事を気に入ってくださった方、寄付してあげてもいいよという方がいらっしゃっいましたら、ご支援いただけると助かります。

下記リンクからAmazonギフト券で、金額は15円からお気持ちを入力してください。

受取人のメールアドレスは amazon@anko7793.com までお願いします。

メッセージもいただけるとたいへん喜びます。

よろしくお願いします。

Amazonギフト券(Eメールタイプ) 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ABOUT US
七草あんこ
非IT系中間管理職やってます。社命によりoffice365を主軸とした業務改善プロジェクトメンバーに任命されたことでPowerAppsと出会えました。いまではビジネス・プライベートを問わず、欠かせないツールになっています。導入初期やアプリ作成時に遭遇した諸問題の解決法とサンプルアプリの作り方を紹介していきます。主にTwitterで情報収集しているので不明点など呟いているとお邪魔するかもしれません。