Automation Anywhere A2019で親BotからサブBotに変数の値を受け渡す (v11との比較)

# 概要
Automation Anywhere でひとつのTaskBot (親Bot)からもうひとつのTaskBot (サブBot)を引数を引き継いで呼び出す、というのはある程度大きなRPAプロジェクトになってくるとよくあることです。

v11では以下のようなユーザーインターフェイスで親BotとサブBotの変数を双方向にマッピングすることができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/41fdd2e8-6d00-c503-282b-8e0a06b4a04d.png)
そのため最新バージョンであるA2019でも同じことを期待したいところです。つまり、以下の図のように、親BotとサブBotの変数を入力、出力でマッピングして運用することです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/f6f1c87a-ac85-3b71-0d14-f34951721e53.png)
ところが、A2019では仕様変更が行われ、このような単純なマッピングではなく、以下の図のように考え方が変わりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/4ad128af-3d42-26fb-6b44-9169a6d7be31.png)

この記事ではサンプルBotを動かしながら、実際の仕様について見ていきたいと思います。

# サブBotで変数作成時に必要な設定
A2019では変数の作成時に**「入力として使用」「出力として使用」**というオプションが新しく登場します。これはv11では存在しませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/961ad66f-f95e-a72c-c990-1ec5b678d9ce.png)
これらは、Botが**「サブBot」**として機能する場合に重要となってきます。

# 「入力」(親Bot⇒サブBot)の受け渡し
サブBotの変数で「入力として使用」をONにすると、呼び出し元のBotからTaskBot:Runアクションで呼び出す際に、サブBotに渡す引数として表示されるようになります。複数の変数で「入力として使用」をONにすると、その数だけアクションの詳細にオプションが現れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/895b9077-0cf0-cd7e-e6b7-77bc9f7d4c41.png)
値を受け渡す際には、各変数名の左に表示されているチェックボックスをONにします。また、その際には変数型を意識する必要があります。フィールドには変数型にあった値、変数、またはその組み合わせを引数として指定する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/7c0395e1-e7de-ae54-330b-63e4d99d5e32.png)



# 「出力」(サブBot⇒親Bot)の受け渡し
サブBotの変数で「出力として使用」をONにしても、呼び出し元のBotからTaskBot:Runアクションで呼び出す際に、アクションの詳細には何も現れません。その代わりに、一番下にあるオプション**「Assign the output to variable」**に指定する**ディクショナリ型変数**にKey/Valueの組み合わせとして値が返ります。複数の変数で「出力として使用」をONにすると、その数だけディクショナリ型変数の要素が返ってきます。

既定ではこのオプションは空欄です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/ad97395c-9691-ab2f-5bfd-392471f003c0.png)

必ずディクショナリ型変数を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/5e4b70df-38c4-f0d6-b8e1-cb4159c0d3eb.png)

ドロップダウンリストには他の型の変数もなぜかリストされます。ディクショナリ型以外を選んでも、「出力として使用」がサブBotでひとつもONになってなければ特にエラーは出ません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/3c713c04-c52a-2c59-8bc2-6468d8093592.png)
1つ以上の出力がある場合に、ディクショナリ型以外の変数が指定されていると、以下のエラーが出る場合があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/68fa759a-440d-c7c2-20dd-93daab62045c.png)

ディクショナリ型変数は、要素を指定するカッコの中にKeyとなる値 (今回の場合はサブBotの変数名)をダブルクオートを付けずに指定します。たとえばディクショナリ型変数`$Dic$`に値が返ってきたとして、サブBotで`$sub2$`という名前の変数の値を参照するには`$Dic{sub2}$`と指定します。

<font color="Red">**この「出力」の変数に関する受け渡し方法は、本記事執筆時点でAAオフィシャルドキュメントには記載がありません。**</font>

### 「入力」「出力」両方をONにして親Botで入力部分に変数を指定してもダメです
v11のことを知っていると、A2019でも「変数のマッピング」ができるのではないかと勘違いして使ってしまう場合があるかもしれません。つまり、サブBotである変数 (`$sub3$`) について「入力として使用」「出力として使用」の両方をONにして
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/961ad66f-f95e-a72c-c990-1ec5b678d9ce.png)
TaskBot:Runアクションの詳細で、入力値のフィールドに親Botの変数 (`$parent3$`) を指定すれば、両者の値が同期するのではないか、ということです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/416f813e-71c9-4d0d-47c1-6a0a46082d35.png)
しかし、残念ながらそうはならず、実際の動作は`$parent3$`の値が定数として`$sub3$`に渡されるだけの動作になります。出力は別途指定するディクショナリ型変数の一部として返ってきます。

# サンプルBotで動作を確認してみる
**Parentbot**:2行目でSubbotを呼び出します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/e2437ea8-1d2a-510b-1ae6-25937b30bdca.png)
3行目では、一応元々の親Botの変数を表示します。4行目ではサブBotからの返り値であるディクショナリ型変数の要素をキーを指定して表示します。(`$Dic{sub2}$`という表現)
3行目のアクションの詳細:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/779c8154-fa25-78da-4d4e-a15c59928246.png)
4行目のアクションの詳細:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/7359331f-0a63-2ffe-6fa0-edcdd3f90cc4.png)

ローカル変数/設定/初期値

|変数型|変数名|入力|出力|初期値|
|:--|:--|:--:|:--:|:--|
|文字|parent1|⬜|⬜|Parent|
|文字|parent2|⬜|⬜|Parent|
|文字|parent3|⬜|⬜||
|辞書/文字|Dic|⬜|⬜||

**Subbot**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/9bdf8491-0e71-4af0-116b-1694da2b58c6.png)
ローカル変数/設定/初期値

|変数型|変数名|入力|出力|初期値|
|:--|:--|:--:|:--:|:--|
|文字|sub1|✅|⬜|Sub|
|文字|sub2|⬜|✅|Sub|
|文字|sub3|✅|✅|Sub|

実行すると、以下のメッセージボックスが順に表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/5737e504-c0f6-1c92-467e-8f395f23ef0b.png)
各変数の値を時系列で表すと以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/b62e6ec2-c06c-ba25-a4e4-914546663808.png)



# v11の場合 - 詳細
Automation Anywhere v11では、親BotとサブBotの変数の受け渡しは以下のように行いました。

**Parentbot.atmx**:2行目でSubbotを呼び出します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/306c1b7e-37f9-037d-aa13-f963702dec10.png)
ローカル変数/初期値
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/3540ca16-73f0-fdb6-ac81-64f8a8de56d2.png)
**Subbot.atmx**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/fbfb7cf8-89c5-e0a8-2f8a-928068f5a450.png)
ローカル変数/初期値
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/402429ca-b245-7fa7-e15c-998e68ac42fb.png)

親BotのRun Taskコマンドで、「変数」を選択して以下のように設定します。タスクを選択した後、最初に「クイックマップ」ボタンを押しておくと、Subbotのローカル変数がドロップダウンリストに読み込まれるため、簡単に設定が可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/b4f22714-9dc2-9306-de0f-405917300b46.png)
実行すると、以下のメッセージボックスが順に表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/11552d78-a573-e1bd-ba68-16664142b97e.png)
各変数の値を時系列で表すと以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/8aa2ca3a-c084-7a19-88c8-6635966698d6.png)


# 参考情報

* [変数の作成](https://docs.automationanywhere.com/bundle/enterprise-v2019/page/enterprise-cloud/topics/aae-client/bot-creator/using-variables/cloud-create-variable.html?_LANG=jpjp) - 製品ドキュメント