ビリビリ☆Power Apps 同好会 登壇大会 #1 ギャラリーの検索フォーム作成 −目から鱗だった話− 2024年5月25日(土) まさやん
自己紹介 まさやん @Masayan_power (C)XXXXXX INC. All Rights Reserved. 仕事 営業支援のITチーム(前は営業事務) 最近 Power Automate for Desktopで業務自動化 資格 基本情報技術者試験 • • • 好きなこと • • VBA Power Query Power Apps Power Automate Power Automate for Desktop (全部修行中です)
今日の内容 Power Appsでの検索についてお話します。 主にギャラリーのFilter、委任問題回避についての内容です。 (C)XXXXXX INC. All Rights Reserved. 3
注意事項 資料の内容は24年5月時点のものです。 今後アップデート等で変更になる可能性があります。 内容について個人的見解が含まれている場合があります。 間違いがありましたら、ご指摘ください。 (C)XXXXXX INC. All Rights Reserved.
アプリの概要 依頼指示アプリ ワークフロー連携 メール通知 事務作業依頼者 事務作業者 作業管理 アプリ データ登録・更新 1つのリストへそれぞれのアプリから SubmitFormで登録・更新 作業指示 (C)XXXXXX INC. All Rights Reserved. 作業遂行 5
当初のアプリ ボタンとラジオボタン2個を作ったシンプルなものでフィルターを実装していました。 ステータス 依頼者 依頼種類 (C)XXXXXX INC. All Rights Reserved.
当初のアプリ(Itemsプロパティ) //ギャラリーのItemsプロパティ If(rdoRequester.Selected.Value="全員", If(rdoRequesterContent.Selected.Value="全依頼", Filter(作業依頼リスト,ステータス.Value=locStatus), Filter(作業依頼リスト,ステータス.Value=locStatus, rdoRequesterContent.Selected.Value=依頼種類.Value)), rdoRequester.Selected.Value="自分", If(rdoRequesterContent.Selected.Value="全依頼", Filter(作業依頼リスト,ステータス.Value=locStatus,登録者.Email=User().Email), Filter(作業依頼リスト,ステータス.Value=locStatus,登録者.Email=User().Email, rdoRequesterContent.Selected.Value=依頼種類.Value)) ) (C)XXXXXX INC. All Rights Reserved.
対処その① 「過去レコードを検索できるようにしてほしい。」と 要望がユーザからありました。 (C)XXXXXX INC. All Rights Reserved. 8
検索フォーム 検索フォームのようなコントロールをとりあえず配置したけれど ギャラリーのItemsプロパティどうすればよいか分かりませんでした。 試した方法 If文でひたすら分岐する (C)XXXXXX INC. All Rights Reserved. 記載例 If(cmbRequestKind.Selected.Value=“”, If(txtRequestOverview.Text=“”, If(cmbSearchDepartment.Selected.Value=“”, If(cmbSearchRequester.Selected.Value=“”, If(dteSearchRequestDateFrom.SelectedDate=“”, If(dteSearchRequestDateTo.SelectedDate=””, If(dteSearchDueDateFrom.SelectedDate=“”, If(dteSearchDueDateTo.SelectedDate=“”, 作業依頼リスト, //検索項目がすべて未設定の場合は //作業依頼リストを全件表示 ………………… 結果 ネストが多くなってしまい実装困難
検索フォーム I f文でのネストは止めて このような式で書きましょう。と教わりました Filter( <データソース>, 項目の指定が空 || 項目が指定の値) Power Apps ギャラリーのフィルター はAND、ORを使おう(IF文ネストは増えると大変) (ヨウセイさんブログ) コンボボックス、日付入力の書き方を次のページに記載 (C)XXXXXX INC. All Rights Reserved.
コンボボックスの場合 <構文> F i l t er ( < データソース>, 項目の指定が空 || 項目が指定の値) Filter( 作業依頼リスト, IsBlank(cmbRequestKind.Selected) || 依頼種類.Value = cmbRequestKind.Selected.Value) ①未入力の場合 ケース ② 依 頼 種 類 の 値 =選 択 した 値の 場合 ① ② コンボボックスが未入力の場合 True ー 全レコードが表示 コンボボックスが入力済の場合 False True ②の条件に合致したレコードが表示 (C)XXXXXX INC. All Rights Reserved. 抽出結果
日付の場合 <構文> F i l ter( < デ ー タ ソース>, 項 目 1 の 指定 が空 || 項 目 1 が 指定の 値, 項 目 2 の 指定 が空 || 項 目 2 が 指定の 値) Filter( ① ③ 作業依頼リスト, IsBlank(dteSearchRequestDateFrom.SelectedDate) || ② 依頼日時>=dteSearchRequestDateFrom.SelectedDate, IsBlank(dteSearchRequestDateTo.SelectedDate) || ④ 依頼日時<=DateAdd(dteSearchRequestDateTo.SelectedDate,1)) ① 依 頼 日 ( F r om ) が 未入 力 の場 合 ③依頼日(To) が未入力の場合 ② 依 頼 日 時 が 依頼 日 (F r om ) 以降 の場 合 ④ 依 頼 日 時 が 依 頼日 (T o) ※ 以 前 の 場 合 ※ 指 定 し た 日 付 の時 刻 が0 :0 0: 0 0で取 得 され るた め、 Da te A dd 関数 で1 日を 加え てい ま す。 ケース ① ② ③ ④ 日付のFromとToともに未入力 True ー True ー 全レコードが表示 日付のFromのみ入力済(Toは未入力) False True True ー 依頼日時がFrom以降のレコードを表示 日付のToのみ入力済(Fromは未入力) True ー False True 依頼日時がTo以前のレコードを表示 日付のFromとToともに入力済 False True False True 依頼日時がFrom以降~To以前のレコードを表示 (C)XXXXXX INC. All Rights Reserved. 結果
全検索項目を繋げた場合 Filter( 作業依頼リスト, IsBlank(cmbRequestKind.Selected) || 依頼種類.Value = cmbRequestKind.Selected.Value, IsBlank(txtRequestOverview.Text) || txtRequestOverview.Text in 依頼件名, IsBlank(cmbSearchDepartment.Selected) || 部署名.Value = cmbSearchDepartment.Selected.Value, IsBlank(cmbSearchRequester.Selected) || 登録者.DisplayName = cmbSearchRequester.Selected.Value, IsBlank(dteSearchRequestDateFrom.SelectedDate) || 登録日時>=dteSearchRequestDateFrom.SelectedDate, IsBlank(dteSearchRequestDateTo.SelectedDate) || 登録日時<=DateAdd(dteSearchRequestDateTo.SelectedDate,1), IsBlank(dteSearchDueDateFrom.SelectedDate) || 希望納期>=dteSearchDueDateFrom.SelectedDate, IsBlank(dteSearchDueDateTo.SelectedDate) || 希望納期<=DateAdd(dteSearchDueDateTo.SelectedDate,1) ) (C)XXXXXX INC. All Rights Reserved. 13
検索のまとめ ① 検索は以下の式を使う Filter( <データソース>, 項目の指定が空 || 項目が指定の値) ② ③ コントロールが未入力の場合は全件表示される コントロールが入力済の場合は指定した条件で 表示される (C)XXXXXX INC. All Rights Reserved.
対処その2 データが2000件を超える前に 委任問題回避する必要がある (C)XXXXXX INC. All Rights Reserved. 15
委任とは 委任とはデータのフィルターや検索といった操作をデータソース側(この場合はSharePoint)で 行うことを指します。 Power Apps SharePoint ②操作を実施 ①フィルターや検索などの操作を依頼 できる (C)XXXXXX INC. All Rights Reserved. or できない
委任可能な状態 データソース側(この場合はSharePoint)で実施可能な状態。 Power Apps SharePoint ②可能なので操作を実施 ①フィルターや検索などの操作を依頼 ③実行結果返却 ④表示 Power Appsの 一時領域 (C)XXXXXX INC. All Rights Reserved.
委任不可な状態 データソース側(この場合はSharePoint)で実施不可な状態。 上限となる2000件をPower Appsが受取り、その中から操作を行う。 Power Apps SharePoint ①フィルターや検索などの操作を依頼 ③最初の2000件を返却 (既定の上限は500件) ④フィルターや検索など 操作を実施 ⑤表示 Power Appsの 一時領域 2000件 委任問題とは2000件を超える件数がデータソースにある場合 実際の件数と異なってしまう (C)XXXXXX INC. All Rights Reserved. ②不可なので操作断念
SharePointにおける委任可否 In関数を使用しているため、委任不可となります。 関数 SPOにおける委任可否 使用状況 備考 Filter ◯ 有り ー Search ✕ 無し ー Sort ◯ 有り ー SortByColumns ◯ 無し ー LookUp ◯ 無し ー = ◯ 有り ー <> ◯ 無し ー <、<=、>、>= ◯ 無し ー In ✕ 有り 依頼件名でIn関数を使用している StartsWith ◯ 無し ー Sum、Min、Max、Avg ✕ 無し ー CountRows ✕ 無し ー 登壇時点の内容です。◯と記載している場合でも一部のデータ型は委任対象外となる場合があります。 依 頼 件 名 の Fi lterでi n関 数を 使用している。 (C)XXXXXX INC. All Rights Reserved. 実 際 に委 任警 告が 出 てい る。
委任問題回避(委任不可の関数を使わざるを得ない場合) データソース側(この場合はSharePoint)で予め委任可能な関数で2000件以内になるように抽出して コレクションに格納しておく。 そのコレクションに対して委任不可の関数で抽出を行う。 Power Apps SharePoint ①委任可能な関数で件数が2000件以内になるように フィルターや検索の操作を依頼 ⑤委任不可の関数を使用して フィルターや検索の 操作を実施 ④データ格納 ②可能なので操作を実施 ③実行結果返却 ⑥表示 コレクションに 格納 (C)XXXXXX INC. All Rights Reserved. Power Appsの 一時領域 (2000件以内)
委任問題回避(委任不可の関数を使わざるを得ない場合) タイマーコントロールを追加して実装 タイマーコントロール:一定時間が経過した後のアプリの動作を指定するコントロール (C)XXXXXX INC. All Rights Reserved.
委任問題回避(委任不可の関数を使わざるを得ない場合) タイマーコントロールを追加して実装 プロパティ Duration プロパティ説明 実行時間をミリ秒で指定 画面に移動したときに自動的に再生を AutoStart 開始するかどうかを設定 (今回はtrue) タイマー実行完了したときに実行するアクション OnTimerEnd (データソースからコレクションに2000件以内に なるようにデータ格納) Visible 表示・非表示設定 (C)XXXXXX INC. All Rights Reserved. 設定値 300 true ClearCollect(colWorkList, Filter(作業依頼リスト,依頼日時>=DateAdd(Today(),-6,TimeUnit.Months)) false
委任問題回避(委任不可の関数を使わざるを得ない場合) I temsプロパティのFilter関数のデータソースの代わりにコレクションを指定する Itemsプロパティ Filter( 作業依頼リスト, IsBlank(cmbRequestKind.Selected) || 依頼種類.Value = cmbRequestKind.Selected.Value, IsBlank(txtRequestOverview.Text) || txtRequestOverview.Text in 依頼件名, IsBlank(cmbSearchDepartment.Selected) || 部署名.Value = cmbSearchDepartment.Selected.Value, IsBlank(cmbSearchRequester.Selected) || 登録者.DisplayName = cmbSearchRequester.Selected.Value, IsBlank(dteSearchRequestDateFrom.SelectedDate) || 登録日時>=dteSearchRequestDateFrom.SelectedDate, IsBlank(dteSearchRequestDateTo.SelectedDate) || 登録日時<=DateAdd(dteSearchRequestDateTo.SelectedDate,1), IsBlank(dteSearchDueDateFrom.SelectedDate) || 希望納期>=dteSearchDueDateFrom.SelectedDate, IsBlank(dteSearchDueDateTo.SelectedDate) || 希望納期<=DateAdd(dteSearchDueDateTo.SelectedDate,1) ) デ ー タ ソ ー ス → コレ ク ショ ンに 変更 Filter( colWorkList, IsBlank(cmbRequestKind.Selected) || 依頼種類.Value = cmbRequestKind.Selected.Value, IsBlank(txtRequestOverview.Text) || txtRequestOverview.Text in 依頼件名, IsBlank(cmbSearchDepartment.Selected) || 部署名.Value = cmbSearchDepartment.Selected.Value, IsBlank(cmbSearchRequester.Selected) || 登録者.DisplayName = cmbSearchRequester.Selected.Value, IsBlank(dteSearchRequestDateFrom.SelectedDate) || 登録日時>=dteSearchRequestDateFrom.SelectedDate, IsBlank(dteSearchRequestDateTo.SelectedDate) || 登録日時<=DateAdd(dteSearchRequestDateTo.SelectedDate,1), IsBlank(dteSearchDueDateFrom.SelectedDate) || 希望納期>=dteSearchDueDateFrom.SelectedDate, IsBlank(dteSearchDueDateTo.SelectedDate) || 希望納期<=DateAdd(dteSearchDueDateTo.SelectedDate,1) ) (C)XXXXXX INC. All Rights Reserved.
委任問題回避のまとめ ① 委任不可の場合はデータソースから最初の2000件を Power Appsに返却する ② 委任問題とは2000件を超える件数がデータソースにある場合に 本来とは異なる件数で抽出されること ③ 委任可能な関数で2000件以内の件数に収まるようにコレクション に退避し、委任不可の関数でコレクションから抽出が可能 (C)XXXXXX INC. All Rights Reserved.
勉強させていただいた記事 ○Filter関連 Power Apps ギャラリーのフィルターはAND、ORを使おう(IF文ネストは増えると大変) https://youseibubu.com/apps/galleryfilter/ Power Apps のギャラリーのフィルターまとめ https://qiita.com/Takashi_Masumor i/items/777c37b57ddecbf05d12 Power Apps 最近学んだギャラリーのFilter関数のきれいな書き方 僕のこれまでの書き方とその問題点も一緒に https://ippu-biz.com/development/powerplatform/power apps/filter -with-gallery/ How to apply M ultiple Filter s to Power Apps Galler y: Dates, Rang es & M or e! https://www.youtube.com/watch?v=1QflzfPyPe0&list=PLTyFh qDKAiEIVlidnhE Lx5BusnzlDzkR&index=2 ○委任問題回避 Lear ning Commons for Power Platform(#14の講義で教わりました) https://kuro.connpass.com/ (C)XXXXXX INC. All Rights Reserved. 25
ご清聴ありがとうございました。