はじめに
この記事では、Power Apps のカスタム関数でパラメータにレコード、及びテーブルを利用する際の覚書になります。
もし誤っている内容や、私の理解が足りないような記載がありましたら指摘してもらえると助かります。
また、現時点(2021/02/28)ではカスタム関数はPreview 機能なため、この記事をご覧になっている際には機能などが大幅に変更になっている可能性がありますので、 ご注意ください。
カスタム関数とは
カスタム関数ってなに?という方は、以前私が簡単にまとめた記事があるので、まずはそちらをご覧になってください。
パラメータを利用してみる
レコード
入力、及び出力のデータ型にレコードを設定した場合の動作についてです。
以下のように設定します。
左上のプロパティを選択すると先ほど作成した、関数とパラメータが存在します。
Record_record
の式をみてみると以下のように設定されています。
Record_record
{SampleStringField: "SampleText", SampleNumberField: 10, SampleBooleanField: true}
この式がなにを表しているのか?というと、関数を呼び出す際のパラメータに渡すレコードのフィールドを定義しています。
ここで定義したようなレコード以外を渡すとエラーになってしまうので、注意が必要です。
アウトプットは、 Record
で定義します。
Record
{SampleStringField: "[" & record.SampleStringField & "]", SampleNumberField: record.SampleNumberField * 2, SampleBooleanField: true}
今回はテストのため、与えられたレコードを少し加工して返すだけにしています。
画面に戻り、この関数を呼び出してみましょう。
Gallery.Items
Component1_1.Record({SampleStringField: "Text", SampleNumberField: 100, SampleBooleanField: true})
先ほど作成した関数に予め定義されたようなレコードを渡すと、 SampleStringField
の値は前後に"[]"を付けて、 SampleNumberField
の値は2を乗算した値が返ってきていることが確認できます。
また、下記の画像のように異なるフィールドのレコードを渡すとエラーになってしまうということも確認できました。
テーブル
続いてパラメータの型にテーブルを設定した場合です。
基本的にレコードの時と考え方は同じです。
以下のように設定します。
テーブルのときもレコードのときと同様にフィールドの定義が必要です。
Tabele_table
Table({SampleStringField: "SampleText", SampleNumberField: 10, SampleBooleanField: true})
出力には以下のように加工したテーブルを返します。
Table
ForAll( table, { SampleStringField: "{" & SampleStringField & "}", SampleNumberField: SampleNumberField / 2, SampleBooleanField: SampleBooleanField } )
SampleStringField
では、渡された文字列を"{}"で囲って返し、 SampleNumberField
では渡された値を2で割った値を返すようにしています。
画面のほうで、実際に動作確認してみましょう。
Gallery.Items
Component1_1.Tabel( Table( {SampleStringField: "a", SampleNumberField: 10, SampleBooleanField: false}, {SampleStringField: "b", SampleNumberField: 50, SampleBooleanField: true} ) )
ちゃんと動いていますね。
テーブルでは、すべてのレコードで定義したフィールドが存在している必要はありません。
ただし、どこかのレコードで少なくとも1つは設定されたフィールドが含まれている必要があります。
これはコレクションを作成したときの動作と同様、対象フィールドが設定されていないレコードはそのフィールドが0や空白、false などとして扱われるからですね。
つまり実際はそのレコードには省略しているフィールドも存在しているというわけです。
動作が不安定?
簡単な使い方は上記でわかりました。
これからは、使用していた中でちょっと動作が怪しいな?と思ったものを纏めました。
なお、冒頭でも述べている通りこれはまだPreview 機能なので修正などの処置が行われる可能性があります。
テーブルの入力フィールドが更新されない
テーブルの入力フィールドを以下のように修正しました。
SampleNumberField
を削除しています。
Table_table
Table({SampleStringField: "SampleText", SampleBooleanField: true})
Table
ForAll( table, { SampleStringField: "{" & SampleStringField & "}", SampleNumberField: 10, SampleBooleanField: SampleBooleanField } )
これに伴い出力も変更しています。
この修正を行ったうえで画面でこのカスタム関数を呼び出している式を修正しましょう。
SampleNumberField
が不要になったので削除します。
すると上記のようにフィールドが異なる旨のエラーが出力されてしまいました。
これは変更が反映されていないのが原因です。
現時点での対策として、カスタム関数を保存し直すという手があります。
説明を適当に修正して保存し直しましょう。
これでも直らなかった場合は、まずはアプリを保存しましょう。
やると不味い行動として、
対象のコンポーネントを削除 -> 再度対象コンポーネントを追加
というのがあります。
これをするとどうなるか?というと以下のようなエラーが表示され、アプリがクラッシュします。(しました)
WebAuthoring abnormal termination. Client date/time: 2021-02-28T10:47:51.149Z Version: 3.21023.28 (v3.21023.28.179268482) Session ID: ed3cfda3-7c17-44c3-948e-67cf1293852e description: {"exception":{"message":"XMLHttpRequest error(string). {\"traceLevel\":3,\"message\":\"An error occurred in Document API document.createcompletecontrol, activity id 572d8111-aa18-4ba1-8aca-e417fa34a389\",\"status\":500}","name":"UnhandledError","isCritical":true,"detail":{"exception":{}}},"error":"[circular]","promise":{"oncancel":null,"nextState":null,"state":{"name":"error","enter":"[function]","cancel":"[function]","done":null,"then":null,"completed":"[function]","error":"[function]","notify":"[function]","progress":"[function]","setCompleteValue":"[function]","setErrorValue":"[function]"},"listeners":null,"value":"[circular]","isException":false,"errorId":16,"done":"[function]","then":"[function]"},"id":16,"setPromise":"[function]"} stack: UnhandledError: XMLHttpRequest error(string). {"traceLevel":3,"message":"An error occurred in Document API document.createcompletecontrol, activity id 572d8111-aa18-4ba1-8aca-e417fa34a389","status":500} at t [as constructor] (https://cdn-paaprodejp.azureedge.net/v3.21023.28.179268482/studio/js/Core.js?v=3.21023.28.179268482:1:205175) at new t (https://cdn-paaprodejp.azureedge.net/v3.21023.28.179268482/studio/js/Core.js?v=3.21023.28.179268482:1:245836) at o.translateError (https://cdn-paaprodejp.azureedge.net/v3.21023.28.179268482/studio/js/AppMagic.WebAuthoring.js?v=3.21023.28.179268482:1:509997) at o.raiseTerminalError (https://cdn-paaprodejp.azureedge.net/v3.21023.28.179268482/studio/js/AppMagic.WebAuthoring.js?v=3.21023.28.179268482:1:509279) at o.unhandledException (https://cdn-paaprodejp.azureedge.net/v3.21023.28.179268482/studio/js/AppMagic.WebAuthoring.js?v=3.21023.28.179268482:1:509192) at o.
(https://cdn-paaprodejp.azureedge.net/v3.21023.28.179268482/studio/js/AppMagic.WebAuthoring.js?v=3.21023.28.179268482:1:507788) at https://cdn-paaprodejp.azureedge.net/v3.21023.28.179268482/studio/js/Core.js?v=3.21023.28.179268482:1:307766 at Object.throw (https://cdn-paaprodejp.azureedge.net/v3.21023.28.179268482/studio/js/Core.js?v=3.21023.28.179268482:1:307872) at u (https://cdn-paaprodejp.azureedge.net/v3.21023.28.179268482/studio/js/Core.js?v=3.21023.28.179268482:1:306691) at Object.q [as notify] (https://cdn-paaprodejp.azureedge.net/v3.21023.28.179268482/studio/openSource/modified/winjs/js/base.js?v=3.21023.28.179268482:2:38070) errorNumber: 0 errorMessage: XMLHttpRequest error(string). {"traceLevel":3,"message":"An error occurred in Document API document.createcompletecontrol, activity id 572d8111-aa18-4ba1-8aca-e417fa34a389","status":500} callStack: UnhandledError: XMLHttpRequest error(string). {"traceLevel":3,"message":"An error occurred in Document API document.createcompletecontrol, activity id 572d8111-aa18-4ba1-8aca-e417fa34a389","status":500} at t [as constructor] (https://cdn-paaprodejp.azureedge.net/v3.21023.28.179268482/studio/js/Core.js?v=3.21023.28.179268482:1:205175) at new t (https://cdn-paaprodejp.azureedge.net/v3.21023.28.179268482/studio/js/Core.js?v=3.21023.28.179268482:1:245836) at o.translateError (https://cdn-paaprodejp.azureedge.net/v3.21023.28.179268482/studio/js/AppMagic.WebAuthoring.js?v=3.21023.28.179268482:1:509997) at o.raiseTerminalError (https://cdn-paaprodejp.azureedge.net/v3.21023.28.179268482/studio/js/AppMagic.WebAuthoring.js?v=3.21023.28.179268482:1:509279) at o.unhandledException (https://cdn-paaprodejp.azureedge.net/v3.21023.28.179268482/studio/js/AppMagic.WebAuthoring.js?v=3.21023.28.179268482:1:509192) at o.(https://cdn-paaprodejp.azureedge.net/v3.21023.28.179268482/studio/js/AppMagic.WebAuthoring.js?v=3.21023.28.179268482:1:507788) at https://cdn-paaprodejp.azureedge.net/v3.21023.28.179268482/studio/js/Core.js?v=3.21023.28.179268482:1:307766 at Object.throw (https://cdn-paaprodejp.azureedge.net/v3.21023.28.179268482/studio/js/Core.js?v=3.21023.28.179268482:1:307872) at u (https://cdn-paaprodejp.azureedge.net/v3.21023.28.179268482/studio/js/Core.js?v=3.21023.28.179268482:1:306691) at Object.q [as notify] (https://cdn-paaprodejp.azureedge.net/v3.21023.28.179268482/studio/openSource/modified/winjs/js/base.js?v=3.21023.28.179268482:2:38070)
他操作も私が確認できていないだけで、やると不味いことが多々ありそうなので、保存するなりで対策しましょう。
また、修正した入力パラメータを元に戻しておくのもよさそうですね。
恐らく裏で不正なデータ扱いされていて非常に不安定な状態だと思いますので。。。
なおこの問題は型:レコードでは確認できませんでした。
型が勝手にテーブルからレコードに変更される
仕様??わからないですが、事実としての動作を記しておきます。
パラメータをテーブルではなくレコードにしてみます。
Table_tabel
{SampleStringField: "SampleText", SampleBooleanField: true}
このカスタム関数を呼び出している箇所を確認してみると以下エラーが表示されています。
対象カスタム関数のパラメータをみてみると、以下のようにテーブル -> レコードに型が変わっています。
仕様??型解決してくれてる??(正直余計な事しないでほしい)
ただ、逆に入力項目の型:レコードの項目にテーブルを設定しようとすると、上記のようなエラーが出力されるので、恐らく、型:テーブルを設定しているにも関わらずレコード型を設定できることがよくないんでしょうね。
型:テーブルを設定した際の入力パラメータの型チェックに漏れがあるのですかね。
実際のソースみることができないので憶測になりますが、そんな感じがします。
おわりに
冒頭でも述べている通り、カスタム関数の作成はPreview 機能なので今後機能が変更になることがあります。
また、なにか誤っていたりした場合は教えていただけると助かります。