はじめに
Power AppsのPreview機能にユーザー定義関数(UDF)が追加されました!
今回はこちらのユーザー定義関数について記載しています。
なおまだPreview機能ですので、今後変更になる可能性があります。
前提条件
こちらのユーザー定義関数を利用するには、Power Appsの作成バージョンが"3.24013.14"以上である必要があります。
設定 > サポート > 作成バージョン
より、変更が可能です。
また、ユーザー定義関数を利用するためには、"新しい分析エンジン"も有効化する必要があります。
こちらは
設定 > 近日公開の機能 > 試験段階
より、有効化することができます。
"ユーザー定義関数"も同様に
設定 > 近日公開の機能 > 試験段階
から有効化できます。
有効化後アプリを再読み込みする必要があります。
ユーザー定義関数の使い方
ユーザー定義の作成方法
ユーザー定義関数は"App"の Formulas
に記載します。
関数を作成する際は、以下のような構文で作成します。
<関数名>(<パラメータ名>:<パラメータの型>):<関数の型> = 式;
実際の例を見てもらった方がわかりやすいかもです。
ということで以下DAX関数にある PDURATION
関数を作成します。
この関数は以下のような財務関数です。
投資が指定された値に到達するまでに必要な期間数を返します。
早速作成してみると、以下のようになります。
PDURATION(rate:Number, pv:Number, fv:Number):Number = (Log(fv) - Log(pv)) / Log(1 + rate);
式の最後にはセミコロン";"が必要な点に注意してください。
"型"に指定可能な型の種類は現在10種類あります。
テーブルやレコードは指定できないようですね。
ユーザー定義関数を利用する
作成したユーザー定義関数を呼び出す際は以下のように利用します。
PDURATION(0.025, 2000, 2200)
通常の関数利用と同じですね。
Tips
複数のユーザー定義関数の作成
ユーザー定義関数は複数作成することも可能です。
複数のユーザー定義関数を作成したい場合は、セミコロン区切りで作成してあげればよいです。
"UntypedObject"に値を渡す
"UntypedObject" なパラメータに対して値を渡したい場合は ParseJSON
関数を利用します。
例えば以下のようなユーザー定義関数を作成したとします。
UntypedObject(val:UntypedObject):Number = val;
パラメータの "val" を "UntypedObject" に指定しています。
この関数に対して、普通に(?)値を渡すと以下のような型エラーが発生します。
現在Power AppsでUntypedObject型の値を作成するには ParseJSON
関数を利用する必要があります。
これで "UntypedObject" に対して値を渡すことができるようになります。
Table型のデータを渡す
先ほどの "UntypedObject" を活用すればテーブルも渡すことができます。
以下のような式を記載することで、"UntypedObject" であるが中身としてはテーブル形式のデータを作成することができます。
ParseJSON("[3, 2, 6, 6, 4, 5]")
このようにすればテーブル型のデータもユーザー定義関数に含めることができます。
例えば以下のような中央値を求めるユーザー定義関数をみてみましょう。
Median(values:UntypedObject):Number = Index( Sort( ForAll( Table(values), Int(ThisRecord.Value) ), Value ), RoundUp(CountRows(Table(values)) / 2, 0) ).Value;
上記のように受け取った値を Table
関数を利用して、Table型に変換してあげればTableデータも利用できるようになります。
ただし、これで型変換を行っても中の値は "UntypedObject" のままなので注意してください。
この制限があるので、Sortを行う前にForAllでテーブル内の値に対して型を明示的に設定しているわけです。
できないこと
式には動作関数を含めることができません。
例えば Patch
関数や Collect
関数などは設定できないということですね。
カスタムコンポーネントとの違い
Power Appsでは以前からカスタムコンポーネントでプロパティの型に関数を指定することでカスタム関数を作成することができました。
カスタムコンポーネントってなに?という方は去年の資料なのでちょっと古いですが、M365VMで登壇した資料をみてみてください。
ユーザー定義関数とカスタムコンポーネントの違いを書き出すと以下ですかね。
データ型
パラメータに利用できるデータ型の種類に差異があります。
ユーザー定義関数
カスタムコンポーネント
ユーザー定義関数は返される値のデータ型とパラメータに設定可能なデータ型が同じなのに対し、カスタムコンポーネントは異なります。("画面"が増えてる)
ユーザー定義関数
カスタムコンポーネント
パラメータの設定方法
カスタムコンポーネントでは以下のようにパラメータをGUI操作で1つずつ設定していきます。
たいしてユーザー定義関数は式を記載するだけで簡単に設定できます。
まぁ、カスタムコンポーネントの設定方法の方が後から見たときに比較的わかりやすい。という見方もできますけどね。
あとは、カスタムコンポーネントだとパラメータの説明を記載でき、また必須かオプションかも設定が可能です。
対してユーザー定義関数はこれらができません。(まだ実装されていないのか、私がやり方理解できていないだけなのかわかりませんが。。。)
カスタム関数の共有
カスタムコンポーネントはコンポーネントを公開して共有すれば、そのコンポーネントの中身を再開発しなくとも、またコンポーネントの中身の処理を理解していなくとも、他のユーザーも利用することができます。
対して、ユーザー定義関数はそもそも共有する術がありません。
共有するとすれば、作成したカスタム関数をコピペで共有するぐらいですね。
おわりに
こちらの機能はPreview機能なので、本番環境で利用する際は自己責任になりますのでご注意ください。