Automation Anywhere A2019で四則演算や数学関数による演算を行うには

Automation Anywhere v11.xを知っている人は、v11.xにおける変数は型がなく、Variable Operationコマンドダイアログボックスのテキストボックスの中で簡単な四則演算ができたので、A2019ではどうなったのかと気になる人もいると思います。A2019ではどうなっているかについてみていきましょう。

**環境**

* Automation Anywhere A2019.14 (ビルド5322) 

# A2019における文字列型と数字型の変換
A2019では変数型が導入され、文字列型と数字型は別々になってしまったため、両者の型の間の変換は新しく導入されたパッケージを使います。以下のようなパッケージが利用できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/27440290-bea4-2387-9ca1-cb71cf203afd.png)

しかし、文字列型の変数の中身にv11.xのような式を「代入」しても、処理されず文字列のまま残ったままです。また「数字」パッケージで利用できる演算は足し算、引き算のみです。では、A2019ではどのように四則演算や数学演算を行えばいいか見ていきましょう。


# 四則演算

### 1. 数字フィールド内でのインライン四則演算
まずは標準的なやり方を見てみます。今回のお題はv11のVariable Operationで $2(x^2+3x)+1$ を実行したのと同じ値を得ることです。($x$にはあらかじめ$3$を代入しておく)
実は「アクションの詳細」ウィンドウの中の数字フィールド (「#」が先頭についたフィールド)では、数字や変数を指定するほかに、四則演算の数式も指定することができます。これによりインラインで四則演算が可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/b5e91caf-bf12-6c3d-331f-2b6ffd0b0126.png)
実行結果: 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/1f879b1d-7ac8-ed2a-dc19-f4d5dce722d6.png)
$x=3$ の場合、$2(x^2+3x)+1=37$ なので、正しい値が返ってきているのがわかります。

### 2. 外部スクリプトを使う
2番目の方法として、A2019からVBScript/JavaScript/Pythonによるインラインスクリプトが簡単にできるようになったので、これを使います。(Pythonを使うには別途Pythonのランタイム環境をローカルPCにセットアップする必要あり)

A2019での解法に、お手軽なVBScriptを使ってみます。

```VisualBasic:「VBScript：開く」の「手動スクリプト」に貼り付けるコード
Function Calc(x)
   Calc = 2*(x*x+3*x)+1
End Function
```
ロジックのVBScriptは、**「VBScript: 開く」**アクションの中に貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/f9d8bb04-4eb4-3870-db14-fa1beb714e8e.png)

実行結果: 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/1f879b1d-7ac8-ed2a-dc19-f4d5dce722d6.png)
$x=3$ の場合、$2(x^2+3x)+1=37$ なので、正しい値が返ってきているのがわかります。演算自体はVBScriptにやらせているわけです。

### 3. 型キャスト「LegacyAutomation:parseVariableOperation」を活用する
3番目の方法ですが、実はv11で作成したBotを移行ツールでA2019に移行するとやり方がわかります。これは標準機能だけで実装可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/0b4e89bf-d8f3-0705-6681-98788b84689d.png)

以下のv11 Botを移行してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/a70917a7-6536-6f6d-3f1a-636580d3a4d7.png)

すると、以下のようなBotとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/fb7cc367-1055-677f-470c-f685c5d6fa73.png)
赤枠で囲われた部分は「[型キャスト](https://qiita.com/RPAbot/items/c6b23a8b84ae30aef0ff)」と呼ばれる、A2019から新しく導入された概念です。この`LegacyAutomation:parseVariableOperation`は、次のような説明がついています。

>10.x、11.xのVariable Operationコマンドと同様の式解析をします。新しく作成するBotでは使わないでください。

つまり、これを使うと、`$x$`にv11と同様数式の含まれた文字列を入れておくと、`$x.LegacyAutomation:parseVariableOperation$`は解析された結果をあらわすことになります。「新しく作成するBotでは使わないでください。」とのことですが、これは便利なので使いたいところです...

### 4. Bot StoreのMath (数学) パッケージを使う
2020年8月7日にBot Storeでリリースされた[Math (数学)パッケージ](https://botstore.automationanywhere.com/jp/bot/a2019-math-package/)を使うと、さらにさまざまな高度な計算ができて便利です。これは https://mathjs.org のエンジンを使って数式の解析をしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/b9d1a07c-1cb4-645a-5dac-b7cde63db0e9.png)
特徴は、セミコロンで区切って前提となる定義をいくつも式で書けること、変数を独自に定義しておける事、そしてAutomation Anywhereの変数もきちんと差し込めること、です。上の例だと、インラインで $y=2$と定義しており、あらかじめAutomation Anywhereで定義してある変数 `$x$` では$x=3$となっているため、この例だと$3+3+2=8$が結果として返ります。また、数学でよく使われる定数や関数も使えます。(大文字、小文字を区別します)

* [定数一覧](https://mathjs.org/docs/reference/constants.html)
* [関数一覧](https://mathjs.org/docs/reference/functions.html)



# 数学関数の演算

### 1. VBScriptを呼び出す
VBScriptの関数を使います。ただし、Round関数は四捨五入ではなく銀行型丸め処理を行う[^1]ということで、正確な計算にはRound関数を使わずに自作する必要があります。

[^1]: [数値を丸める（四捨五入）](http://www.whitire.com/vbs/tips0010.html) - VBS Tips、[切り上げ・四捨五入を正しく行う](http://www.alato.ne.jp/kazu-/vb/tip24.htm)、などを参照。

#### 切り上げ/切り捨て/四捨五入
切り上げ

```VisualBasic:「VBScript：開く」の「手動スクリプト」に貼り付けるコード
Function Calc(x)
   Calc = Int(Abs(x) * -1) * (Sgn(x) * -1)
End Function
```

切り捨て

```VisualBasic:「VBScript：開く」の「手動スクリプト」に貼り付けるコード
Function Calc(x)
   Calc = Fix(x)
End Function
```

四捨五入

```VisualBasic:「VBScript：開く」の「手動スクリプト」に貼り付けるコード
Function Calc(x)
   Calc =Fix(x + (0.5 * Sgn(x)))
End Function
```

#### 絶対値

```VisualBasic:「VBScript：開く」の「手動スクリプト」に貼り付けるコード
Function Calc(x)
   Calc = Abs(x)
End Function
```

#### 大きいほう、小さいほう (min, max)

Max

```VisualBasic:「VBScript：開く」の「手動スクリプト」に貼り付けるコード
Function Calc(x,y)
   If x > y then
     Calc = x
   Else
     Calc = y
   End If
End Function
```
Min

```VisualBasic:「VBScript：開く」の「手動スクリプト」に貼り付けるコード
Function Calc(x,y)
   If x < y then
     Calc = x
   Else
     Calc = y
   End If
End Function
```

#### 平方根

```VisualBasic:「VBScript：開く」の「手動スクリプト」に貼り付けるコード
Function Calc(x)
   Calc = Sqr(x)
End Function
```

#### 累乗

```VisualBasic:「VBScript：開く」の「手動スクリプト」に貼り付けるコード
Function Calc(x)
   Calc = x*x
End Function
```

#### 三角関数 (sin, cos, tan)

Sin

```VisualBasic:「VBScript：開く」の「手動スクリプト」に貼り付けるコード
Function Calc(x)
   Calc = Sin(x)
End Function
```

Cos

```VisualBasic:「VBScript：開く」の「手動スクリプト」に貼り付けるコード
Function Calc(x)
   Calc = Cos(x)
End Function
```

Tan

```VisualBasic:「VBScript：開く」の「手動スクリプト」に貼り付けるコード
Function Calc(x)
   Calc = Tan(x)
End Function
```

#### その他の超越関数

三角関数等からの演算で計算できます。詳しくは以下を参照してください。

* [超越関数](https://www.kanaya440.com/contents/script/vbs/function/num/exp2.html) -VBScript リファレンス

### 2. Math (数学)パッケージを使う

上記で挙がったような数学関数は標準で持っていますので、アクションの詳細パネルのフィールドでインラインで数式の一部として記載するだけで使うことができます。数学でよく使われる定数や関数、行列などが使えます。(大文字、小文字を区別します)

* [定数一覧](https://mathjs.org/docs/reference/constants.html)
* [関数一覧](https://mathjs.org/docs/reference/functions.html)

上記のリファレンスの中で`math.sin()`という関数になっているものは、単に`sin()`と記載すればOKです。以下に例を挙げます。

#### 切り上げ
`ceil()`

#### 切り捨て
`floor()`

#### 四捨五入
`round()`

#### 絶対値
`abs()`

#### 大きいほう、小さいほう (min, max)
`min(a,b,c,...)`
`max(a,b,c,...)`

#### 平方根
`sqrt()`

#### 累乗
`x^y` or `pow(x,y)`

#### 三角関数 (sin, cos, tan) 
`sin()`
`cos()`
`tan()`