APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

【Power Apps】「テーブルっぽいギャラリー」のテンプレート YAML

はじめに

Power Platform 推進チームの小野です。

本稿では、テーブルのような見た目のギャラリーをテンプレート化した YAML について共有・解説します。

テーブルっぽいギャラリーの必要性

アプリの画面上に表形式でデータを表示する機会は多いはずです。多くの場合、アプリで実現したいことは「テーブルデータの操作」であり、テーブルにレコードを追加したり、レコードを選択して編集・削除したりする機能が求められます。レコードを選択する画面で、なじみ深い Excel のような表形式が好まれるのではないでしょうか。

Power Apps でテーブルを表示するコントロールとしては、データテーブル と ギャラリー があります。細かい比較は下記のサイトが大変参考になります。

youseibubu.com

データテーブル コントロールは、簡単に作成できる反面、細かい調整ができないデメリットがあります。各行に編集ボタン・削除ボタンを入れたり、条件によって色を変えたり、といったことができません。

データテーブル

ギャラリーならそういった調整が可能ですが、表形式として使うには、列の「見出し」を自分で追加する必要があります。見出しを作ったり、上下二段になっている表示を一段に変えたりすれば表形式の見た目を表現できるものの、作成するたびに調整の手間がかかります。

ギャラリー

そこで、表形式に整えた「テーブルっぽいギャラリー」を YAML 形式で共有して再利用できるようにしようと考えました。

テーブルっぽいギャラリー

YAML 形式での表示について

先月、Power Apps のコントロールを YAML 形式で表示する機能が Public Preview されました。コントロールの各プロパティを一覧で確認したり、YAML をもとにコントロールを作成したりと、色々な使い方が考えられる機能です。

www.microsoft.com

誤解を恐れずに言えば、YAML を介してコントロール単位でのエクスポート・インポートができるわけです。以下でも言及されているとおり、ブログなどで機能を紹介するときに、読者がすぐに試せるサンプルを YAML で提供できるようになったのはありがたいですね。

koruneko.hatenablog.com

YAML の表示方法

コントロールの三点リーダや右クリックから「ビューを表示」で、YAML が表示できます

YAML 表示方法

なお、この画面での YAML の編集は、現時点ではできません。VS Codeなどに貼り付けて編集しましょう。

YAML での表示

YAML からコントロールを作成

YAML をもとにコントロールを作成するには、YAML をクリップボードにコピーした状態で「コードを貼り付ける」をクリックします。現状ではこのクリップボードを経由した貼り付けが唯一の方法のようで、コントロール作成前に一部変更するようなことはできません。

YAML を貼り付けてコントロール作成

YAML

以下が「テーブルっぽいギャラリー」の YAMLです。150行ほどあります。

※ご利用は自己責任でお願いします。

YAML

- TPG_Container_Table:
    Control: GroupContainer
    Variant: verticalAutoLayoutContainer
    Properties:
      Height: =500
      LayoutDirection: =LayoutDirection.Vertical
      LayoutMode: =LayoutMode.Auto
      Width: =800
    Children:
    - TPG_Container_Labels:
        Control: GroupContainer
        Variant: horizontalAutoLayoutContainer
        Properties:
          AlignInContainer: =AlignInContainer.SetByContainer
          FillPortions: =0
          Height: =60
          LayoutGap: =2
          LayoutMinHeight: =60
          LayoutMode: =LayoutMode.Auto
          Width: =Parent.Width
        Children:
        - TPG_Label1:
            Control: Label
            Properties:
              Text: ="ラベル1"
              BorderColor: =
              Color: =RGBA(255, 255, 255, 1)
              DisplayMode: =DisplayMode.View
              Fill: =RGBA(56, 96, 178, 1)
              FontWeight: =FontWeight.Bold
              Height: =Parent.Height
              PaddingLeft: =10
        - TPG_Label2:
            Control: Label
            Properties:
              Text: ="ラベル2"
              BorderColor: =
              Color: =TPG_Label1.Color
              DisplayMode: =DisplayMode.View
              Fill: =TPG_Label1.Fill
              FontWeight: =FontWeight.Bold
              Height: =Parent.Height
              PaddingLeft: =10
        - TPG_Label3:
            Control: Label
            Properties:
              Text: ="ラベル3"
              BorderColor: =
              Color: =TPG_Label1.Color
              DisplayMode: =DisplayMode.View
              Fill: =TPG_Label1.Fill
              FillPortions: =1
              FontWeight: =FontWeight.Bold
              Height: =Parent.Height
              PaddingLeft: =10
    - TPG_Gallery:
        Control: Gallery
        Variant: BrowseLayout_Vertical_OneTextVariant_ver5.0
        Properties:
          AlignInContainer: =AlignInContainer.SetByContainer
          DelayItemLoading: =true
          Layout: =Layout.Vertical
          LoadingSpinner: =LoadingSpinner.Data
          TemplatePadding: =0
          TemplateSize: =80
          Width: =Parent.Width
          X: =40
          Y: =40
        Children:
        - TPG_NextArrow:
            Control: Classic/Icon
            Variant: ChevronRight
            Properties:
              OnSelect: =Select(Parent)
              AccessibleLabel: =Self.Tooltip
              Tooltip: ="項目の詳細の表示"
              Color: =RGBA(166, 166, 166, 1)
              Height: =50
              Icon: =Icon.ChevronRight
              PaddingBottom: =12
              PaddingLeft: =12
              PaddingRight: =12
              PaddingTop: =12
              Width: =50
              X: =Parent.TemplateWidth - Self.Width - 12
              Y: =(Parent.TemplateHeight / 2) - (Self.Height / 2)
        - TPG_Container_Datas:
            Control: GroupContainer
            Variant: horizontalAutoLayoutContainer
            Properties:
              Height: =Parent.TemplateHeight
              LayoutGap: =TPG_Container_Labels.LayoutGap
              LayoutMode: =LayoutMode.Auto
              Width: =Parent.Width
            Children:
            - TPG_Data1:
                Control: Label
                Properties:
                  OnSelect: =
                  Text: =ThisItem.SampleHeading
                  FontWeight: =If(ThisItem.IsSelected, FontWeight.Semibold, FontWeight.Normal)
                  Height: =Parent.Height
                  PaddingBottom: =0
                  PaddingLeft: =TPG_Label1.PaddingLeft
                  PaddingRight: =0
                  PaddingTop: =0
                  Width: =TPG_Label1.Width
                  X: =TPG_Label1.X
            - TPG_Data2:
                Control: Label
                Properties:
                  OnSelect: =
                  Text: =ThisItem.SampleHeading
                  FontWeight: =If(ThisItem.IsSelected, FontWeight.Semibold, FontWeight.Normal)
                  Height: =Parent.Height
                  PaddingBottom: =0
                  PaddingLeft: =TPG_Label2.PaddingLeft
                  PaddingRight: =0
                  PaddingTop: =0
                  Width: =TPG_Label2.Width
                  X: =TPG_Label2.X
            - TPG_Data3:
                Control: Label
                Properties:
                  OnSelect: =
                  Text: =ThisItem.SampleText
                  FontWeight: =If(ThisItem.IsSelected, FontWeight.Semibold, FontWeight.Normal)
                  Height: =Parent.Height
                  PaddingBottom: =0
                  PaddingLeft: =TPG_Label3.PaddingLeft
                  PaddingRight: =0
                  PaddingTop: =0
                  Width: =TPG_Label3.Width
                  X: =TPG_Label3.X
        - TPG_Rectangle:
            Control: Rectangle
            Properties:
              OnSelect: =Select(Parent)
              Fill: =TPG_Label1.Fill
              Height: =Parent.TemplateHeight - TPG_Separator.Height
              Visible: =ThisItem.IsSelected
              Width: =4
        - TPG_Separator:
            Control: Rectangle
            Properties:
              OnSelect: =Select(Parent)
              Fill: =If(ThisItem.IsSelected, TPG_Label1.Fill, ColorFade(TPG_Label1.Fill, 0.5))
              Height: =1
              Width: =Parent.TemplateWidth
              Y: =Parent.TemplateHeight - Self.Height

使い方

YAML 貼り付けでコントロールを作成したあと、可変値になっている箇所を更新してください。最低限、下記の箇所は更新が必要だと思われます。

  • TPG_Container_Table:Height、Width(コンテナー全体のサイズ)
  • TPG_Label各種:Text(見出しの項目名。DataSourceInfo 関数を使うと、テーブルの列名を候補として表示できます)
DataSourceInfo([テーブル名], DataSourceInfo.DisplayName, [列名])

DataSourceInfoで列名の候補を表示

  • TPG_Gallery:Items(Gallery として表示するテーブルを指定)
  • TPG_Data各種:Text(ギャラリーに表示されるフィールド。ThisItem. で列の候補を表示できます)
    ThisItem. で候補を表示

表示する列を増やしたい場合

TPG_Label と TPG_Data をコピーして同じコンテナー内にペーストします。選択して Ctrl+C → Ctrl+V で、同じコンテナー内に複製できます。コントロール名や Text は適宜更新してください。

TPG_Label と TPG_Data をコピペ

なお、TPG_Label と TPG_Data については、末尾のモノのみ「幅(伸縮可能)」をオンにしておくのがオススメ。コンテナーの幅に合わせて自動的に調整してくれます。

見出しラベルの末尾は、幅(伸縮可能)をオンに

オフだと隙間が空いた感じになることも

おわりに

データ テーブル コントロールはいろいろと融通が利かず、「テーブルっぽいギャラリー」は便利だと思い、共有しました。やはり Excel っぽい見た目だと、なじみがあって使いやすいのではと思います。ただ、データ テーブル コントロールはまだプレビュー段階なので、今後のアップデートで改善されていく可能性はあります。

Power Apps はノーコード・ローコードでアプリが作成できる反面、ソースコードを介して部品を共有する文化は醸成されにくいと感じていました。今回のアップデートによって、コントロール単位でソースコードを共有しやすくなりました。YAML 出力の機能をうまく使って「車輪の再発明」を防ぎ、アプリ作成を効率化したいと思います。