Power Automate Desktop  の変数（4）「ブール型」

## 概要  

Power Automate Desktop(以下PAD) の変数についての記事4回目「ブール型」です。「変数の設定」アクションを使用することで複雑な条件をわかりやすく記述できます。
PADのベース言語[Robinのドキュメント](https://robin-language.org/)を参考に試したものをまとめています。コードはPADにコピペで試せます。

## 目次

1. [概要、数値型](https://qiita.com/sys_zero/items/13e06a41834cf40988ea)
2. [テキスト型](https://qiita.com/sys_zero/items/0f5b54dd4dbbf0d31e71)
3. [Datetime型](https://qiita.com/sys_zero/items/7804ffffea5b244c46c4)
4. **[ブール型](https://qiita.com/sys_zero/items/68deda047c4b50c66458)**<今回の記事>
5. [リスト型](https://qiita.com/sys_zero/items/82951049466791b2b728)
6. [データテーブル型](https://qiita.com/sys_zero/items/171d73ba24e123dd1b66)
7. [カスタムオブジェクト型](https://qiita.com/sys_zero/items/6006ab42e2af60c170b5)

## 注意

- すでに使いこなしているかた向けの記事ではありません。
- Robin言語はあくまでベースであるためPADと異なる部分があります。
- この記事の内容はすべて試していますが公式の見解とは異なる可能性がありますのでご注意ください。
- Power Automateクラウドフローの入出力変数については触れていません。
- 2021年2月の記事です。
- あくまでも個人のまとめです。
- 誤りがありましたらコメントでご指摘いただけると幸いです。
- Robinの公式サイトは2021年4月30日に終了しました。

## ブール型変数について  

ブール型変数は比較演算、論理演算から返されるブール値TrueまたはFalseが代入される変数です。
条件アクションで使うことが多いですがあらかじめ変数にすることで複雑な条件もわかりやすくできます。
「変数の設定」アクションでは宛先内に判定したい条件を%で囲い設定します。

### 比較演算  

比較演算とは比較演算子を使って2つの値を比べます。同じ型どうしで行います。

| 比較演算子    | 呼び名     | True(真）の条件                    |
|---------|---------|--------------------------|
| =       | 等価      | 左オペランドと右オぺランドが等しければTrue  |
| <>      | 不等価     | 左オペランドと右オぺランドが不一致ならばTrue |
| >       | 大なり     | 左オペランドが右オぺランドより大きければTrue |
| >=      | 大なりイコール | 左オペランドが右オぺランド以上ならばTrue   |
| <       | 小なり     | 左オペランドが右オぺランドより小さければTrue |
| <=      | 小なりイコール | 左オペランドが右オぺランド以下ならばTrue   |

「変数の設定」アクションでは他にin,not inがリスト型に使えます。Robinのドキュメントでは比較演算子に列挙されていますが、リスト型のときにあらためて記載します。

#### 数値の比較

![2021-02-14-22-42-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/3210f8c3-eb82-92ff-4b48-af0ae55531cb.png)

![2021-02-14-22-42-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/73db6e80-fd36-a11f-4f30-af0c75a6325c.png)

![2021-02-14-22-48-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/231f4677-ad1a-c5f2-8056-15dd5ef2df47.png)

![2021-02-14-22-48-30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/0cf76b8b-6e52-d723-acb6-67cd5e2e9ce0.png)

#### datetime値の比較

![2021-02-14-22-55-55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/54a0e7f8-96b5-52eb-74e8-e1655649ce76.png)


#### テキスト値のLengthプロパティの比較

![2021-02-14-22-57-43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/9046f219-e074-32af-bfd2-b349d6d1e60a.png)


#### テキスト値の比較

アルファベットはA＜Zの順位を持っています。
![2021-02-14-23-04-49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/91fb5cd0-9969-9013-ae60-5f3b2b84e48d.png)

## 論理演算  

比較演算の条件を論理演算で複合できます。
返す値はTrueまたはFalseのみです。
論理演算子

| 論理演算子 | 呼び名    | True(真）の条件                       | 覚え方      |
|-----|--------|---------------------------|----------|
| AND | 論理積    | すべての条件が満たされるときTrue        | かつ       |
| OR  | 論理和    | 複数条件から1つの以上条件が満たされるときTrue | または      |
| XOR | 排他的論理和 | 2つの条件のうち1つだけが満たされるときTrue     | どちらか1つだけが |
| NOT | 論理否定   | 条件を満たさないときTrue       | でない      |

### 論理積　AND

複数の条件すべてが真のときTrueを返します。

![2021-02-15-21-01-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/8e58b9bd-2dc2-b5aa-eb30-d49e38737d34.png)

![2021-02-15-21-01-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/d7ee1e05-3b72-d3ed-3045-648f16be26c8.png)


ブール型変数も条件にできます。

![2021-02-15-21-03-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/6dfcb89f-3c39-7298-1761-956121c6b467.png)

![2021-02-15-21-04-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/d2901d7c-a0a3-2a11-98ba-2394e71988f4.png)


### 論理和　OR

複数の条件のうち、いずれかが真のときTrueを返します。
![2021-02-17-18-05-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/346d51a1-6be8-1833-02e6-181c1a3cc6e0.png)

![2021-02-17-18-06-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/b5c03cd4-1ae8-fa4d-5e7d-c0ccb217681e.png)


### 排他的論理和　XOR

2つの条件うち片方だけが真のときTrueになります。両方Trueまたは両方FalseのときはFalseです。
![2021-02-17-20-49-51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/57f7b1a6-54f5-7fbe-2f63-550cea6690e0.png)

![2021-02-17-20-50-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/6773d65e-fe69-ebd6-a103-f5fece97cdc9.png)


### 論理否定　NOT

単一条件の否定が成立するときTrueになります。
「7は5より小さい」を否定→「7は5より小さくない」
![2021-02-17-20-57-28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/394dcf6b-1899-e82c-4944-d0adfb4eca34.png)

![2021-02-17-21-00-42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/9a53c1a0-18a2-60f7-d266-37bf2cbfa9af.png)


## 複数条件を変数にして可読性を上げる  

PADに限らず次例のような複雑な条件をみたことないでしょうか。あるいはIF文が不要に入れ子になっている表記を。読めなくはないですが他人に読んでもらうのも時間がかかるし、何より自分自身が混乱して間違えやすくなります。
![2021-02-17-22-21-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/24e0bfe6-321b-3183-b1f3-d85771e491b3.png)


PADの場合は「変数の設定」アクションをつかうと複雑な条件も可読性がよくなります。1つ1つの条件を変数に設定してIFの前に外だしするだけで、とてもすっきりします。

15日以降
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/7745d6bf-ac8e-78d2-02da-c0e0e3c08d50.png)


2月または4月
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/b6e7eb66-f639-2789-b805-caad25100bab.png)



日曜日でない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/2963631b-dc43-8878-7590-9c5b375e4c6c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/adca9a74-200e-114a-a771-22366fbffb25.png)



アクション数は増えますが、だいぶ読みやすくなったのではないでしょうか。
また条件の内容を変数名にしておくことでどのような判定をしていているのかわかりやすく、条件の変更がも容易になります。

## 今回のコード  

```
SET boolvar TO 3 = 3
SET boolvar2 TO 3 <> 4
DateTime.GetCurrentDateTime.Local DateTimeFormat: DateTime.DateTimeFormat.DateAndTime CurrentDateTime=> CurrentDateTime
SET datetime TO D'2021/02/25 00:00:00'
SET boolvar3 TO CurrentDateTime > datetime
SET Text TO $'''ABCDEFGH'''
SET boolvar4 TO Text.Length >= 6
SET boolvar5 TO Text[2] < 'D'
SET boolvar6 TO CurrentDateTime.DayOfWeek <= datetime.DayOfWeek
SET LogiVar TO 3 = 3 AND 2 = 1
SET LogiVar2 TO boolvar AND boolvar2
SET LogiVar3 TO 'D' <> 'D' OR 'E' < 'J'
SET LogiVar4 TO 4 > 3 XOR 6 < 5
SET LogiVar5 TO NOT 7 < 5
IF (CurrentDateTime.Day >= 15 AND (CurrentDateTime.Month = 2 OR CurrentDateTime.Month = 4) AND NOT CurrentDateTime.DayOfWeek = 'Sunday') = True THEN
    Display.ShowMessageDialog.ShowMessage Title: $'''PA4d''' Message: $'''変数のテスト''' Icon: Display.Icon.None Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: False ButtonPressed=> ButtonPressed
END
SET IsDayGt15 TO CurrentDateTime.Day > 15
SET IsMonthAprOrFeb TO CurrentDateTime.Month = 2 OR CurrentDateTime.Month = 4
SET IsWeekOfDaySunday TO NOT CurrentDateTime.DayOfWeek = 'Sunday'
IF (IsDayGt15 AND IsMonthAprOrFeb AND IsWeekOfDaySunday) = True THEN
    Display.ShowMessageDialog.ShowMessage Title: $'''PA4d''' Message: $'''変数のテスト''' Icon: Display.Icon.None Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: False ButtonPressed=> ButtonPressed
END
```

## 今回のまとめ

複雑な条件を記述する場合、変数をつかった方法は効果が高いのでオススメです。

## 参考

[Robin - RPA language](https://robin-language.org/)