広まってほしいPower Appsの関数 - Coalesce関数

# はじめに
Power Appsの関数は、非常にExcelと似通っており、**Excelの基礎知識さえあれば、とっつきやすいところが魅力的です。**
Excelの条件分岐の中でも、代表的なのが`IF`関数。

`IF`で条件に合致するか、しないかで値を判断できるため、シンプルで習得しやすい側面があります。
`Power Apps`も、`IF`関数が同様に存在し、条件分岐が再現できますが、`IF`関数は関数が冗長的になり、
可能であれば避けたいところです。

関数のボリュームが大きくなってしまい、見づらいということも度々あります。
なるべく美しく関数を表現する、その自分自身の特訓もかねて、便利な関数を紹介します。

今回は[Coalesce関数](https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-isblank-isempty#coalesce)がテーマです。

https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-isblank-isempty#coalesce

# [Coalesce 関数](https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-isblank-isempty#coalesce)
> Coalesce 関数はその引数を順番に評価し、空白または空の文字列ではない最初の値を返します。
>> [Microsoft Learn](https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-isblank-isempty#coalesce)より

早い話が、`If( !IsBlank({値}), {値}, {そのほかの値} )`の代替となります。

比較として、`テキスト ラベル`に、
 1. 入力するテキスト欄が空白の場合、本日の日付 `Today()`
 1. そうではない場合、赤枠で選択された日付 `DatePick.SelectedDate`

という条件式を設定してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/2749f2f4-e0ff-e503-8b64-9d319a1697ca.png)


## 比較

```diff_javascript:OnSelect
- If( !IsBlank(DatePick.SelectedDate), DatePick.SelectedDate, Today())
+ Coalesce( DatePick.SelectedDate, Today())
```

[Coalesce 関数](https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-isblank-isempty#coalesce)と`If 関数`の場合、関数のボリュームが抑えられ、読みやすい印象を受けます。

:::note info
自分自身、If関数ゴリ押しを乱発している背景もあり、感動的な比較となりました。
:::

## 値が設定されていない場合、空白を返す
[Coalesce 関数](https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-isblank-isempty#coalesce)の必要最低限の引数は、一つです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/f10532ab-46ce-8c66-d2a3-8d6b2971828e.png)

画像のように、`DatePick`が未選択の場合、`空白`を返します。

### `空白`に対して、JSON関数を使用した場合

コンテキスト変数　`evalJSON` という名前で`JSON オブジェクト`を作成し、Power Automateで空白を評価します。

```javascript:OnSelect
// コンテキスト変数　`evalJSON` という名前で`JSON オブジェクト`を作成
UpdateContext(
    {
        ReturnValue: Coalesce(DatePick.SelectedDate),
        evalJSON: JSON({varDate: DatePick.SelectedDate})
    }
);

// Power Automateで評価
ValueInPowerAutomate.Run(evalJSON);
```

`JSON 関数`の結果でJSON文字列として評価された結果、`null`となりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/1d24623a-2a2a-b88c-fb93-988730ec8eac.png)


Power Automateで`JSON の解析`を実施した場合でも、`null`と評価されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/2744e233-b444-06ec-dc3a-79a9e96ab1c6.png)

個人的には、うまい具合に評価してくれるという印象。

### Coalesce関数における`""`の取り扱い
`""`ダブルクオーテーションで囲んだ空白文字列の評価は、どうなるでしょうか。

```javascript:OnSelect
UpdateContext(
    {
        ReturnValue: Coalesce("")
    }
);
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/630e1570-155c-4cc4-b441-cb93b59aade0.png)

`null`のようですね。
`=`で、`Coalesce`関数と""の比較を行ってみます。

```javascript:OnSelect
// 1. Coalesce関数と""の比較
UpdateContext(
    {
        ReturnValue: Coalesce("")
    }
);
// 2. 比較演算子
UpdateContext({CompareValue:(ReturnValue="")});

// 3. 結果 falseになる
Notify(CompareValue)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/824cb9cd-10a5-bd3d-4c7e-bd70c3c1fd1d.png)

`CompareValue`が結果ですが`false`となっています。
つまり`Coalesce`関数の中で`""`は`null`もとい[Blank()](https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-isblank-isempty#blank)と同じ意味になります。

## 活用
`null`または`""`以外の値を順番に返していく、ということなので、下記のように取り扱えます。

```
Coalesce(
    優先したい値1,
    優先したい値2,
    優先したい値3,  
)
// 該当しない場合は空白を返す
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/91775c2e-e3d4-a5dc-40f4-4ea55708d408.png)

上から順番にコントロールを並べると

```javascript:Text
Coalesce(
    DatePick1.SelectedDate,
    DatePick2.SelectedDate,
    DatePick3.SelectedDate,
    DatePick4.SelectedDate,
    DatePick5.SelectedDate
)
```
最初の空白でない値を表示します。
もちろんコントロール以外の値も使えるので、**`IsBlank`との比較とはサヨナラできる！ということです。**

```diff_javascript:差分
- If(
-     !IsBlank(DatePick1.SelectedDate), DatePick1.SelectedDate,
-     !IsBlank(DatePick2.SelectedDate), DatePick2.SelectedDate,
-     !IsBlank(DatePick3.SelectedDate), DatePick3.SelectedDate,
-     !IsBlank(DatePick4.SelectedDate), DatePick4.SelectedDate,
-     !IsBlank(DatePick5.SelectedDate), DatePick5.SelectedDate,
-     Blank()
- )

+ Coalesce(
+     DatePick1.SelectedDate,
+     DatePick2.SelectedDate,
+     DatePick3.SelectedDate,
+     DatePick4.SelectedDate,
+     DatePick5.SelectedDate
+ )
```

文章量が全然違う！リーダブル！

# 終わりに
[Qiita記事投稿キャンペーン](https://qiita.com/official-campaigns/engineer-festa/2024#posting-marathon)ということで、ライトなところからサクっといってみました。

https://qiita.com/official-campaigns/engineer-festa/2024#posting-marathon

改めて自分のナレッジの棚卸！ということで書いていきたいと思います。
今後ともお楽しみに！