エクスプレッション
このセクションでは、Desktop Automation のエクスプレッションおよびその編集方法や評価方法について説明します。
Desktop Automation ステップのプロパティの多くは、プレーン値 (たとえば、数値) またはエクスプレッションとして指定することもできます。エクスプレッションは評価され、この評価の結果は、プレーン値がプロパティの値として直接利用されるプロパティに対して用いられます。たとえば、クリック ステップのカウント プロパティには 2 などの数値を指定できますが、clickCount がステップの範囲で定義された変数となる、Desktop Automation ワークフローの他の場所に値が与えられる clickCount などのエクスプレッションとして指定することもできます。
Desktop Automation のエクスプレッションは、Java、C#、JavaScript などの一般的なプログラミング言語のエクスプレッションと非常によく似ています。これらのエクスプレッションは、定数、変数、演算 (加算、減算、乗算、比較演算、論理演算など)、および関数で構成されています。エクスプレッションの例を以下に示します:
-
(1 + 2)*3
-
x > 0 || x <= 6
-
max(x, 10)
-
"hello".substring(3)
エクスプレッションにはタイプが追加され、これらのタイプは変数と同じとものとなります。つまり、演算と関数は特定のタイプのオペランドにしか適用されないことを意味します。オペランドの型によっては、評価されるときに特定の型の値を返します。たとえば、整数タイプの 2 つのオペランドを加えると、1 + 2 のように整数タイプの結果が得られ、3 と評価されます。オペランドのタイプが数値の場合は結果が数値タイプとなり、たとえば 1.0 + 2.0 は、3.0 と評価されます。エクスプレッションが評価されて Desktop Automation ワークフローでのエラーとしてそのタイプ エラーが報告される前に、エクスプレッションのタイプの静的なチェックが行われます。
エクスプレッションの評価によってワークフローの状態が変わることはありません。つまり、ユーザーはエクスプレッションの中の変数に値を割り当てることはできません。変数に値を割り当てることができるのはステップだけです。たとえば、変数割り当て ステップによって変数に値が割り当てられ、この値はエクスプレッションの評価から得られたものとなります。
次のセクションでは、エクスプレッションのさまざまなコンポーネントについて説明します。
- 定数
- 定数は以下の簡単なタイプの値になります。
タイプ
例
整数
42
-17
数値
3.14159
-.33
ブール値
TRUE
FALSE
テキスト
"Hello"
"First"
テキスト値が終了してしまうため、テキスト値に二重引用符 (") を含めることはできません。代わりに、テキスト値に二重引用符が必要な場合には \" を使用します。バックスラッシュ記号 (\) は通常、エクスプレッションで直接記述できないテキスト値の特殊文字に用います。特殊文字:
文字
説明
\n
改行
注 Desktop Automation の組み込みブラウザで改行を使用するには、以下を使用します:\r\n
\r
キャリッジ リターン
\f
フォーム フィード
\"
二重引用符
\t
タブ
\b
バックスペース
\\
バックスラッシュ文字自体
\uXXXX
コード化された 16 進数の Unicode 文字。たとえば 「\u002A」 は、「*」の別の表記です。
- 変数
- エクスプレッションの変数は、エクスプレッションのロケーションでスコープ内のワークフローに定義された任意の変数または入力パラメータとなります。入力パラメータのスコープはワークフロー全体となるため、そのパラメータは常にスコープ内となります。ワークフローの最上位レベルで定義されている場合、または グループ ステップ 内にある場合、変数はスコープ内となります。
- 演算
- 演算は、演算子と複数のオペランドから構成されるエクスプレッションです。1+2 というエクスプレッションでは、+ が演算子で、1 と 2 がオペランドです。したがって、演算子は、エクスプレッションが評価されるときにオペランドの値に対して実行される演算を定義します。このセクションでは、エクスプレッションで発生する演算子について説明します。ほとんどの場合、これらの演算子が実行する演算は複雑ではありません。プログラミング言語のエクスプレッションに詳しい場合は、この説明を省略して、以下のサマリーテーブルを参照してください。
- 算術演算
- エクスプレッションは、加算 (+)、減算 (-)、乗算 (*)、除算 ( / )、およびモジュロ (%) に対応しています。各演算は、整数タイプと数値タイプの任意の組み合わせを持つことができる 2 つのオペランドを取ります。オペランドに 1 つ以上の数値タイプが含まれている場合、結果タイプも数値になります。それ以外の場合は整数タイプになります。
加算演算 (+) を用いるとき、オペランドの 1 つがテキストで、もう 1 つのオペランドが整数、数値、ブール タイプまたはテキスト タイプの場合、結果タイプはテキストになります。たとえば、"a" + 1 は、テキスト "a1" と評価されます。テキスト タイプではないオペランドの値がテキストに変換され、2 つのオペランドの値が結果のテキストに連結されます。減算演算 - は、x が整数タイプまたは数値タイプで -x のように、数値の否定として用いることもできます。演算子 % はモジュロ演算子、または剰余演算子と呼ばれます。この演算子は 2 つのオペランドを除算した後の余りを返します。たとえば、5 % 2 は 1 を返します。より正確には、次のように数学的に定義されます:
x % y = x - trunc(x / y) * y where trunc(x) = sgn(x) * floor(|x|)
算術演算を評価すると、例外がスローされることがあります。これは、加算、減算、乗算、および除算演算で発生することがあります。結果が数値の限界を超えている場合は、数値が大きすぎてオーバーフローし、この場合、OverflowIssue 例外がスローされます。第 2 オペランドの値がゼロの場合、除算と剰余演算子は DivisionByZeroIssue 例外をスローします。例:
-
17 % 2 は 1 と評価されます。
-
-17.3 % 2.0 は -1.3 と評価されます。
-
- 等価演算子
- ワークフロー エクスプレッションでは 2 つの等価演算子があります。
-
== 値が別の値と等しいかどうかを判定します。
-
!= 1 つのオペランドの値が別のオペランドの値と等しくないかどうかを判定します。
-
- これらの演算子は、あらゆるタイプのオペランドで動作しますが、オペランドのタイプは同じでなければなりません。たとえば、数値を整数と比較することはできません。
- 関係演算子
- 関係演算子は、一方のオペランドが他方のオペランドより小さいか大きいかを判定します。オペランドは整数タイプまたは数値タイプの数値で、エクスプレッション内のオペランドの型は同じである必要があります。関係演算子には 4 種類あります:
演算子
説明
<
未満
<=
以下
>
より大きい
>=
以上
- 論理演算子
- 2 つの二項演算 (2 つのオペランドを取る) 論理演算子があります:AND (&&)、OR (||)。また、1 つの単項演算 (1 つのオペランドを取るもの) があります:NOT (!)。これらの演算子はブール タイプのオペランドに対して定義され、リターン タイプもブール タイプになります。&& 演算子は、両方のオペランドの値が TRUE であれば TRUE を返し、それ以外の場合には FALSE を返します。|| 演算子は、オペランドの値のうち 1 つまたは両方が TRUE であれば TRUE を返し、両方が FALSE の場合には FALSE を返します。! 演算子は、オペランドの値が FALSE の場合は TRUE を返し、オペランドが TRUE の場合は FALSE を返します。
&& および || 演算子の評価は、他の多くの演算子の評価とは若干異なります。通常はオペランドの評価が実行される前にすべてのオペランドが評価されますが、&& および || 演算子については、第 1 オペランドが最初に評価されます。演算子の結果を判断するのに十分であれば、2 番目の引数は評価されません。たとえば、x==1 || x==2 において、x が 1 の場合、エクスプレッションの 2 番目の部分 (x==2) は評価されません。
- 条件付き演算子
- 条件付き演算子は 3 つのオペランドを取り、次の形エクスプレッションを取ります。
<Op>?<Op>:<Op>
ここで、<Op> は、制限付きで任意のオペランドになります。たとえば、x の値が 1 であれば、x==1?0:1 は 0、それ以外の場合は 1 になります。第 1 オペランドのタイプはブール タイプでなければならず、他の 2 つのオペランドは任意のタイプにすることができますが、同じでなければなりません。
条件付き演算子の評価も、他の多くの演算子の評価とは若干異なります。条件付き演算子の場合、最初に第 1 オペランドが評価され、その値に応じて、他の 2 つのオペランドのうちの 1 つだけが評価されます。第 1 オペランドが TRUE (または FALSE) の場合、第 2 (または第 3) のオペランドが評価され、結果がこの評価の結果になります。これは、評価されていないオペランドに評価エラーが発生しても、例外がスローされないことを意味します。たとえば、x == 0.0? で、1.0: 1/X では、x に 0.0 の値がある場合、1/x は評価されず、DivisionByZeroIssue 例外はスローされません。
- 演算子の概要
- 次の表は、エクスプレッション演算子の一覧です。
演算子
説明
例
+
加算またはテキスト連結
1+2
"hello " + name
-
減算または否定
1-2
5-2.9
-5
*
乗算
42*2
1.0*17
/
除算
1/2
1/2.0
%
剰余演算
x % 2
2.5 % 1.0
==,!=
等しい、等しくない
true == false
x != 0
<,<=
未満、以下
0 < 1
1.0 <= 0.0
>,>=
より大きい、以上
0 > 1
1.0 >= 0.0
&&,||
論理 AND、論理 OR
true || x
false && y
!
論理 NOT
!true
_?_:_
条件付き演算子
x>0? x: 0
- 丸括弧
- 丸括弧を用いてエクスプレッションの評価順序を決定することで、エクスプレッションから得られる結果を別のものにすることができます。たとえば、エクスプレッション 1+2*3 は 7 と評価されますが、次のように丸括弧を挿入すると:(1+2)*3 は、隣接する演算子の前で括弧の内容が評価されるため、結果は 9 に変わります。
- 関数
- エクスプレッションには、関数呼び出しを含めることもできます。関数を呼び出すには 2 つの方法があります。1 つ目は直接関数呼び出しと呼ばれ、次のようになります。f(<Op>,…,<Op>)、たとえば max(1,2)。もう 1 つはメソッド関数呼び出しと呼ばれ、次のようになります。<Op>.f(<Op>,…,<Op>)、たとえば 1.max(2)。この 2 つの方法は次のような関係になっています。
<Op1>.f(<Op2>,...,<Opn>) は f(<Op1>,...,<Opn>) と同じです。
オペランドは特定のタイプを持つ必要があり、結果タイプはオペランドのタイプに応じて異なる点において、関数は演算子に似ています。たとえば、2 つの数値で最大値を決定する関数 max は、整数タイプまたは数値タイプのオペランドで呼び出すことができ、戻り値のタイプはオペランドのタイプと同じになります。
評価中、関数が想定外の不正なオペランド値を取得すると、IncorrectValueIssue 例外がスローされます。
Kofax RPA は以下の関数を提供します。
テーブル 1. 数値関数 関数
結果タイプ
abs(Integer)
整数
abs(Number)
数値
ceil(Number)
整数
computeMD5(binary: Binary)
テキスト
バイナリ入力の MD5 チェックサムを計算します。
floor(Number)
整数
round(Number)
整数
trunc(Number)
整数
max(Integer, Integer)
整数
max(Number, Number)
数値
min(Integer, Integer)
整数
min(Number, Number)
数値
random()
数値
0.0 以上 1.0 未満の乱数を返します。
random(Integer, Integer)
整数
第 1 オペランドの値以上、第 2 オペランドの値以下のランダムな整数を返します。
例
以下の結果に評価
abs(-2)
2
1.5.round()
2
random(1,6)
1 と 6 の間の整数値
テーブル 2. テキスト関数 関数
結果タイプ
length(Text)
整数
substring(Text, Integer)
テキスト
substring(Text, Integer, Integer)
テキスト
indexOf(Text, Text)
整数
contains(Text, Text)
ブール値
trim(Text)
テキスト
capitalize(Text)
テキスト
startsWith(Text, Text)
ブール値
endsWith(Text, Text)
ブール値
toLowerCase(Text)
テキスト
toUpperCase(Text)
テキスト
matches(text: Text, regex: Text)*
ブール値
テキストが正規表現に一致するかどうかをチェックします。
removeNonPrintable(text: Text)
テキスト
印刷不可文字を除去します。
replaceAll(text: Text, regex: Text, replacement: Text)*
正規表現に一致するすべてのサブテキストを、指定された置換文字に置き換えます。
unquote(text: Text)
テキスト
テキストから引用符を除去します。たとえば、"hello" と 'hello' は、引用符なしの hello となります。
注 * この関数の実行には、使用されるテキストと正規表現に応じて長い時間がかかることがあります。たとえば、テキストに余分なゼロを大量に入力すると、matches 関数が極めて長時間実行されます。最後に A を 1 つ追加すると、matches("0000000000000000000000", "(0*)*A") のようにほぼ即座に true を返します。エクスプレッションを変更するたびに、以前の評価が取り消され (まだ実行中の場合)、新しい評価が開始されます。例
以下の結果に評価
"workflow".substring(5)
低
テーブル 3. 変換関数. 変換関数は、あるタイプから別のタイプへ値を変換します。オペランドの値が、結果タイプの値に変換可能な値を表さない場合、変換が失敗することがあります。 関数
結果タイプ
ampersandEncode(text: Text)
テキスト
テキストをアンバンサンド エンコードします。
ampersandDecode(text: Text)
テキスト
テキストをアンバンサンド デコードします。
base64Encode(binary: Binary)
テキスト
MIME (RFC 2045) 用の Base64 転送エンコードを使用する Base64 エンコード。
base64Decode(text: Text)
バイナリ
MIME (RFC 2045) 用の Base64 転送エンコードを使用する Base64 デコード。
boolean(text: Boolean)
ブール値
テキストは「true」または「false」のいずれかに一致する必要があります。
integer(Number)
整数
数値は整数値である必要があります (例:1.0)。
integer(Text)
整数
テキストは、"42" などの整数のテキスト表現である必要があります。
number(Integer)
数値
number(Text)
数値
テキストは、"17.7" などの数字のテキスト表現である必要があります。
text(Integer)
テキスト
text(Number)
テキスト
text(Boolean)
テキスト
text(binary: Binary, charsetName: Text)
テキスト
テキストの二進表現をテキスト タイプの値に変換します。UTF8 などの文字セットを引数として指定します。
binary(text: Text, charsetName: Text)
バイナリ
テキスト値をバイナリ値に変換します。UTF8 などの文字セットを引数として指定します。
toJSON()
パスワード以外のあらゆるタイプの値を、JSON オブジェクトとしてフォーマットされたテキスト値に変換します。パスワード タイプ属性を含むレコード タイプは JSON に変換できません。
- 変換された値の例
-
-
5 は "5" となります
-
1.2 は "1.2" となります
-
true は "true" となります
-
"Hello" は "\"Hello\"" となります
-
バイナリ値は、バイナリ値の Base 64 エンコードになります
-
レコード値、R(a = 5, b = true, t = "Hello") は "{\"a\":5,\"b\":true,\"t\":\"Hello\"" となります
-
注 ワークフロー状態ビューには、引用符の前の逆スラッシュが表示されません。上に示したレコードの値の変換方法は、エクスプレッションに記述する方法です。toJSON 関数は、[1,2,3] のような配列を生成することはありせん。Desktop Automation ロボットで JSON 値を使用する場合は、文字列を連結することによりリストを作成できます。これにより、Desktop Automation ロボットから Web ロボットに値を返すことができます。
詳細については、JSON の使用を参照してください。
次の表は、変換関数の一覧と説明です。これらは、text(2) などの直接関数呼び出しと 2.text() などのメソッド関数呼び出しという 2 とおりの記述が可能です。最初のバリアントでは関数は直接呼び出されますが、2 番目のバリアントではエクスプレッション モードでエクスプレッションを記述する場合に、自動テキスト入力を使用できます。詳細については、後述のエクスプレッション モードを参照してください。
例 関数 以下の結果に評価
ampersandEncode("<b/>") または "<b/>".ampersandEncode() <b/> ampersandDecode("<b/>") または "<b/>". ampersandDecode() <b/> base64Encode(bin) または bin.base64Encode() bin は "Hello".binary("ASCII") の結果のバイナリ値を保持している変数です
SGVsbG8= base64Decode("SGVsbG8=").text("UTF8") または "SGVsbG8=".base64Decode().text("UTF8") Hello - "true".boolean()
- "false".boolean()
- "False".boolean()
-
Boolean true
-
Boolean false
-
「true」または「false」のいずれにも一致しないため、ConversionIssue 例外をスローします
-
integer(2.0) または 2.0.integer()
-
integer("2") または "2".integer
2 -
number(2) または 2.number()
-
number("2") または "2".number()
2.0 number(".1E10") または ".1E10".number() 1.0E9 "Hello".binary("UTF8").text("UFT8") ここで "Hello".binary("UTF8") は UTF8 文字エンコードを使用してエンコードされたバイナリ値と評価します。例のようにバイナリ値がテキストに変換される場合、バイナリ値は同じ文字エンコード (この場合は UTF8) を使用してエンコードする必要があります。
Hello "hello".toJSON() "hello" 17.7.toJSON() 17.7 true.toJSON() TRUE Company.toJSON() ここで"Company"はテキストタイプ、整数タイプ、ブールのフィールド タイプを含むレコード タイプの変数です。
次の値のテキスト値:
{"name":"Acme Corp.", "url":"www.acme-corp.com", "revenue":1000000000, "CEO":"Marvin Acme", "fictional":true}
- 数値の制限
-
- 整数値
- 表現できる最大の整数は 1E34-1 です。これは 9 が 34 個並んだ数値です。この数字に対して 1 を加えると、OverflowIssue の例外が発生します。同様に、表現できる最小の整数値は -1E34+1 です。したがって整数値はすべて、-1E34+1 から 1E34-1 (どちらも含む) の範囲内である必要があります。
- 数値
- 数値の表現は、小数点以下を含め 34 桁の数を使用する IEEE 754R Decimal128 と、-2147483648 〜 +2147483648 の範囲の指数の表現に一致します。エクスプレッションの評価で範囲外の数値になった場合、OverflowIssue 例外が発生します。
詳細については、数値の制限を参照してください。
次のように、指数で数値を入力することができます。
1.234E5、0.1E-2, 1000.0e42、など。
基本数の後には、任意の E または e および整数の指数が続きます。Desktop Automation ワークフロー状態ビューまたは式エディターに数値が表示される際には、次のルールに従って正規化されます。
- 他の 10 進数がない場合、小数点の後にゼロが 1 つ表示されます (1.0E12 など)。
- 指数は、数値が 9 以上の場合にのみ表示されます。つまり、次のようになります。
-
- 1.0E8 は 100000000 と表示されますが、1.0E9 は 1.0E9 と表示されます
- 1.0E-8 は 000000001 と表示されますが、1.0E -9 は 1.0E-9 と表示されます。
- 数字は最大 34 桁まで表示されます (数字は四捨五入されて最大 34 桁となります)。たとえば、9.999999999999999999999999999999999 という数字はそのまま表示されます。この数字に 9 をもう 1 つ追加すると、10.0 と表示されます。実際には、数値は四捨五入されているため、内部的にも 10.0 として表されます。したがって、数値を一方向に入力しながら別の方法で表示することができるため、10.0 や 0.1E2 など、数値の入力方法に柔軟性を持たせることができます。
また、変換関数 text(Number) も上記のルールに従って記述された数値を返します。
エクスプレッション エディタ
エクスプレッション エディタは、Desktop Automation エディタで入力フィールドをクリックして開く、指定されたフィールドがエクスプレッションの入力をサポートしている場合のインタラクティブなエディタです。エディタは 2 つのペインで構成されています。上部のペインはエクスプレッションの入力や編集を行う入力ペインで、下部のペインは結果ペインです。結果ペインには、エクスプレッションの評価結果、エラーメッセージ、またはその両方が表示されます。次のエラーが表示されることがあります:
- Parse errors: エクスプレッションの構文が不正です。
- Type errors: エクスプレッションにタイプ エラーがある、または結果が正しいタイプとなっていません。
- 評価 errors: ゼロによる除算など、エクスプレッションの評価中にエラーが発生しました。
次の例は、x + 1.0 というエクスプレッションです。ここで x は整数タイプの変数であるとします。エクスプレッションには正しいタイプが付けられていますが、結果は整数タイプの変数に割り当てられるものであるため、エクスプレッションの結果タイプは想定外であるというエラー メッセージが表示されます。
![デバイス オートメーションのエクスプレッション エディタ](../../All_Images/expressionEditorError.png)
右クリックして [値のコピー] を選択すると、エディタの下部ペインからエクスプレッションの結果とエラー メッセージをコピーすることができます。値がレコード タイプの場合、結果はツリーとして表示され、各属性値は個別にコピーできます。パスワードとバイナリ値はコピーできません。
エクスプレッション エディタを閉じるには、エディタの外側をクリックするか、[Esc] を押します。
- エディタ モード
- エディタには、上部ペインの左側にエクスプレッション モードと値モードを切り替えるモード ボタンがあります。上図のエディタは、エクスプレッション モードです。エディタが値モードになっているとき、モード ボタンは空白となります。エディタがエクスプレッション モードのとき、ボタンには等号 (=) が表示されます。キーボード ショートカット [Ctrl-E] を使って、2 つのモードを切り替えることができます。
- 値モード
- 値モードでは、入力された値は単にテキスト、ブール値、数値などの値として解釈され、評価は行われません。結果パネルに結果が表示されます。表示できる唯一のエラーは、結果タイプが不正な場合です。
- エクスプレッション モード
-
エクスプレッション モードでは、入力ペインに入力したすべての内容がエクスプレッションとして解釈され、構文とタイプのエラーについてチェックが行えます。現在のフロー ポイントでエクスプレッションを編集していてエラーがない場合は、評価され、その結果が表示されます。エクスプレッションの状態が常にわかるように、入力の途中で評価が行われます。現在のフロー ポイントにないエクスプレッションを編集する場合は、変数が含まれていないか、値が現在の状態に依存していないか評価されます。
エクスプレッションの評価中に、たとえばゼロによる除算などのエラーが発生した場合、例外の名前と問題を説明するメッセージが結果ペインに表示されます。例外の名前を右クリックし、[値のコピー] を選択してその名前をコピーすることができます。
エクスプレッション モードでのテキスト補完は、変数名、フィールド名、関数名の入力に役立ちます。補完ヘルプがあるものを入力すると、テキスト補完ウィンドウが自動的に表示されます。たとえば、変数名の入力を開始し、すでに入力したものから始まる変数がある場合、補完ウィンドウが表示されます。レコード タイプの変数の後でドット (.) を押すと、補完ウィンドウには、レコード タイプのフィールドに対応した補完オプションのリストが表示されます。次の例は、"p" と入力した後の補完ヘルプを示します。
シンプル タイプのサブエクスプレッションの後にドット (.) を押すと、最初の引数が同じシンプル タイプを持つ関数に対応する補完オプションのリストが、補完ウィンドウに表示されます。
補完リストのオプション間を移動するには、矢印キーまたはマウスを使用します。補完リストでオプションを選択するには、[Enter]、[Tab] を押すか、オプションをダブルクリックします。何も入力せずに補完ウィンドウを開くには、[Ctrl+Space] を押します。補完ウィンドウを閉じるには、ウィンドウの外側をクリックするか、[Esc] を押します。
入力ペインでエクスプレッションの一部が選択され、その選択が適切なサブエクスプレッション (それ自身で評価可能) に相当する場合、このサブエクスプレッションの値が下の図のように結果ペインに表示されます。
入力ペインで関数の名前を選択すると、次のように、この機能の説明が結果ペインに表示されます。