はじめに
PowerFx がオープンソースとして公開され、独自のアプリに PowerFx を組み込むことができるようになりました。
この記事では、PowerrFx で実際にどのようなことができるかを VSCode の拡張機能である .NET Interactive を使って確認して行きます。
プログラムからの PowerFx の利用
たとえば C# であれば、アプリに次の 2 つのパッケージを追加するだけで、PowerFx の実行エンジンを実体化させプログラム中で PowerFx の式を評価することができます。
この機能を使った PowerFx の対話型アプリのサンプルは power-fx-host-samples として GitHub に公開されています。
❯ dotnet new console
❯ dotnet add package Microsoft.PowerFx.Core --prerelease
❯ dotnet add package Microsoft.PowerFx.Interpreter --prerelease
using Microsoft.PowerFx;
var engine = new RecalcEngine();
var result = engine.Eval("Sum(1, 2, 3)");
Console.WriteLine(result.ToObject());
❯ dotnet run
6
VSCode + .NET Interactive + PowerFx
VSCode の .NET Interactive 上で動作する PowerFx の拡張機能は PowerFx.NET.Interactive という NuGet ライブラリとして公開されています。動作させるには、README 従い VSCode の.NET Interactive 拡張と、DataTable 拡張を有効にします。
.NET Interactiveで作業をするためにノートを作成しましょう。
新しい .NET Interactive のノートを作成する場合は、Ctrl
+Shift
+Alt
+N
でノートを作成します。もしくはコマンドパレットから .NET Interactive: Create new blank notebook
を実行してもよいです。
作成するノートの拡張子は .dib
でも .ipynb
でもどちらでも大丈夫です。言語は C#
を選択してください。
ノートが作成されたら、まずは PowerFx のカーネルを NuGet から取得してインストールします。
#r "nuget: PowerFx.NET.Interactive, 0.0.9.7"
現時点のバージョンではこれらの組み込みの数式に対応しているようです。
詳細については、PowerApps の Formula reference を参照してください。
Abs, AddColumns, And, Average, Average, Blank, Concat, Coalesce, Char, Concatenate, CountIf, CountRows, Date, DateAdd, DateDiff, DateValue, DateTimeValue, Day, EndsWith, Exp, IsBlank, IsError, IsToday, If, IfError, Int, Filter, First, FirstN, ForAll, Hour, Last, LastN, Left, Len, Ln, Log, Lower, Max, Max, Mid, Min, Min, Minute, Mod, Month, Not, Now, Or, Power, Replace, Right, Round, RoundUp, RoundDown, Second, Sequence, Sort, StartsWith, Sum, Sum, Split, Sqrt, Substitute, Switch, Table, Text, Time, TimeValue, Today, Trim, TrimEnds, Trunc, Upper, Value, With, Year
PowerFx の式を実行する場合は、#!powerfx
でカーネルを指定して実行します。例えば、records
という変数にテーブルを読み込み、Value が 40 より大きいものを昇順でソートした 1 件目を表示するとしたら次のような式になります。
#!powerfx
ClearCollect(records, Table(
{ Id: 1, Name: "Hoge1", Value: 1 },
{ Id: 2, Name: "Hoge2", Value: 13 },
{ Id: 3, Name: "Hoge3", Value: 44 },
{ Id: 4, Name: "Hoge4", Value: 43 }
));
Upper(First(Sort(Filter(records, Value > 40), Value)).Name)
また、変数に式を設定するとその値は追跡されそれを参照している変数は自動的に再計算されていることも確認できます。
#!powerfx
Set(val1, 1);
Set(val2, val1 + 2);
val3 = val1 + 2;
Set(val1, 2);
val2;
val3;
おわりに
PowerFx 自体は Power プラットフォーム上ではすでに利用可能で、今後 PowerAutomate などに移植されるとさらに利用用途が広がり面白くなりそうな機能です。
.NET Interactive の拡張機能はプレリリース版なので、動作が若干怪しい部分もありますが簡単に試してみるには面白と思うので気になる人は触ってみると良いと思います。