Automation Anywhere A2019で変数を使う (v11との比較)

# 概要
Automation Anywhere A2019では変数の取り扱いが大幅に拡張され、より開発者好みのになりました。A2019は、前のバージョン (v11) と比べて大抵の部分で初心者にもとっつきやすくなったといわれますが、この変数の部分だけはちょっとだけハードルが上がったかもしれません (開発者好みの機能がついた裏返し)。この記事では、初心者にもわかりやすいようにA2019の変数の機能概要を解説したいと思います。

**環境**

* V2019.10 ビルド2545

# そもそも変数って何!?
「変数」と聞くと、多くの人が思い出すのはおそらく小学校の算数で出てきた方程式の$x$でしょうか。この文脈では、$x$は未知の数で方程式を解いて内容を求めるものでした。この記事でいう変数はそんなに難しいものではなく、**数字や文字列、その他の情報を入れておくための箱**のようなものとよく説明します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/e80671a9-3e66-bdec-e3bb-7ad1ee7ba19e.png)

変数に入れたい値を代入して、そのまま保持しておき、後で利用します。また、変数は複数用意しておくことができるので、複雑な複数のデータを保持することもできるのです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/47d5c324-8fe3-dd45-d9bf-2f1c18bb0b18.png)

### 変数名に使える文字

>注: 変数名は半角英数字と記号のみ利用でき、先頭は半角英字である必要があります。日本語文字などは利用できません。

# 変数型の導入

変数には文字列や数字などいろいろな種類のデータを入れることができますが、入れるデータの種類によって入れ物の種類も分けることでメリットが出てきます。これを「変数型」と言います。V2019では以下の変数型があります。

* 任意 (Any)
* 文字列 (String) - 既定値
* 数字 (Number)
* 日時 (Datetime)
* Boolean
* ファイル (File)
* リスト (List)
* ディクショナリ (Dictionary)
* レコード (Record)
* テーブル (Table)
* ウィンドウ (Window)

変数を作成した際には、左側に型を表すマークがつきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/ac4ef5e6-b7d4-455d-8ccf-8f0fbed301b1.png)
アクションによって、そのアクションの詳細で利用するフィールドで変数を利用できますが、それぞれのフィールドで使える変数の型が指定されています。**変数型を導入すると、それぞれのフィールドに指定すべきデータの種類をあらかじめ明確にしておくことができ、実行してエラーが出たときのデバッグがやりやすくなります**。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/4d881e84-fdf3-f630-c062-7de2efbb2854.png)


# 基本的な変数型

### 文字列 (String)
英数字、記号、日本語文字をはじめとする文字、および空白文字列を格納します。アクションの詳細の中のフィールドや変数の一覧ではダブルクオート `"`マークが先頭についています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/36fd383b-d5e8-6097-d746-a6c2c4fde4f1.png)
一部のフィールドでは仮想キーボードによる入力も可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/c1ecd219-2fee-6355-e973-e07bfe419505.png)

### 数字 (Number)
整数や浮動小数点を格納します。15桁の数字まで保持できます。アクションの詳細の中のフィールドや変数の一覧ではシャープ `#`マークが先頭についています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/da5f6e18-407c-6393-5cf0-124bd7124cd7.png)

### 日時 (Datetime)
日付と時刻の情報を格納します。

### Boolean
True (真) またはFalse (偽) の情報を格納します。アクションの詳細の中のフィールドや変数の一覧では旗🏴マークが先頭についています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/12d3ba2a-3d88-a325-4370-3bd1ffc9b57a.png)

### 任意 (Any)
任意のデータを格納でき、システム側でデータ型を判断します。Bot間で引数を受け渡すときに利用します。

### レコード (Record)
データベースやExcel行など、テーブルから抜き出された1行のデータを格納します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/68672ac3-4e81-5ab1-36af-7f3de8079d95.png)

# 構造を持った変数

1次元または2次元の引数を持ちます。引数には別の変数をネストすることもできます。(10段階まで)

### リスト (List)
文字列/数字、Booleanなどの値からなる配列変数で、リストには値を追加することができます。1次元データです。

### テーブル (Table)
行列からなるテーブル型のデータを格納します。Excel、CSV/TXT、データベース、ウェブフォーム等の2次元データを格納します。


### ディクショナリ (Dictionary)
Key-Value型のデータを格納します。ValueはBoolean、数字、または文字列を格納できます。電子メールやPDFファイルの属性、または自然言語処理の出力などに利用されます。

# オブジェクトを指し示す変数

### ファイル (File)
セミコロンで区切られた1つ以上のファイルパスを格納します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/205afc72-c857-e488-8e0f-dd4f5d227670.png)


### ウィンドウ (Window)
ウィンドウタイトルとURLを格納します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/2f185faa-9e4e-4e1c-7f1a-914fe6be70d5.png)

# Credential Vault (資格情報)

正確にいうと変数の一部ではないようですが、Credential Vaultで指定した資格情報も、変数のように特定のアクションのフィールドで参照可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/51969e0c-f8e0-7782-b94d-7e69157d989e.png)


# システム変数

Botエディターで変数メニューを広げると、以下のような変数が最初から用意されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/6c3ed1c0-30fc-dd3a-ea45-485dc1d054f4.png)

* **prompt-assignment**:システムで最初から用意している文字列型の変数です。分類的にはユーザー定義変数であり、削除することも可能です。
* **Clipboard**:クリップボード内の値を参照したり上書きしたりできます。
* **String**: 文字列定数として利用すると便利なもの (`ENTER`、SEPARATOR、`TAB`の文字列)が定義されています。読み取り専用。
* **System**: システムが用意している読み取り専用の変数です。特定の属性や情報を取得するのが目的です。これらのことを「**システム変数**」と呼びます。



# ユーザー定義変数の利用には「宣言」が必要
Automation Anywhereにおける変数は、アクションリスト中で利用するには変数の宣言 (作成)がまず必要になります。アクションリスト中で使用されている変数は、必ず変数アコーディオンメニューの中の一覧に表示されます。アクションの詳細で新しい変数を作成する場合も、この一覧に追加されます。


# 型変換

特定の変数型の間で変換をしたい場合は以下のように行います。また、上級者向けにインラインで変換する応用編の方法もあります。詳しくは『[Automation Anywhere Enterprise A2019での型変換、応用編](https://qiita.com/zamaezaaa/items/7811c7ca806a8bca45c4)』by @zamaezaaa さん や『[Automation Anywhere A2019 で「型キャスト」を使いこなす](https://qiita.com/RPAbot/items/c6b23a8b84ae30aef0ff/)』をご参照ください。

### 数字 ⇒ 文字列
専用のアクションがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/48927d96-e91f-bf0c-35ef-ca31962b9472.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/1d99df18-ab49-57da-8d40-852dc9bdee1a.png)


### 文字列 ⇒ 数字/Boolean
専用のアクションがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/b3463b7c-7ad0-93f9-b948-817483c556fc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/a8f87185-3e0a-1523-fb36-473d1c317bf0.png)


### 日時 ⇒ 文字列
専用のアクションがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/b4a8c8b4-e5c4-1969-daee-58fbd7f2f1d0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/f62c6fed-a60c-8c50-9d5c-8e7ce6ab8a4d.png)

### 文字列 ⇒ 日時
専用のアクションがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/5f046e1b-63e7-cb11-9712-3d782c403ce1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/ba1131a1-22ea-76d9-3eae-da74e0de6874.png)


### Boolean ⇒ 数字/文字列
専用のアクションがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/7da6a053-893e-07e6-635b-09ef06723e51.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/4ec8d4a8-99a5-facf-3e91-be13910b7f7e.png)

# 親BotからサブBotへの変数の受け渡し方
サブBot側で変数を作成する際に、引数にしたい変数を作成するときに**「入力として使用」「出力として使用」**オプションをONにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/961ad66f-f95e-a72c-c990-1ec5b678d9ce.png)
詳しくは『[Automation Anywhere A2019で親BotからサブBotに変数の値を受け渡す (v11との比較)](https://qiita.com/RPAbot/items/d4c04cca3cefebbe93f3)』に解説されていますので参照してください。

# 参考文献: 公式ドキュメント

現時点でA2019の公式ドキュメントは、おそらくV11のドキュメントをベースに書き換えを行っている最中なので、V11から変更になった点を中心に、まだまだ古い記述が残っていて正しくないところがあり注意が必要です。

* [変数と資格情報](https://docs.automationanywhere.com/bundle/enterprise-v2019/page/enterprise-cloud/topics/aae-client/bot-creator/using-variables/cloud-using-variables.html?_LANG=jpjp)
    * [システム変数](https://docs.automationanywhere.com/bundle/enterprise-v2019/page/enterprise-cloud/topics/aae-client/bot-creator/using-variables/cloud-system-related-variables.html?_LANG=jpjp)
    * [ユーザー定義変数](https://docs.automationanywhere.com/bundle/enterprise-v2019/page/enterprise-cloud/topics/aae-client/bot-creator/using-variables/cloud-user-local-variables.html?_LANG=jpjp)
        * [変数の作成](https://docs.automationanywhere.com/bundle/enterprise-v2019/page/enterprise-cloud/topics/aae-client/bot-creator/using-variables/cloud-create-variable.html?_LANG=jpjp)

# 参考記事 (公式以外)

* [Automation Anywhere -【A2019】変数](https://licensecounter.jp/engineer-voice/blog/articles/20200226_AutomationAnywhere-A2019-Variable.html) - C&S Engineering Voice blog

# (おまけ)v11との比較

### Variable Operation / String Operation コマンドが新しいコマンドに

先の型変換のところで出てきた通り、型を変更したり、同じ型の中で演算を行うために、それぞれの変数型用のアクションパッケージが用意されています。

### LOOPのローカル変数の削除
v11では、LOOPの種類に応じて、ループ内だけで利用できる特別な変数やカウンターが存在しましたが、A2019では一般的な変数を使うように仕様変更になりました。

### 乱数型は削除
Randomタイプの変数がA2019では削除されているので、JavaScript/VBScript/Pythonなどのプログラミング言語をつかって生成する必要があります。『[Automation Anywhere A2019でランダムな文字列や数字を発生させるには](https://qiita.com/RPAbot/items/6af7c6a5f190209e0917)』をご参照ください。

### 親BotとサブBotの変数マッピングの方法が変更
詳しくは『[Automation Anywhere A2019で親BotからサブBotに変数の値を受け渡す (v11との比較)](https://qiita.com/RPAbot/items/d4c04cca3cefebbe93f3)』に解説されていますので参照してください。

### v11の参考記事

* [Automation Anywhere で多重ループを使う](https://qiita.com/RPAbot/items/860a545a24167f10b22c)
* [Automation Anywhereでランダムな文字列や数字を発生させるには](https://qiita.com/RPAbot/items/0a26baf8158301ab6ba9)
* [Automation Anywhere 便利なシステム変数一覧](https://qiita.com/RPAbot/items/4f03665cac09dcf6a246)
* [Automation Anywhere でList変数、Array変数を使う](https://qiita.com/RPAbot/items/6f98d0e6585e4f973e28)
* [Automation Anywhere - 変数](https://licensecounter.jp/engineer-voice/blog/articles/20190912_automation_anywhere_variables.html) - C&S Engineering Voice blog