Automation Anywhere A2019で使える条件分岐/繰り返し処理などのフロー制御機能

Automation Anywhere A2019ではフローをドラッグ＆ドロップで構築していくことで業務を自動化するのですが、得られたデータの個数だけ同じ処理を繰り返したり (繰り返し処理)、得られたデータの条件によって処理を変えたり (条件分岐)といったこともやりたくなってくるでしょう。そのような場合、フローは単純に一方向に流れるだけでなく、分岐したりループしたり、時にはこれらの処理が入れ子になったりすることもあります。A2019ではどのような処理が可能なのかについてみていきます。

**環境**

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

# 1. ループ処理
**「ループ」**はRPAの処理で得られたデータの個数分/指定回数だけ繰り返したり、指定条件を満たす間ずっと繰り返しをすることができる便利なしくみです。ループ処理には**「ループ」「Continue」「Break」**の3種類のアクションがあります。

公式な説明は以下にあります。

* [[ループ] パッケージ](https://docs.automationanywhere.com/bundle/enterprise-v2019/page/enterprise-cloud/topics/aae-client/bot-creator/commands/cloud-loop-command.html?_LANG=jpjp) - 製品ドキュメント
    * [[ループ] アクションを使用する](https://docs.automationanywhere.com/bundle/enterprise-v2019/page/enterprise-cloud/topics/aae-client/bot-creator/commands/cloud-using-loop-action.html?_LANG=jpjp) - 製品ドキュメント

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/dd31c7c4-b392-54f0-3864-79d917a11e16.png)

**「ループ」**をドラッグ＆ドロップすると、**"折り畳み式の領域"** が作られ、その中にアクションを入れられるようになります。ループは入れ子にすることもできます。

ContinueやBreakはIf文と入れ子で利用した場合に、条件分岐した特定の枝の指定した個所で、繰り返しの最初に戻ったり (Continue)、ループの "折り畳み式の領域" を抜けて次の処理に移ったり (Break) することができます。

**フロー表示**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/de5785c2-157a-c1f6-bf29-abbd63ef0b6d.png)

**リスト表示**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/55b5ae15-402d-177f-f38f-1aae32263680.png)

右側の「アクションの詳細」パネルでは以下のようなオプションが利用できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/cd6b1a22-15aa-15a9-a07a-b45947e801e8.png)


### 1-1. データの個数分/指定回数だけ繰り返し
**Loop Type=反復子 (Iterator)**で利用できます。反復子のリストで利用できるオプション一覧は[[ループ] パッケージ](https://docs.automationanywhere.com/bundle/enterprise-v2019/page/enterprise-cloud/topics/aae-client/bot-creator/commands/cloud-loop-command.html?_LANG=jpjp)を参照してください。既定では「n回」になっています。実際にドロップダウンに出てくる表記は以下ですが、製品ドキュメントと訳語が違うものが結構あるので注意してください。

>**CSV/TXT**
>　CSV/TXTの各行に対して
>**Eメール**
>　メールボックス内の各Eメールに対して
>**Excelの基本操作**
>　For each row in worksheet
>**Excelの高度な操作**
>　For each row in worksheet
>**Office 365 Excel**
>　シートの各行
>**Office 365カレンダー**
>　カレンダーの各会議
>**XML**
>　XML Datasetの各ノードに対して
>**データテーブル**
>　テーブルの各行用
>**データベース**
>　SQLクエリデータセットの各行に対して
>**ファイル**
>　フォルダーの各ファイルに対して
>**フォルダー**
>　フォルダー内の各フォルダーに対して
>**リスト**
>　リストの各項目に対して
>**ループ**
>　n回
>　レコード内の各値に対して
>**辞書**
>　辞書内の各キーに対して
>　辞書内の各値に対して

ちなみに、この条件はパッケージSDKで独自に開発して追加することが可能です。興味がある場合は見てみてください。

* [Add an iterator in a custom package for Loop action](https://docs.automationanywhere.com/bundle/enterprise-v2019/page/enterprise-cloud/topics/developer/cloud-add-iterator-custom-package.html) - 製品ドキュメント

### 1-2. 指定条件を満たす間ずっと繰り返し
**Loop Type=While**で利用できます。Whileのリストで利用できるオプション一覧は[[ループ] パッケージ](https://docs.automationanywhere.com/bundle/enterprise-v2019/page/enterprise-cloud/topics/aae-client/bot-creator/commands/cloud-loop-command.html?_LANG=jpjp)を参照してください。実際にドロップダウンに出てくる表記は以下ですが、製品ドキュメントと訳語が違うものが結構あるので注意してください。

条件は11個まで並列に配置でき、And/Or (および/または)条件で関係付けることができます。

>**Boolean**
>　Boolean condition
>**Image Recognition**
>　画像ファイルが画像ファイルで検出されない
>　画像ファイルがウィンドウで検出されない
>　ウィンドが画像ファイルで検出されない
>　ウィンドウがウィンドウで検出されない
>　画像ファイルが画像ファイルで検出される
>　画像ファイルがウィンドウで検出される
>　ウィンドが画像ファイルで検出される
>　ウィンドウがウィンドウで検出される
>**Javascript**
>　Script is successful
>　Script is unsuccessful
>**Legacy Automation**
>　Web control exists
>　Web control does not exist
>　Window control is active
>　Window control does not exist
>　Window control exists
>　Window control is not active
>　Script is unsuccessful
>　Script is successful
>　Child window does not exist
>　Child window exists
>**Ping**
>　Pingが成功
>　Pingが失敗
>**Taskbot**
>　Task successful
>　Task unsuccessful
>**VBScript**
>　Script is successful
>　Script is unsuccessful
>**アプリケーション**
>　アプリケーションが実行されていません
>　アプリケーションが実行中です
>**ウィンドウ**
>　ウィンドウが存在する
>　ウィンドウが存在しない
>**データテーブル**
>　Data table is empty
>　Number of columns
>　Number of rows
>**ファイル**
>　ファイルの日付
>　ファイルが存在する
>　ファイルが存在しない
>　ファイルサイズ
>**フォルダー**
>　フォルダーが存在しない
>　フォルダーが存在する
>**リスト**
>　リスト変数
>**レコーダー**
>　オブジェクト
>**数字**
>　数字条件
>**文字列**
>　文字列の条件
>**日時**
>　Date Condition
>**辞書**
>　キーを確認
>　Check for a single value

ちなみに、この条件はパッケージSDKで独自に開発して追加することが可能です。興味がある場合は見てみてください。(If条件と同じものが出てきます)

* [Add a condition in a custom package for If condition](https://docs.automationanywhere.com/bundle/enterprise-v2019/page/enterprise-cloud/topics/developer/cloud-add-condition-custom-package.html) - 製品ドキュメント

# 2. 条件分岐
**「If」**は、指定条件を満たす場合と満たさない場合で別の処理を実施できるしくみです。Ifパッケージには**「If」「Else If」「Else」**の3種類のアクションがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/586f921b-3ed5-de2b-bdf0-6e7248b03583.png)

公式な説明は以下にあります。

* [[If] パッケージ](https://docs.automationanywhere.com/bundle/enterprise-v2019/page/enterprise-cloud/topics/aae-client/bot-creator/commands/cloud-if-command.html?_LANG=jpjp) - 製品ドキュメント

「If」をドラッグ＆ドロップすると、"折り畳み式の領域" が作られ、その中にアクションを入れられるようになります。Ifは入れ子にすることもできます。**Else If**は条件に満たない場合に次の条件分岐を定義できます。**Else**はいずれの条件にも合わない場合の処理を定義します。

**フロー表示**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/38bb2b22-c03c-b066-d05b-f47c247bb02a.png)

**リスト表示**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/c3afab0b-b36c-fa69-4b1c-d95eed072508.png)

**入れ子でさらに複雑なフローを作成**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/e6d954d4-fa5d-b967-be15-8c68a48e8961.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/106874d0-8ca2-714b-9250-b9e53881f2f9.png)

条件のリストで利用できるオプション一覧は[[ループ] パッケージ](https://docs.automationanywhere.com/bundle/enterprise-v2019/page/enterprise-cloud/topics/aae-client/bot-creator/commands/cloud-loop-command.html?_LANG=jpjp)を参照してください。実際にドロップダウンに出てくる表記は既出の「ループ」のWhileで出てくる条件のリストと同一です。

条件は11個まで並列に配置でき、And/Or (および/または)条件で関係付けることができます。

# 3. エラー処理
特定の箇所でエラーが発生した際に異常終了することを抑える目的で、エラー処理を施すのがお勧めです。v11を知っている方は、前は「Begin Error Handling / End Error Handling」で囲んだ領域に対してエラーが起こったら、あらかじめ用意されたエラー処理を行った後「Continue」「Stop Task」を選ぶ形式でしたが、A2019ではより進化して**「試行」「キャッチ」「最終」「スロー」**という4つのアクションを使うことができます。アクション名が日本語になっているので、何だこりゃ、と思うかもしれませんが、プログラミング言語でよくある **Try/Catch/Finally/Throw**です。(ここは英語の方がわかりやすいかもしれません)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/ec2d9de2-e191-658b-919c-82f4559043d0.png)
これらはエラーが起こった時の「条件分岐」として使うことができます。「キャッチ」の**"折り畳み式の領域"**の範囲がエラー処理を行う範囲、エラーが起こったら「キャッチ」の内容を実行、「最終」の内容はエラーが起きても起きなくても「試行」や「キャッチ」の内容が実行された後に実行されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/92c83af4-3f95-a249-7628-35fcd44027c6.png)

「スロー」は、任意の場所でエラーが発生したことにできるアクションです。これにより「キャッチ」の内容にジャンプすることができます。
A2019エラー処理については、以下の記事でより詳しい例が記載されているので参照してみてください。

『[Automation Anywhere - 【A2019】Error Handlingの紹介](https://licensecounter.jp/engineer-voice/blog/articles/20200729_AutomationAnywhere-A2019-ErrorHandling.html)』- C&S Engineer Voice

# 4. ステップ
最後に、フローの処理自体には影響を与えないのですが、見た目を整理するための**"折り畳み式の領域"**を作るアクションが「Step」です。詳細は別の記事『[Automation Anywhere A2019の「コメント」と「ステップ」で見やすいフローを作ろう](https://qiita.com/RPAbot/items/519a694ea9de622f679c)』で解説しているので参照してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/8e5ef4ed-55ff-078e-57f4-c586fc952063.png)