条件アクションに指定した値はどの型として扱われるのか
Power Automate にはデータ型の概念が一応ありますが、分かりやすさのためか条件アクションにおいて、値を設定したときにどんな型で扱われるのか不明確なインターフェースになっています。
例えば
-
整数変数 Int と 整数値 10 がイコールであるかを判定する
このケースは正しく判定でき、変数に 10 が入っていれば「はいの場合」に進みます。 -
文字列変数 Str と 文字列 "こんにちは" がイコールであるかを判定する
これも正しく動作するでしょう。しかし・・・ -
文字列変数 Str と 文字列 "10" がイコールであるかを判定する(半角の数値を文字列として判定したい)
このような時、
のようにしてしまうと、正しく判定できません。
正しくは、
のように指定してあげる必要があります。
しかも、保存して開きなおすと敢えて入れたダブルクォーテーションは画面上からは消え去ります。(2022年12月現在。この仕様は本当に良くないと思います・・・)
なお、シングルクォーテーションでの指定はNGです。シングルクォーテーションも文字列の一部として扱われてしまいます。
これらは、条件アクションが画面上で入力された値の内容から型推論していることから発生しているものと思います。
本稿では、初心に立ち返ってPower Automateの条件アクションにおける型推論の結果について改めて整理してみました。
結果
検証ベースで試してみて、いくつかのパターンに整理してみました。
以下4列の表でまとめています。
- 期待する型
→ 指定した値をどの型で判定してほしいか - 実際に指定する例
→ 条件アクションの入力ボックスに指定する値 - 推論される型
→ 指定した値が実際に取り扱われる型 - フロー定義に書き込まれる値
→ フロー定義(JSON)としてどのように定義されるか(末尾に補足)
あまり意識せずにそのままいけそうなパターン
期待する型 | 実際に指定する例 | 推論される型 | フロー定義に書き込まれる値 |
---|---|---|---|
整数値 | 10 | 整数値 | 10 |
浮動小数点数値 | 3.14 | 浮動小数点数値 | 3.14 |
文字列 | こんにちは | 文字列 | "こんにちは" |
文字列 | "こんにちは" | 文字列 | "こんにちは" |
文字列 | 10 ※全角数字 |
文字列 | "10" |
真偽値 | true | 真偽値 | true |
真偽値 | false | 真偽値 | false |
意識しないとハマる可能性のあるパターン
期待する型 | 実際に指定する例 | 推論される型 | フロー定義に書き込まれる値 |
---|---|---|---|
整数値 | 10 ※全角数字 |
文字列 | "10" |
浮動小数点数値 | 3.14 ※全角数字 |
文字列 | "3.14" |
文字列 | 'こんにちは' | 文字列 | "'こんにちは'" |
文字列 | 10 | 整数値 | 10 |
文字列 | "10" | 文字列 | "10" |
真偽値 | True | 文字列 | "True" |
真偽値 | TRUE | 文字列 | "TRUE" |
真偽値 | False | 文字列 | "False" |
真偽値 | FALSE | 文字列 | "FALSE" |
補足:フロー定義に書き込まれる値 について
フローの中身はJSONで定義されていますが、条件アクションに指定した値がどのように推論されたかを確認するためにフロー定義を確認しました。今回は簡易的に、アクションのコピー機能を用いて確認しています。
上記のようなアクションのフロー定義を確認すると(↓)、
operationDefinition.expression.equals の2要素目が "'10'" となっていることが確認できますね。
{
"id": "XXXXXXXXXXXXXXXXXX",
"brandColor": "#484F58",
"connectionReferences": {},
"connectorDisplayName": "制御",
"icon": "XXXXXXXXXXXXXXXXXX",
"isTrigger": false,
"operationName": "条件",
"operationDefinition": {
"type": "If",
"expression": {
"equals": [
"@variables('Str')",
"'10'"
]
},
"actions": {},
"runAfter": {
"変数を初期化する": [
"Succeeded"
]
},
"metadata": {
"operationMetadataId": "XXXXXXXXXXXXXXXXXX"
}
}
}
今回の内容は、あくまでも条件アクションについてまとめたものです。
特に、数式において条件式で文字列を扱う際には、文字列リテラルとしてシングルクォーテーション(')を利用する必要があるので、混同しないように注意してください。