動画でも解説しました
With関数とは
公式サイトの説明を読んでも、正直よく分かりません。
私は「ForAll関数内や非動作プロパティ内でも、変数を作成して計算できる関数」として理解しています。
ForAll関数内では、Set関数やUpdateContext関数が使えません。
また、Textプロパティなどの非動作プロパティ内でも変数が使えません。
With関数はそういった関数やプロパティ内でも、変数を使用したいときに重宝する関数です。
記述方法
With関数の記述方法はこちら
With({変数名:数式},変数を使用した計算式)
↑第1引数に波括弧{}で変数を設定して、第2引数で変数を使用した計算式を記述します。
With({X:1},X+2)
↑こちらは記述例ですが、Textプロパティに記述すると、結果の3が表示されます。
With({X:1,Y:3,Z:5},X+Y+Z)
↑このように「,」区切りで複数の変数を設定することができます。
はじめはどう記述したら良いか迷います。
とりあえず「波括弧で変数を設定」と覚えましょう。
使いどころ1 非動作プロパティ内
With関数の便利なところは、数式で繰り返し同じような記述をしなければならないときに便利です。
If(Checkbox1_1.Value,
Distinct(
Table(
ForAll(Filter(test_list1,user_mail=Dropdown1_1.SelectedText.Value),user_mail),
ForAll(Filter(test_list1,user_mail=Dropdown1_1.SelectedText.Value),user_name),
ForAll(Filter(test_list1,user_mail=Dropdown1_1.SelectedText.Value),memo)
),
Value
)
,
Table(
ForAll(Filter(test_list1,user_mail=Dropdown1_1.SelectedText.Value),user_mail),
ForAll(Filter(test_list1,user_mail=Dropdown1_1.SelectedText.Value),user_name),
ForAll(Filter(test_list1,user_mail=Dropdown1_1.SelectedText.Value),memo)
)
)
↑このように何度もFilter関数で記述しているコードでも
With({
col_list:Filter(test_list1,user_mail=Dropdown1_1.SelectedText.Value)
},
With({
col_table:
Table(
ForAll(col_list,user_mail),
ForAll(col_list,user_name),
ForAll(col_list,memo)
)
},
If(Checkbox1_1.Value,
Distinct(col_table,Value),
col_table
)
)
)
With関数を使うことで、Filter関数は1か所で済みます。
ForAll関数についても半分に抑えられていますね。
使いどころ2 ForAll関数内
ForAll関数内の繰り返し処理の中で使用する機会が結構あります。
たとえば、リストが2つあって、リストからコレクションを作成する際に、LookUp関数などで該当する値をもう1つのリストから追加する際にうまく追加できない場合があります。
Clear(col_maillist);
ForAll(test_list2,
Collect(col_maillist,
{
mail:user_mail,
user:user_name,
app_id:LookUp(appID,user_mail=user_mail).app_id
}
)
)
このように書いてメールアドレスで検索してapp_idをコレクションに追加するコードを書いたとします。
問題となるのはapp_id:LookUp(appID,user_mail=user_mail).app_id
この部分で、app_idは[[エラー]]になってしまいます。ThisRecord.user_mailと書いてもうまくいきませんでした。
そういう時に
Clear(col_maillist);
ForAll(test_list2,
With({_mailad:user_mail},
Collect(col_maillist,
{
mail:user_mail,
user:user_name,
app_id:LookUp(appID,user_mail=_mailad).app_id
}
)
)
)
このようにWith関数で変数を設定することで、列名の競合を回避することができます。
With関数を使用するメリット
ForAll関数内や非動作プロパティ内で使用できるのが最大のメリットですが、
コードが綺麗にまとまることや、繰り返し処理が減ることで処理速度の向上にもつながります。
実際に、With関数無しと有りで比べたところ、1秒近く差が出ました。