えくせるちゅんちゅん

ことりがエクセルをちゅんちゅんするブログ

Power Appsでコレクションを連結する数式

おはこんばんにちは。ことりちゅんです。

最近Power Appsでコレクションの先頭に1件追加したくなったので、コレクションに1行挿入する方法や、2つのコレクションを縦に連結する式を検討してみました。

前提知識

テーブル連結とテーブル結合

表の下に同じ列を持つ表を縦に付け足すものを連結(SQLで言うUNION ALL)。

表と表をキーとなる列でマッチングして異なる列を横に付け足すものを結合(SQLで言うJOIN)と呼び分けています。

どちらもよく使われる処理ですが、本記事で説明しているのは縦方向への連結です。

結論

コレクションの連結方法について色々な式を検討したのですが、最終的に Table( ["その他"], [1,2,3] ) で十分ということが分かりました。 (そういえば最近Power Appsのバージョンアップで対応したような気もします)

learn.microsoft.com

基本的にはこの書き方で十分なので、ここから先は興味がある人だけ御覧ください。

なお、後述しますがコレクションにはデータ型があり、入っているデータによって自動認識するため、自動キャストできない場合はエラーが格納されます。

動作関数と非動作関数

Power Appsの関数には、動作関数と非動作関数の2種類があります。

動作関数とは、 Select(他のボタンを押す)や Navigate(別のページに移動する) を代表とする、主にユーザー画面に対して直接何らかの状態変化を与える関数です。

非動作関数は、逆に状態変化を行わない結果の値だけを戻り値として返すいわゆる純粋な関数です。 (戻り値がコントロールのプロパティを通してユーザー画面に変化を与えることはあります)

非動作関数がExcelの数式で使われるような関数と同じ性質のもので、Excelに無いような関数が動作関数と捉えることもできます。

非動作関数はどこでも使えますが、動作関数は OnSelect(ボタンをクリックしたとき)や OnVisible (スクリーンが表示されたとき) など 動作プロパティ(名前が On~~~ から始まるプロパティ)の中でしか使用できないという制限があります。

今回使用する関数

Clear ClearCollect Collect これらは、画面へ変化は与えませんが、内部メモリのコレクションを書き換えるという状態変化を伴うため動作関数です。

Patch データを更新した結果を返す関数の性質を持ち合わせてはいますが、第一引数を書き換えるという性質を持つため動作関数です。

UnGroup Table Sequence これらは引数から配列を作ったり変形したりする事のできる純粋関数なので非動作関数です。

ForAll ループを実現する関数ですが、これはループの中の記述によって性質が変化します。関数そのものは非動作関数です。

Power Appsのコレクション(テーブル)

Power Appsでは、一般的に配列変数と呼ばれるような連続的なデータのことをコレクションと呼びます。※ヘルプではテーブルと表現が揺れている気がします。

実際には何らかの列名と列の型を必ず持っているため、連想配列の配列のようなデータ構造です。

learn.microsoft.com

例えば [1,2,3]Sequence( 3 ) と書くこともできますが、内部的には [ {Value : 1}, {Value : 2}, {Value : 3} ] です。(明示されていない列名は自動的にValueとなります)

なお、Table関数を使用して Table( {Value : 1}, {Value : 2}, {Value : 3} ) と書くこともできます。

いろいろな数式

【動作関数】ボタンを押したら内部メモリにコレクションを生成

注意:数値の列に文字列を追加しようとするとエラーが起きる

//ClearCollect(list1, Sequence(5,1,1)); //NG
ClearCollect(list1, ["1", "2", "3", "4", "5"]);
Patch(list1, Defaults(list1), {Value: "その他"})

【動作不能】ローカルリストにPatchで挿入

Patchは動作関数なので、非動作プロパティには書けませんでした。

Patch(Sequence(3,1), {Value:""}, {Value:"その他"})

そもそも、動作プロパティでも動きませんでした。

ClearCollect( list2, Patch(Sequence(3,1), {Value:""}, {Value:"その他"}) );

【非動作関数】Ungroupでテーブルとテーブルを結合

おそらくTable関数で結合できなかった頃にメジャーだった手法です。

数値に数値を追加・・・普通にできる

Ungroup(
    Table(
        {List: Sequence(5, 1, 1)}
        ,{List: Table({Value: 123})}
    ),
    List
)

数値型の列に文字列型を追加・・・無言で空欄になる

Ungroup(
    Table(
        {List: Sequence(5, 1, 1)}
        ,{List: Table({Value: "その他"})}
        ,{List: Table({Value: "123"})}
    ),
    List
)

文字列に数値を追加・・・正常だがデータはすべて文字列にキャストされる

Ungroup(
    Table(
        {List: Table({Value: "その他"})}
        ,{List: Sequence(5, 1, 1)}
        ,{List: Table({Value: "123"})}
    ),
    List
)

先頭のリストの列の型に揃えなければならない。

リスト+値結合、リスト+リスト結合、リスト+リスト+リスト結合などあらゆる場面に対応できる。

【非動作関数】ForAllでリストの値を置換する

元のリスト

Sequence(5, 1, 1)

先頭の0をその他に置換

ForAll( Sequence(6, 0, 1), {Value: If(Value = 0, "その他", Value)} )

末尾の6をその他に置換

ForAll( Sequence(6, 1, 1), {Value: If(Value = 6, "その他", Value)} )

リストを生成していないため、列に型の縛りがない。Ungroupのような型縛りの影響を受けない。

冒頭に0などを生成しなければならないため、Sequenceで配列を生成している場面でないと使いにくい。(リストからのFilterなどでダミー行取得は難しい)

最後に

いつも検索しているので調査結果をまとめてみました。

執筆してから Table で連結できると言うことに気が付きました 。もう手遅れですが、気がつけて良かったということにしておきましょう。

ちゅんちゅん。

プライバシーポリシー