技術情報ブログ
Power Platform
2023.05.31

Power Apps × SharePoint:500/2,000件の壁を超えるためには(委任回避方法)?(1)

Power Apps × SharePoint:500/2,000件の壁を超えるためには(委任回避方法)?(1)
小刀稱知哉

こんにちは。アーティサン株式会社の小刀稱(ことね)です。

※内容を一部修正しております。(2023年12月)

Power Appsでアプリを作成する際、気をつけなければならない1つの事項としてデータソースから取得できるレコード数の上限があります。

Power AppsはDataverseやSharePointなどから一度に最大2,000件(デフォルトでは500件)のレコードしか取得する事ができません。

よって、委任できない検索条件を用いた場合や、検索後も2,000件を超過するような場合は、全てのレコードを取得する事ができないということになります。

※委任に関する詳細については、過去にブログを作成したことがあるので、以下URLを参照してください。

よって、今回は500/2,000件以上のレコードを扱いたい場合の方法について紹介します。
内容としては、Power Appsの中級者の方に向けた記事となっております。

**注意**

今回紹介する方法は大量データを扱うため、パフォーマンスが大きく低下する可能性があります。

よって、全面的におすすめしている訳ではありません。
(そもそも「データ件数が2,000件を超過しないようにする」という解決策もあると思います。)

あくまでも解決策の1つとして参考にしてください。

 

やりたいこと

今回は、以下構成となっております。

Power Apps × SharePoint:500/2,000件の壁を超えるためには?(1) 構成
構成

データソースはSharePointリストです。

今回は、「大量にデータが保存されているSharePointリストから、Power Appsを用いてその内容を検索する」ということを行います。

SharePointリストの詳細は以下です。

リスト名:LargeList

列名(外部名)

列名(内部名)

データ型

タイトル

Title

1行テキスト

詳細

Description

複数行テキスト

また、SharePointリストには10,001件のレコードを保存しております。

Power Apps × SharePoint:500/2,000件の壁を超えるためには?(1) SharePointリスト
SharePointリスト

Power Appsの取得できるデータ行の設定も以下のように変更しております。

Power Apps × SharePoint:500/2,000件の壁を超えるためには?(1) Power Appsのデータ行の制限
Power Appsのデータ行の制限

上記の設定値は、Power Appsのファイル設定全般データ行の制限から確認することが出来ます。
※デフォルト値は500であり、最大値は2,000です。(2023年2月時点)

 

Before

Power Appsの構成

まずは、Power Appsの構成について説明しておきます。

Power AppsはReloadボタンsearchTextBoxギャラリーの3つのコントロールから構成されています。 それぞれの役割は以下のとおりです。

  • Reloadボタン:データソースを更新する際に押下します。

  • searchTextBox:データソースから検索したい語句を入力します。

  • ギャラリー:データソースからsearchTextBoxの内容に応じて、レコードを表示します。

Power Apps × SharePoint:500/2,000件の壁を超えるためには?(1) Power Appsの構成
Power Appsの構成

 

実装(素直な実装)

まずは、何も考えず素直に実装してみます。

Reloadボタン・ギャラリーにそれぞれ以下を設定します。
ReloadボタンのOnSelectプロパティ

Refresh(LargeList);

ギャラリーのItemsプロパティ

SortByColumns(
    Search(LargeList,
        searchTextBox.Text,
        "Title",
        "Description"
    ),
    "ID", Ascending
);

上記では「LargeList」というデータソース(=SharePointリスト)を、Search()関数の中で直接指定しています。

すると、下記のように委任に関する警告が表示されました。

Power Apps × SharePoint:500/2,000件の壁を超えるためには?(1) 委任に関する警告
委任に関する警告

検索の結果、SharePointリストの上位2,000件までのレコードは検索されましたが、2,001件目以降のレコードは検索されませんでした。

委任ができない検索条件である、かつデータ行の制限が2,000と設定されているため、当然の結果ですよね。
※取得データ件数も2,000となっていることが確認できると思います。

Power Apps × SharePoint:500/2,000件の壁を超えるためには?(1) 検索結果(Before)
検索結果(Before)

以下では、2,000件以上のレコードが存在する場合でも、データソースから検索結果を得る方法について紹介します。

 

After

まずは、実装のイメージについて説明します。

前提として、SharePointリストからレコードを取得する際に、データ行の制限(=最大2,000件)を超えることはできません。
よって、データソースから対象範囲のレコードを複数回取得し、取得結果をコレクションに追加するという方法を用います。
(1回目は1~2,000行目を取得、2回目は2,001~4,000行目を取得…というイメージでループを回していきます。)

それでは、実装してみましょう。
(今回色々と試行錯誤しながら作成しましたので、その流れも一緒にお伝えします。)

 

Step1:最初の状態

今回はReloadボタン押下時に、データソースから全レコードを取得するようにしております。
まずは、以下のように記載してみました。

ReloadボタンのOnSelectプロパティ(最初の状態)

UpdateContext({threshold: 2000 });
UpdateContext({lastRecord: First(Sort(LargeList,ID,SortOrder.Descending))});
UpdateContext({maxIteration: RoundUp(lastRecord.ID/threshold,0)});

Clear(colLargeList);
ForAll(
    Sequence(maxIteration, 0),
    Collect(colLargeList, Filter(LargeList, Value(Value) * threshold < ID && ID <= (Value(Value) + 1) * threshold))
);

ギャラリーのItemsプロパティ

SortByColumns(
    Search(colLargeList,
        searchTextBox.Text,
        "Title",
        "Description"
    ),
    "ID", Ascending
);

Beforeでは、Search()関数の中に、データソースを直越指定していましたが、 今回はコレクション(=colLargeList)を指定しています。

Itemsプロパティでは、委任に関する警告Mul演算子に関するエラーが発生しました。
(Mul演算子は掛け算のことです。)

Power Apps × SharePoint:500/2,000件の壁を超えるためには?(1) エラー1
エラー1

 

Step2:Mul演算子に関するエラーをWith()関数で解消

Mul演算子に関するエラーを解消するため、With()関数を用いました。

With()関数については、以下を参照ください。
Power Apps での With 関数

ReloadボタンのOnSelectプロパティ(With()関数を用いて修正)

UpdateContext({threshold: 2000 });
UpdateContext({lastRecord: First(Sort(LargeList,ID,SortOrder.Descending))});
UpdateContext({maxIteration: RoundUp(lastRecord.ID/threshold,0)});

Clear(colLargeList);
ForAll(
    Sequence(maxIteration, 0),
    With(
        {
            prev: Value(Value) * threshold,
            next: (Value(Value) + 1) * threshold
        },
        Collect(colLargeList, Filter(LargeList, prev < ID && ID <= next))
    )
 );

上記修正により、Mul演算子に関するエラーは解消されました。

しかし、委任に関する警告はまだ消えておりません。

Power Apps × SharePoint:500/2,000件の壁を超えるためには?(1) エラー2
エラー2

 

Step3:subID列を追加し、委任に関する警告を解消

調査したところ、SharePointリストのID列は、イコール(=)以外の比較演算子はサポートしておらず、委任できないようでした。(2023年2月時点)

詳細は以下URLをご参照ください。
委任メモ

上記の対応策として、SharePointリストに新しく「subID」列を追加し、ID値をコピーしました。

※データ型は数値として設定しています。

Power Apps × SharePoint:500/2,000件の壁を超えるためには?(1) subIDの設定値
subIDの設定値
Power Apps × SharePoint:500/2,000件の壁を超えるためには?(1) SharePointリストにsubIDを追加
SharePointリストにsubIDを追加

ちなみに、subID列を追加するのは、データソースがSharePointリストだからです。
データソースがDataverseの場合は、ID列でも比較演算子が委任できます。

次に、IDの代わりにsubIDを用いて、OnSelectプロパティを修正しました。

ReloadボタンのOnSelectプロパティ(subIDを用いて更に修正)

UpdateContext({threshold: 2000 });
UpdateContext({lastRecord: First(Sort(LargeList,ID,SortOrder.Descending))});
UpdateContext({maxIteration: RoundUp(lastRecord.ID/threshold,0)});

Clear(colLargeList);
ForAll(
    Sequence(maxIteration, 0),
    With(
        {
            prev: Value(Value) * threshold,
            next: (Value(Value) + 1) * threshold
        },
        Collect(colLargeList, Filter(LargeList, prev < subID && subID <= next))
    )
 );

こちらで警告やエラーが発生しない状態となりました。

Power Apps × SharePoint:500/2,000件の壁を超えるためには?(1) OnSelectプロパティ(完成版)
OnSelectプロパティ(完成版)

また検索の結果、全てのSharePointリストのレコードから検索されるようになりました。
※取得データ件数も10,001となっていることが確認できると思います。

Power Apps × SharePoint:500/2,000件の壁を超えるためには?(1) 検索結果(After)
検索結果(After)

 

おわりに

少し長くなりましたので、本日はここまで!

今回は、Power Appsで500/2,000件以上のレコードを扱いたい場合の方法について、実装までの流れを紹介しました。

次回はReloadボタンのOnSelectプロパティの内容について、詳細について深掘りしていきます。

 

Power Platform(SharePoint・Power Apps・Power Automate)に関する営業活動や設計、開発などを担当:小刀稱知哉

小刀稱知哉

大分県出身(温泉大好き)、現在は東京都在住

1990年生まれ

30才でメーカーの技術営業からIT業界にジョブチェンジ!!!

趣味は読書

Power Platform(SharePoint・Power Apps・Power Automate)に関する営業活動や設計、開発などを担当しております!

持ってる資格はPL-200/PL-300/PL-400/PL-600/MS-700/AZ-104/AZ-305

シェアする
記事カテゴリ
最新記事
2024.09.18

Power Automateのベストプラクティス・アンチパターン(6)【Power Automate上でExcelファイルを編集する際の注意点】

2024.06.26

一歩先へ進む企業のためのPower Platform内製化マニュアル:Power Apps・Power Automateの内製化に必要なリンク一覧

2024.06.05

【2024年6月更新】Power Automate 設計・構築時のTips集

2024.05.15

非エンジニア【(元)自治体職員】がローコード開発をして気が付いたこと コーディング規約とPower Platformプレミアムサンプルアプリ集

2024.05.01

Power Apps・Power Automateの勉強方法(2)

モデル駆動型アプリPower AppsPower PlatformSharePointExcelPower AutomateC#attributevalidationローコードAngularAccessInfoPathMatTableAngular Materialデータ構造SortByColumns関数TypeScriptHTMLEF CoreマイグレーションFramework CoreAttribute directivesO/Rマッパーazure sql databaseCase式HTTP RequestCSSxUnit.Net Core 3.1VSCode.Net Core Test ExplorerDataverse for Teamsitem関数Google MapsMarker ClustererRANK()関数Dynamics 365 SalesMicrosoft TranslatorマーカークラスタリングライブラリtailwindcssマルチテナントドロップダウンメニューBreakpointObserverメディアクエリスマホPCレスポンシブ入門初心者中級者キャンバスアプリDatePickerDropdownviewビューアクセス制限承認リマインドSetForAllUpdateContextロードマップ技術It情報技術メッセージIDメールfirst()関数nest入れ子動的リストcollectionコレクション複数の添付ファイル承認フローformエクスポートインポートカスタマイズcomponentダイアログコンポーネントdialogTips新機能変数検索Microsoft 365グループセキュリティグループ送信元メールの送信差出人インスタントクラウドフロー自動化したクラウドフロー委任VBAエラーエクセルerror復元restorePower BI個人列ユーザー列SharePoint Onlineリスト非表示アプリ[市民開発者構築自動化したクラウド フローフローの種類インスタント クラウド フロースケジュール済みクラウド フローレスポンシブ レイアウトresponsive layoutデータ行の制限引き継ぎ退職所有者を変更異動LoopMicrosoftdesignJSONデザインtemplateテンプレート運用選択肢列参照列ChatGPTOpenAIオープンAIチャットGPTgalleryギャラリースクロールコンテナショートカットキーshortcut keyconcat関数文字制限フロー実行開発環境環境本番環境ライセンス環境構築手順pipelineCI/CDパイプラインDevOpsMicrosoft 365簡易在庫管理時間外通知ファイルフィルター クエリドキュメント ライブラリfilter querysortソートmultiple item複数項目シェアポイント便利機能カレンダーCalendarTeamsローコード開発非エンジニア体験談勉強内製化
PageTop
ページトップに戻る