Power AppsPower Platform

【Power Apps】コピペで簡単!シンプルな検索アプリのサンプル

今回の記事では、Power Appsでシンプルな検索アプリを実装していきます。
社内用語検索やFAQ(よくある質問)検索などにご活用ください。

スポンサーリンク

完成イメージ

画面中央のテキスト入力にキーワードを入力すると、それに合致するデータが表示されます。
半角/全角スペースで区切ることで、複数キーワードでの検索も可能です。

検索アプリ実装イメージ

前提・注意事項

今回の検索アプリは、データソースとしてSharePointリストを利用しています。
検索時の不具合を防ぐため、SharePointリストに格納するデータは2000行以下に抑えてください。
(2001行以上のデータがSharePointリストに含まれていると、正しく検索できない可能性があります。)

スポンサーリンク

データ準備

アプリを作成する前に、検索元となるSharePointリストのデータを準備していきます。

SharePointリストの作成

まずは検索元となるSharePointリストを作成していきます。
お好きなSharePointサイトにアクセスし、右上の「歯車アイコン」>「サイトコンテンツ」に進みます。

サイトコンテンツへのアクセス

続いて左上の「+新規」>「リスト」を選択し、次の画面でも「リスト」を選択します

リストの作成
リストの作成_選択

リスト名の入力欄が表示されるため、「SearchDataSource」と入力して「作成」ボタンを押します。

リストの作成_入力

列の追加

SharePointリストが作成できたため、続いて列を追加します。
すでに「タイトル」という列ができているかと思いますので、その右の「+列の追加」を選択して「Details」列を保存します。

列の作成_複数行テキスト
列の作成_内部列名

追加できたら、Power Appsの実装時に分かりやすくなるよう列名を変更します。
先ほど作成したDetails列をクリックし、「列の設定」>「編集」を選択します。名前をDetailsから「詳細」に変更してください。
(最初から「詳細」と日本語で名付けてしまうと、内部列名が文字化け・エンコードされて分かりづらくなってしまいます。そのため、わざわざ「Details」と英語で作成してから、日本語に直しています)

列の編集
列の編集_表示列名

データの入力

SharePointリストの列が追加できたため、データを入力していきます。
「グリッドビューを編集」ボタンなどを利用して、データを書き込んでください。

グリッドビューで編集
グリッドビューの終了

今回はサンプルとして以下表のようなデータを入力しました。

タイトル詳細
フロートリガーとアクションから構成される自動化プロセス
トリガーフローを開始するイベントや条件
アクショントリガーを呼び出した際に開始するタスク
キャンバスアプリドラッグ&ドロップでユーザーが自由にレイアウトをデザインできるアプリ。高度にカスタマイズ可能なユーザーインターフェース(UI)を持つアプリケーションを作成可能。
モデル駆動型アプリデータモデルに基づいて自動的にUIが生成されるアプリ。Dataverseというデータベースと連携して、データの管理や操作に特化したアプリケーションを作成可能。

もし自身でデータを用意する場合、以下の要領で入力してください

  • 用語検索として利用したい:タイトル列に単語を、詳細列にその単語の意味を入力
  • FAQ(よくある質問)として利用したい:タイトル列に質問(Q)を、詳細列に回答(A)を入力
スポンサーリンク

アプリの作成

データの準備が完了したため、Power Appsポータルから新規アプリを作成していきます。

アプリの新規作成

「作成」メニューの「白紙から作成する」を選択します。サイズは「タブレットPCのサイズ」を選択します。
(メニュー名の変更が起こる可能性があるため、適宜読み替えて新規アプリを作成してください)

アプリの作成_空のキャンバス
アプリの作成_タブレットサイズ

データソースの接続

しばらく待つと空のアプリが作成され、アプリ開発画面が表示されます。
まずは左側のメニューから表のマークを選択した後、「データの追加」ボタンを押します。
その後「データソースの選択」ポップアップ内で「SharePoint」を選択します。

データの追加
データソースの選択

SharePointリストの接続を選択する画面が表示されます。
自身のメールアドレスが表示された場合はそれを選択し、接続方法を聞かれた場合は「直接接続」を選択してください。

接続の選択
データの接続_直接接続

続いて先ほど作成したSharePointリスト(SearchDataSource)の場所を指定します。
SharePointリストのURLを入力するか、「最近利用したサイト」から選択していきます。
今回は「最近利用したサイト」を選択したため、その後リストの場所も選択します。

サイトに接続
リストの選択

データ行の上限設定

データソースの接続が完了したら、データ行の上限を設定します。
「歯車アイコン」>「全般」>「データ行の制限」を選択し、最大値である2000を設定します。
(設定することで、最大2000件のデータから正しく検索できます)

アプリの設定
データ行の制限設定

スクリーンのコピー&ペースト

ここまでの設定が完了したら、検索画面を構築します。
以下のコードをコピーしてください (右上の青いコピーボタンをご利用ください)

Screens:
  SearchScreen:
    Properties:
      LoadingSpinnerColor: =RGBA(56, 96, 178, 1)
    Children:
      - ctnSearchScreen:
          Control: GroupContainer@1.5.0
          Variant: AutoLayout
          Properties:
            DropShadow: =DropShadow.None
            Height: =768
            LayoutAlignItems: =LayoutAlignItems.Center
            LayoutDirection: =LayoutDirection.Vertical
            LayoutGap: =4
            PaddingBottom: =8
            PaddingLeft: =8
            PaddingRight: =8
            PaddingTop: =8
            Width: =1366
          Children:
            - ctnHeader:
                Control: GroupContainer@1.5.0
                Variant: AutoLayout
                Properties:
                  Fill: =RGBA(25, 118, 210, 1)
                  FillPortions: =2
                  LayoutAlignItems: =LayoutAlignItems.Center
                  LayoutDirection: =LayoutDirection.Horizontal
                  LayoutJustifyContent: =LayoutJustifyContent.Center
                  LayoutMinHeight: =0
                  LayoutMinWidth: =16
                  PaddingBottom: =8
                  PaddingLeft: =8
                  PaddingRight: =8
                  PaddingTop: =8
                  RadiusBottomLeft: =6
                  RadiusBottomRight: =6
                  RadiusTopLeft: =6
                  RadiusTopRight: =6
                Children:
                  - icoSearch:
                      Control: Icon@0.0.7
                      Properties:
                        Height: =48
                        Icon: ="Search"
                        IconColor: =RGBA(255, 255, 255, 1)
                        IconStyle: ='Icon.IconStyle'.Filled
                        LayoutMinHeight: =16
                        LayoutMinWidth: =16
                        Width: =48
                  - lblAppTitle:
                      Control: ModernText@1.0.0
                      Properties:
                        Align: =Align.Center
                        Color: =RGBA(255, 255, 255, 1)
                        FontWeight: =FontWeight.Semibold
                        Height: =60
                        LayoutMinHeight: =16
                        LayoutMinWidth: =16
                        Size: =30
                        Text: ="検索アプリ"
                        Width: =200
            - ctnBody:
                Control: GroupContainer@1.5.0
                Variant: AutoLayout
                Properties:
                  DropShadow: =DropShadow.None
                  FillPortions: =14
                  LayoutAlignItems: =LayoutAlignItems.Center
                  LayoutDirection: =LayoutDirection.Horizontal
                  LayoutGap: =10
                  LayoutMinHeight: =0
                  LayoutMinWidth: =16
                  PaddingBottom: =10
                  PaddingLeft: =2
                  PaddingRight: =2
                  PaddingTop: =10
                  RadiusBottomLeft: =6
                  RadiusBottomRight: =6
                  RadiusTopLeft: =6
                  RadiusTopRight: =6
                Children:
                  - ctnBodyLeft:
                      Control: GroupContainer@1.5.0
                      Variant: ManualLayout
                      Properties:
                        LayoutMinHeight: =16
                        LayoutMinWidth: =16
                        RadiusBottomLeft: =6
                        RadiusBottomRight: =6
                        RadiusTopLeft: =6
                        RadiusTopRight: =6
                        X: =40
                        Y: =40
                      Children:
                        - galSearchResult:
                            Control: Gallery@2.15.0
                            Variant: BrowseLayout_Vertical_TwoTextOneImageVariant_ver5.0
                            Properties:
                              BorderColor: =RGBA(0, 18, 107, 1)
                              Height: =400
                              Items: |-
                                =With(
                                    {
                                        scpReplacedQuery: Substitute(
                                            txtInputKeywords.Text,
                                            " ",
                                            " "
                                        )
                                    },
                                    Filter(
                                        SearchDataSource,
                                        Or(
                                            CountRows(
                                                Filter(
                                                    Split(
                                                        scpReplacedQuery,
                                                        " "
                                                    ),
                                                    Value in Title
                                                )
                                            ) = CountRows(
                                                Split(
                                                    scpReplacedQuery,
                                                    " "
                                                )
                                            ),
                                            And(
                                                CountRows(
                                                    Filter(
                                                        Split(
                                                            scpReplacedQuery,
                                                            " "
                                                        ),
                                                        Value in Details
                                                    )
                                                ) = CountRows(
                                                    Split(
                                                        scpReplacedQuery,
                                                        " "
                                                    )
                                                ),
                                                chkIncludeDetails.Checked
                                            )
                                        )
                                    )
                                )
                              OnSelect: |-
                                =UpdateContext({locIsSelectedItem: true})
                              TemplateSize: =100
                              Width: =Parent.Width - 100
                              X: =50
                              Y: =180
                            Children:
                              - lblItemTitle:
                                  Control: ModernText@1.0.0
                                  Properties:
                                    FontWeight: |-
                                      =If(
                                          ThisItem.IsSelected,
                                          FontWeight.Bold,
                                          FontWeight.Normal
                                      )
                                    OnSelect: =Select(Parent)
                                    PaddingBottom: =0
                                    PaddingTop: =0
                                    Size: =18
                                    Text: =ThisItem.Title
                                    Width: =Parent.Width - 120
                                    Y: =18
                              - lblItemDetails:
                                  Control: ModernText@1.0.0
                                  Properties:
                                    FontWeight: |-
                                      =If(
                                          ThisItem.IsSelected,
                                          FontWeight.Bold,
                                          FontWeight.Normal
                                      )
                                    OnSelect: =Select(Parent)
                                    Size: =16
                                    Text: =ThisItem.Details
                                    Width: =Parent.Width - 60
                                    Wrap: =false
                                    Y: =50
                              - btnChevronRight:
                                  Control: Button@0.0.45
                                  Properties:
                                    Appearance: ='ButtonCanvas.Appearance'.Transparent
                                    FontColor: =RGBA(40, 134, 222, 1)
                                    FontSize: =32
                                    Icon: ="ChevronRight"
                                    IconStyle: |-
                                      =If(
                                          ThisItem.IsSelected,
                                          'Icon.IconStyle'.Filled,
                                          'Icon.IconStyle'.Outline
                                      )
                                    Layout: ='ButtonCanvas.Layout'.IconOnly
                                    OnSelect: =Select(Parent)
                                    Text: =
                                    Width: =32
                                    X: =Parent.Width - 60
                                    Y: =(Parent.TemplateHeight - Self.Height) / 2
                        - chkIncludeDetails:
                            Control: CheckBox@0.0.30
                            Properties:
                              CheckboxSize: =20
                              Checked: =true
                              FontSize: =18
                              Height: =40
                              Label: ="説明文も含めて検索"
                              Width: =240
                              X: =60
                              Y: =110
                        - txtInputKeywords:
                            Control: ModernTextInput@1.0.0
                            Properties:
                              Height: =60
                              PaddingLeft: =10
                              PaddingRight: =10
                              Placeholder: ="キーワード検索"
                              RadiusBottomLeft: =30
                              RadiusBottomRight: =30
                              RadiusTopLeft: =30
                              RadiusTopRight: =30
                              Required: =true
                              Size: =18
                              Width: =Parent.Width - 100
                              X: =50
                              Y: =50
                  - ctnBodyRight:
                      Control: GroupContainer@1.5.0
                      Variant: ManualLayout
                      Properties:
                        LayoutMinHeight: =16
                        LayoutMinWidth: =16
                        Visible: =locIsSelectedItem
                      Children:
                        - lblTitle:
                            Control: ModernText@1.0.0
                            Properties:
                              FontWeight: =FontWeight.Semibold
                              Height: =120
                              Size: =18
                              Text: =galSearchResult.Selected.Title
                              VerticalAlign: =VerticalAlign.Bottom
                              Width: =Parent.Width - 100
                              X: =50
                              Y: =40
                        - lblDetails:
                            Control: ModernText@1.0.0
                            Properties:
                              Height: =420
                              PaddingTop: =20
                              Size: =18
                              Text: =galSearchResult.Selected.Details
                              VerticalAlign: =VerticalAlign.Top
                              Width: =Parent.Width - 100
                              X: =50
                              Y: =160
                        - btnCloseRightPane:
                            Control: Button@0.0.45
                            Properties:
                              Appearance: ='ButtonCanvas.Appearance'.Transparent
                              FontColor: =RGBA(255, 0, 0, 1)
                              FontSize: =32
                              Icon: ="Dismiss"
                              IconStyle: ='ButtonCanvas.IconStyle'.Outline
                              Layout: ='ButtonCanvas.Layout'.IconOnly
                              OnSelect: |-
                                =UpdateContext({locIsSelectedItem: false})
                              Visible: =locIsSelectedItem
                              Width: =32
                              X: =620
                              Y: =16
            - ctnFooter:
                Control: GroupContainer@1.5.0
                Variant: AutoLayout
                Properties:
                  DropShadow: =DropShadow.None
                  LayoutAlignItems: =LayoutAlignItems.Center
                  LayoutDirection: =LayoutDirection.Horizontal
                  LayoutMinHeight: =16
                  LayoutMinWidth: =16
                  PaddingBottom: =8
                  PaddingLeft: =8
                  PaddingRight: =8
                  PaddingTop: =8
                Children:
                  - lnkPower365Medium:
                      Control: ModernLink@1.0.0
                      Properties:
                        Align: =Align.Right
                        FillPortions: =1
                        LayoutMinHeight: =16
                        LayoutMinWidth: =16
                        PaddingRight: =30
                        Text: ="Designed by Power365Medium"
                        URL: ="https://power365medium.com/simple-search-app/"

コピーできたら、画面中央に表示されている空白キャンバスの上で右クリックします。
「貼り付け」を選択すると、検索画面が自動で構築されます。

検索画面の貼り付け
検索画面の表示

不要になった画面 (Screen1)は削除しておくことをお勧めします。

Screen1の削除

保存・公開

構築したアプリを保存・公開して完了です。
また、必要に応じてテストをして動作を確認してください。

アプリのプレビュー保存公開
検索アプリ実装イメージ
スポンサーリンク

まとめ

今回の記事では、SharePointリストとPower Appsを利用してシンプルな検索アプリを構築しました。
複数キーワードでの検索も可能なので、社内用語検索やFAQ(よくある質問)検索などにお役立てください。

この記事は役に立ちましたか?

役に立った!
役に立たなかった...
フィードバックありがとうございました
スポンサーリンク
Hiromaru

普段からPower Platform・SharePointの技術を広めています!
デザインに力を入れて、見やすい・分かりやすい記事を投稿していきます

Hiromaruをフォローする
シェアする
Hiromaruをフォローする
タイトルとURLをコピーしました