Power AppsでSharePointリストへの制限事項をGraph APIとタイマーで解決する!

Power Apps
この記事は約5分で読めます。

Power Appsの標準コネクタでは、取得できるアイテムの数に「最大2000件」という制限があります。さらに、Filter関数やLookUp関数で検索可能なプロパティにも制限が存在します。これらの制約を克服するためには、標準コネクタをGraph APIに対してHTTPRequestを送信してレコードデータとして受信できるよう拡張することで、2000件を超えるアイテムを取得し、FilterやLookUpを自由に行うことが可能になります。

対象者:開発上級者

2000件を超えるアイテムの取得

Power Apps カスタムコネクタを使用しないGraph API #応用編で紹介した手法を用いてコネクタを拡張し、適切な取得数を設定することで[@odata.nextLink]を取得できます。この[@odata.nextLink]は、topクエリで設定した取得数を超える件数を取得するためのトークンを含むエンドポイントであり、例えば300件のリストに対してtop=50を指定した場合、51件目から100件目までを取得するために使用します。このトークンを利用して、リストの全300件を取得することが可能です。

タイマーを疑似ループとして全件取得を行う

Power Apps タイマーを利用したループ処理①で紹介した手法で疑似ループを構築します。

  1. 取得するエンドポイントを格納する変数を定義する
  2. 取得したレコードを格納する変数を定義する
  3. リストアイテムを格納するコレクションを定義する
  4. ボタンのOnSelectプロパティで最初のレコードを取得し、2.に格納する
  5. 取得したレコードのvalueを3.のコレクションに追加する。
  6. 取得したレコードに[@odata.nextLink]が含まれている場合は、それを1.に保存し、タイマーを開始します。含まれていない場合は、何もしない。
  7. 1.をエンドポイントとしてレコードを取得し2.を更新する
  8. 5.に戻る
/* Screen.Visible */
Set(__TimerControler, false);


/* ボタン.OnSelect */
// 取得するエンドポイントを格納する変数
Set(__EndPoint, $"https://graph.microsoft.com/v1.0/sites/{Site-Id}/lists/{List-Id}/items?$expand=fields&top=5000");
// 取得したレコードを格納する変数
Set(__GraphResults, GraphEndPoint_SharePointList.GetItems(__EndPoint, "GET", "");
// リストアイテムを格納するコレクション
ClearCollect(__colListItem, __GraphResults.value);
// [@odata.nextLink]があればエンドポイントを更新し手タイマーを起動
If(
    Not(IsBlank(__GraphResults.'@odata.nextLink')),
    Set(__EndPoint, __GraphResults.'@odata.nextLink');
    Set(__TimerControler, true);
);


/* タイマー.Start */
__TimerControler

/* タイマー.OnTimerEnd */
Set(__TimerControler, false);    // 再起動の待機状態に設定
// レコードを取得して結果を更新
Set(__GraphResults, GraphEndPoint_SharePointList.GetItems(__EndPoint, "GET", "");
// リストアイテムを格納するコレクションに追加
Collect(__colListItem, __GraphResults.value);
// [@odata.nextLink]があればエンドポイントを更新し手タイマーを再起動
If(
    Not(IsBlank(__GraphResults.'@odata.nextLink')),
    Set(__EndPoint, __GraphResults.'@odata.nextLink');
    Set(__TimerControler, true);
);

タイマーを使用してデータを全件取得する際は、取得件数とレスポンスのバランスを考慮する必要があります。Graph APIではtopクエリで最大5000件のデータを取得できますが、多数のカスタム列がある場合、レスポンスの性能が大幅に低下する可能性があります。一方で、取得件数を減らしタイマーの起動回数を増やすと処理速度が落ちることがあります。最適な設定値を見つけるためには、これらの要素を適切に調整することが重要です。

委任問題を解決する

委任問題とは

SharePointコネクタを使用すると、ドキュメントライブラリやリストからアイテムを取得できます。アプリ設定では最大2000件までの取得が可能です。例えば、ドキュメントライブラリが対象の場合、ファイル名をキーにして検索が行えますが、これは取得設定の範囲内に限られています。このような制限は「委任問題」と呼ばれ、長い間開発者に課題を提起しています。

問題の解決

拡張コネクタを定義し全件取得後検索する

2000件以上のアイテムを取得するで紹介した方法で、全件取得した後にそのコレクションで検索を行うことで委任問題を解決できます。しかし、非常に多くのアイテムを取得する場合、全件取得にかかる時間が長くなるため、別の方法を検討することをお勧めします。

拡張コネクタを定義しクエリを用いて取得する

拡張コネクタは、全件取得以外にも使用できます。通常、Graph APIを使用してSharePointからアイテムを取得するためのエンドポイントを定義すると、リストアイテムの取得結果が返されます。しかし、ドキュメントライブラリや添付ファイルが許可されたリストについては、「driveItem」として知られる「添付ファイルの実体」を取得するエンドポイントが存在します。このエンドポイントのレスポンススキーマを定義することにより、$filterクエリを使用してファイル名で検索することが可能です。

標準コネクタOffice365グループ.HttpRequestにdriveItem取得用エンドポイントを投げる

検索対象のパスが不明な場合は利用できない方法ですが、標準コネクタにファイルとファイルのパスの存在を確認するエンドポイントを投げることでファイルの存在を確認することが可能です。

この記事を書いた人

岩本敏彦
タイトルとURLをコピーしました