Automation Anywhere でList変数、Array変数を使う

# 概要
Automation Anywhere では通常の変数 (Value) のほかに、List (1次元)とArray (2次元)があります。ただし、特にListは、通常のプログラミング言語の1次元配列とは使い勝手が違うので、解説したいと思います。

# List変数の特徴
Automation AnywhereにおけるList型変数は、複数の値をリストとして保持して1つずつ取得できます。データの1次元配列に似ています。ただし、通常の配列変数のように引数に数字を指定してn番目の値を取り出す、という使い方ではなく、**リストから1つずつ順番に値を取り出す**ことが想定されています。各要素には番号付けがされていません。変数の命名規則[^1]では、`$lstList$`のように"lst"を前につけます。

### どんな場面で使えるのか?
ユーザーシナリオとしては以下のようなことが考えられます。

* メールアドレスのリストを保持 → 一斉にメールを送る
* Webアドレスのリスト → Webスクレイピングを一斉に行う
* ループ内で利用する値のリスト

### LOOPコマンドでの要素の列挙
List変数を生かすことができるコマンドのひとつにLOOPがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/931f0002-a3ab-2cd1-a6c6-fdb84309e5a1.png)

LOOPの条件として、List変数を指定しておくと、ループの中で参照するList変数は要素を1つ返します。たとえば以下のアクションリストを作成します。LOOPコマンドを追加した後、単純にMessage BoxコマンドでList変数の中身を表示するものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/65e18581-fdcc-431d-9d20-3e7268c24703.png)

ここで`$my-list-variable$`には、以下の値が入っています。

```
my-value-1
my-value-2
my-value-3
my-value-4
my-value-5
```
すると、以下のようなメッセージボックスが順番に表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/3e14e186-e12a-f305-261b-c74863d82fa6.png)


### List変数を引数に持つコマンド
下記の他にもパラメータ指定ダイアログボックスの中のテキストボックスで`F2`を押すことで入力できる変数の候補にList変数が含まれる場合があります。

* Clipboard - Assign To Clipboard
* If/Else - Variable
* Loop - List

### List変数を出力するコマンド

* Active Directory - Search
* Excel - Find/Replace
* Prompt - Prompt for File
* String Operation - Split
* Variable Operation

# Array変数の特徴
Automation AnywhereにおけるArray型変数は、通常のプログラミング言語における配列型変数と近いです。配列の引数に指定できる**インデックスは1から始まります**。変数の命名規則[^1]では"arr"を前につけ、`$arrTable(1,3)$`のような形で表現します。列数は`$ArrayColumns($<Array 変数>$)$`、行数は`$ArrayRows($<Array変数>$)$`を参照することで取得できます。

### どんな場面で使えるのか?
複数の要素を持つ値をやり取りする様々なシーンで活用ができます。ユーザーシナリオとしては以下のようなことが考えられます。

* Webページからデータを抽出する
* Excel スプレッドシートまたはデータベースから、大量の行を含むデータを抽出する
* レガシー システム、ERP システム、または他のアプリケーションとの間でデータの読み書きを行う
* Excel からデータベースへと、さまざまなフィールドを含む注文フォームに入力する

### 初期化時にテキスト/Excel/CSV/データベースから値を読み込む
変数マネージャでArray変数を作成する際に、初期化の手段を以下の4種類から選択できます。

1. Value (値を直接指定)
2. Read from text file (テキストファイルから読み込み)
3. Read from excel/csv file (Excel/CSVファイルから読み込み)
4. Read from database (データベースから読み込み)

それぞれ、初期化をするためのユーザーインターフェイスがあります。

**1. Value (値を直接指定)**
配列の行、列の最大サイズを数字で指定します。データはスプレッドシートのようなダイアログボックスのインターフェイスで、画面上で要素を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/e0a80f7f-c4cd-18f7-d24c-8839d74a232d.png)

**2. Read from text file (テキストファイルから読み込み)**
要素がカンマ区切りと改行で仕切られたテキスト形式のデータファイルを読み込んで初期化します。配列の行、列のサイズはデータから決定されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/4c70000c-eeec-8458-e676-3fb109987875.png)


**3. Read from excel/csv file (Excel/CSVファイルから読み込み)**
ExcelファイルもしくはCSVファイルを読み込んで初期化します。シートの中から読み込むデータの範囲を選択するオプションがいくつかあります。配列の行、列のサイズはデータから決定されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/fefb28e7-3c5a-5b2f-6301-ce87a08b3cf9.png)


**4. Read from database (データベースから読み込み)**
ODBCの接続文字列を使って接続するデータベース (Microsoft Access, SQL Server, Oracle Database等)からデータを取ってきます。データ取得のためのSQL文を指定することができます。配列の行、列のサイズはデータから決定されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/fdbd402e-3a40-46f3-f457-e5475c7da46c.png)


特筆すべきは、ここでどの手段で初期化したかにより、後でVariable Operationコマンドで値をまとめて再初期化する際に、初期化を行った方法での再初期化が可能だということです。つまり、Array変数は厳密にいうとさらに上記の4種類に分かれていることになります。(変数マネージャで、それぞれのArray変数のOptionを見ると、種類がわかります。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/a1eb6c8e-4da6-38d2-ca69-f5b7c2d38685.png)

Variable Operationコマンドを使用したときの、各Array変数を再初期化しようとしたときのユーザーインターフェイスは、初期化の時と同じ画面となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/83ce0422-7115-1f66-bdf7-9273ad994d25.png)


**1. Value (値を直接指定)**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/5610c769-d70c-bb1d-1aca-f8b58e2cbeef.png)


**2. Read from text file (テキストファイルから読み込み)**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/611683d5-2d5c-810a-a067-81a209326457.png)


**3. Read from excel/csv file (Excel/CSVファイルから読み込み)**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/ce3cb23e-a3c1-5973-774b-be4922490853.png)


**4. Read from database (データベースから読み込み)**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/27da3f94-c94b-dcdc-7862-699a1dbfbbb8.png)


### Array変数を引数に持つコマンド
下記の他にもパラメータ指定ダイアログボックスの中のテキストボックスで`F2`を押すことで入力できる変数の候補にArray変数が含まれる場合があります。

* Clipboard - Assign To Clipboard
* If/Else - Variable
* Task - Run Task

### Array変数を出力するコマンド
Array変数は通常の変数を受け付けるコマンドには、ほとんどの場合選択肢として表示されます。**太字**のものは通常の変数は指定できずArray変数のみを受け付けるものです。

* Clipboard - Assign To Clipboard
* Clipboard - Assign From Clipboard
* Error Handling - Begin Error Handling
* Excel - Get Cells
* OCR
* Printers - Get Default Printer
* Prompt - Prompt for Value
* Prompt - Prompt for Yes/No
* Prompt - Prompt for Folder
* Services - Get Service Status
* SNMP - Get or Get Next or Walk
* SOAP Web Service
* String Operation (Split以外)
* Task - Run Task
* **Terminal Emulator - Get All Fields**
* Variable Operation
* Web Recorder - Execute JavaScript Function
* Window Actions - Get Active Window Title
* XML - Get Node(s) or Execute XPath Function or Validate XML Document or Save Session Data

# 参考記事

* [リスト型変数](https://docs.automationanywhere.com/bundle/enterprise-v11.3/page/enterprise/topics/aae-client/bot-creator/using-variables/list-type-variables.html?_LANG=jpjp) - Automation Anywhere 製品ドキュメント
* [配列型変数](https://docs.automationanywhere.com/bundle/enterprise-v11.3/page/enterprise/topics/aae-client/bot-creator/using-variables/array-type-variables.html?_LANG=jpjp) - Automation Anywhere 製品ドキュメント

[^1]: [Automation Anywhere が推奨する変数の命名規則](https://docs.automationanywhere.com/bundle/enterprise-v11.3/page/enterprise/topics/aae-developer/aae-variable-names.html?_LANG=jpjp)