Automation Anywhere v11でMetaBotを作成する

# 概要
Automation Anywhere におけるMetaBotとは、再利用性が高い部分を切り出した、ロボットの「部品」(あるいはモジュール)です。このしくみがあるため、大規模なRPAプロジェクトでの変更管理の労力を大幅に削減することが可能です。オブジェクト(指向)型のしくみ、という風にいわれることもあります。

通常のRPAソフトウェアでも他のロボットファイル (Automation AnywhereでいうところのTaskBot)を呼び出したり、スニペットとしてよく使うロジックを保管しておくことができますが、MetaBotはよりモジュール性/部品化が高くメンテナンスがしやすくなっています。また、[Bot Store](https://www.automationanywhere.com/jp/products/botstore)と呼ばれるインターネット上 (または、将来的には企業内での)のマーケットプレイスでも配布されます。

より詳しい内容はこちらをご覧ください。

* [MetaBot の概要](https://docs.automationanywhere.com/bundle/enterprise-v11.3/page/enterprise/topics/aae-client/metabots/getting-started/aae-client-metabot-designer-overview.html?_LANG=jpjp) - 製品ドキュメント

この記事ではMetaBotを実際にどのように作っていくのかについて見てみます。

**注: A2019ではMetaBotは廃止され、代わりにJavaで作る「アクションパッケージ」を利用します。[SDK](https://docs.automationanywhere.com/bundle/enterprise-v2019/page/enterprise-cloud/topics/developer/cloud-create-package-overview.html?_LANG=jpjp)も提供されています。**

**利用環境**

* Automation Anywhere Enterprise v11.3.3
* Microsoft Visual Studio Community 2019 v16.4.5 (.NET Framework 4.7.2)

# 基本的なMetaBotを作成する

MetaBotを作る権限を持ったユーザーの場合、Enterprise Clientのナビゲーションウィンドウに「MetaBots」タブが表示されるので、クリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/9b8baacf-7430-85ff-2466-3988beffc8af.png)

すると、MetaBotの開発画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/485ba1bd-e14d-2c26-d48a-e4efdfd942d4.png)

「新規」ボタンをクリックすると、以下のウィンドウが表示されます。ここではアプリケーション固有のMetaBotを作成するのか、汎用的なMetaBotを作成するのかを選択します。「すべてのアプリケーション」を選択して名前に「MyMetabot」としていして「作成」ボタンをクリックしてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/889a53b6-d101-8879-813d-4b778d4e5f72.png)

すると**MetaBot Designer**が起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/527b8554-27ac-b275-a499-0cfb047f2c4b.png)

この画面では「アセット」と「ロジック」の2つのタブがあることに注目してみましょう。**「アセット」**には、このMetaBotで使われる様々なリソースファイルやDLLといった関連ファイルの一覧が表示されます。**「ロジック」**はMetaBotの動作ロジック、つまりメインのBotから呼び出せるサブルーチン/関数の一覧が表示されます。

ここでは「ロジック」タブをクリックして、ツールバーの「ロジックを追加」をクリックします。するとワークベンチが起動します。通常のTaskBotの場合とほぼ同じ見た目ですが、若干異なる部分があります。

* コマンド一覧はTaskBotのものと似ていますが、微妙に違っています。ないコマンド (例: Active Directory, Citrix Integration, IQ Bot)があったり、特別に追加されているコマンドがあったり (例: Import/Export Dataset)します。
* フィルターやBot依存関係パネルがありません。逆に、MetaBotに関連付けられているアセットを表示するパネルがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/d3a4aec8-b8ff-c04e-e744-f60ab98ea3e7.png)

MetaBotの開発を行う上で通常のTaskBotと大きく異なる点は**変数**、**アセット**、**画面の記録**の3つです。これらを順番に見ていきましょう。

### 変数のパラメータタイプ
変数マネージャーを開いて変数の作成/編集画面を表示すると、MetaBotの場合はTaskBotにはなかった「パラメータタイプ」という選択肢があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/18b215b9-c42c-10e1-ae6c-606c547ff418.png)

この選択肢は、「変数のスコープ」に関係します。MetaBotは常にTaskBotから呼び出して使うので、TaskBot側から見えるかどうか (つまり、MetaBotの中の関数の引数として見えるかどうか)をここで選択します。**None**を選ぶと、この変数はMetaBot内でのみ使われるローカル変数として働きます。**Input、Output、InputOutput**のいずれかを選ぶと、MetaBotの中の関数の引数として表示されます。それぞれ入力専用、出力専用、入出力両方に対応する選択肢です。必要に応じて使い分けましょう。

尚、これらの3つの選択肢を選ぶと「説明 (任意)」というフィールドが表示されますが、この説明は必ず入れるようにしましょう。MetaBotを使う段階になった時に、引数がどういう働きをしてどういう値の入出力が可能なのかをきちんと記載しておくことは重要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/b544134b-6e70-5f0b-5e61-98f18f798256.png)

実際にMetaBotをTaskBotから呼び出す場合に、以下のように見えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/5aea1311-1b73-a1d1-4160-03c18490d184.png)

### 基本的なロジックを作る
それでは、MetaBotを使ってとても簡単なロジックを作ってみましょう。
今回作るのは、入力した文字に対して、含まれている全角ひらがなと全角カタカナをすべて伏字 ("*")に置換した文字列を返す、というものです。
MetaBotのロジックには、以下の2つの変数を設定します。

* vInputString: ParameterType=Input、初期値=NULL
* vOutputString: ParameterType=Output、初期値=NULL

ロジックの中身:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/31aab0cb-4123-3088-3df0-c333943eb729.png)

オプションの詳細は以下の通りです。正規表現を使って全角ひらがなと全角カタカナにマッチさせ、置換後の文字を"*"としています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/b348cad5-064b-72c7-4e70-9b22a82a5f26.png)

そしてロジック名を「fuseji」で保存します。
すると、ロジックの画面に「Fuseji」が追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/ce5def0e-dcd6-0630-a66b-e48cf1dca0f5.png)


### MetaBotを呼び出す
では、作成したロジックを通常のTaskBotから呼んでみましょう。
TaskBotを新規作成して、左側のコマンドパネルで「MetaBot」を見てみると、「MyMetabot.mbot」という項目が追加されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/b84282a9-097a-337f-ad8a-84ae1bf5ad2e.png)
「MyMetabot.mbot」をアクションリストにドラッグ＆ドロップすると、以下のダイアログボックスが開きます。「MyMetabot.mbot」の中には「Fuseji」というロジック1つのみがあり、引数であるvInputStringとvOutputStringに値を指定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/008b4ccb-c95b-1138-7daf-6f2f700024e4.png)

ここで以下の値を代入します。

* vInputString: 本日は晴天ナリ
* vOutputString: `$Prompt-Assignment$`

そして、返ってきた結果をMessage Boxで表示するアクションリストを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/fd249192-ef05-cdc0-9048-d33f70987e92.png)

実行結果: 期待通り全角ひらがなと全角カタカナの部分が伏字になった文字列が返ってきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/18934023-a8ba-baac-4157-0b4f6a9bddc7.png)

# 画面の記録
ロジックの画面では、他に「ロジックを記録」というボタンがあります。これを実行すると、通常のレコーディングとは少し異なる形で、画面を「アセット」として取り込みつつ、記録した操作をロジックに落とし込むことができます。ただし、通常のTaskBotで使えるレコーディング (Smart Recorder、Screen Recorder、Web Recorder) と技術とは少し異なるようで、取り込んだ画像はMetaBot Designerの中で常にUI要素が分解された形で保持され、後からでも編集が可能になります。(MetaBot Designerの中ではコマンドの中にObject Cloningもあるので、別の方法として画面操作を記録することも可能です。)

1. 「ロジックを記録」ボタンをクリックすると、操作するウィンドウを選択する画面が開きます。ここでは「電卓」をクリックします。<br/>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/0c8c9e2b-d889-6dec-520f-d9b31f6e9536.png)
2. 電卓のウィンドウが前面に出てくるので、ゆっくり「C」ボタンにマウスカーソルをあわせてクリックします。その後、「1」から「9」まで順番にゆっくり同様に操作します。終わったら、画面右下に出ているレコーダーツールバーの「停止」ボタンをクリックします。<br/>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/901831ad-b684-1025-78db-15cd057547c6.png)
3. すると、ワークベンチに以下のようにアクションリストができあがります。<br/>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/c1494d5f-c8ce-6c5e-2d92-067531d7163e.png)<br/>アクションリストの内容:<br/>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/f67a31f9-2980-2ad8-dbdc-b729f6881643.png)

4. 「保存」ボタンをクリックして「calc」と名前を付けて保存します。すると、ロジックタブには「calc」のアイコンが、アセットタブには「電卓」のアイコンがそれぞれ追加されました。<br/>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/d74fac8f-f6e1-a12b-c9e3-5abd5debc4f6.png)

>メモ: 保存された「電卓」のScreen Configurationアセットは、開くとスクリーンショットの画像と、オブジェクトリストおよびオブジェクトの位置がすべて記録されて保持されており、オブジェクトかフィールドリストを選択すると、対応するものが表示されるようになっています。
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/48ef33bf-5d80-e3c7-2e83-a05512efd08c.png)


先ほどと同様にTaskBotからこのcalcロジックを呼び出してみましょう。新規でワークベンチを作成してMyMetabot.mbotをドラッグ＆ドロップしてcalcロジックのダイアログボックスを開きます。引数は特にないのでそのまま「保存」ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/f07bff24-3afb-ec5f-7806-06f1b2e31713.png)

すると、以下のアクションリストができあがります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/bb570ccb-c764-f789-5544-e4a4106a4236.png)

電卓を起動した状態でこのTaskBotを実行すると、電卓のボタンが順番に押されていく様子が再現されていることがわかります。

# ロジックとしてDLL を使う
Automation Anywhere 付属のアクションリストだけで簡単に作れないロジックを作りたい場合は、.NET プログラミング言語 (C#) のわかる開発者が DLL を開発して、MetaBotの中にそれをアセットとして含め、呼び出す仕組みが用意されています。DLL は1つだけでなく複数を呼び出すことも可能です。

1. Visual Studio Community 2019を開き、「新しいプロジェクトの作成」で「DLL」と検索して「クラスライブラリ (.NET Framework)」(C#) を選び、新しいプロジェクトを作成開始します。<br/>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/85cd0253-5c90-720c-05eb-2145e95d4cb4.png)
2. プロジェクト名/ソリューション名「JapaneseLibrary」で新規作成すると、IDEが開きます。<br/>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/cb9d595e-d2f0-a8b0-084f-b3951a7bd1f5.png)
3. IDEの「プロジェクト」-「参照の追加」で「Microsoft.VisualBasic」を追加します。<br/>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/518d5088-f02a-0c42-5457-f79e2d8d1472.png)

Class1.csをJpnLib.csに名前を変更して、以下の内容にします。

```CSharp:JpnLib.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.VisualBasic;

namespace JapaneseLibrary
{
    public class BotMthods
    {
        public String HiraganaToKatakana(String inputString)
        {
            return Strings.StrConv(inputString,VbStrConv.Katakana);
        }
        public String KatakanaToHiragana(String inputString)
        {
            return Strings.StrConv(inputString, VbStrConv.Hiragana);
        }
    }
}
```

4.ソリューションをビルドしてJapaneseLibrary.dllを作成します。

MetaBot Designerに戻り、アセットタブで「DLLの追加」ボタンをクリックして、JapaneseLibrary.dllのファイルを選択して追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/805a2901-d74d-35e1-0058-55c5560c0274.png)

### DLLをロジックに追加
「ロジックを追加」ボタンをクリックして新しいロジックを作成し、以下の変数を変数マネージャーで作成します。

|変数名|変数タイプ|パラメータタイプ|
|:--|:--|:--|
|vInputString|Value|Input|
|vReturnString|Value|Output|

次にアセットパネルを広げて、ツリービューでJapaneseLibrary.dll ⇒ JapaneseLibrary ⇒ BotMethods を開いて選択、関数`String HiraganaToKatakana(String inputString)`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/2856f182-299e-536c-6aff-fe88b4b15d1d.png)

引数のマッピングを行うパネルが表示されるので、赤枠のようにvInputString、vOutputStringをマッピングします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/5107ef9c-8579-4d41-e9ac-8ead4ab21e13.png)

マッピングパネルで「追加」ボタンをクリックすると、アクションリストに以下の1行が追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/b5f96592-1d99-f40e-5318-38a3ccb4fcd9.png)

保存ボタンをクリックし、「HiraganaToKatakana」という名前を付けてロジックを保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/6c722d5c-dc2b-eda5-1bdc-baac06658560.png)

### MetaBotを呼び出す
では、作成したロジックを通常のTaskBotから呼んでみましょう。
TaskBotを新規作成して、左側のコマンドパネルで「MetaBot」の「MyMetabot.mbot」をアクションリストにドラッグ＆ドロップすると、以下のダイアログボックスが開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/8f633854-d37b-2b81-6536-924a391532fd.png)

「MyMetabot.mbot」の中の「HiraganaToKatakana」というロジックを選択、引数であるvInputStringとvOutputStringに次の値を指定します。

* vInputString: あいうえおアイウエオ。本日は晴天ナリ。
* vOutputString: `$Prompt-Assignment$`

そして、返ってきた結果をMessage Boxで表示するアクションリストを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/3a58a8b5-693b-0ca9-3ecf-0b9366858db8.png)

実行結果: 期待通り全角ひらがなを全角カタカナに変換した文字列が返ってきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/3ad3e2d3-c155-ba80-2fe0-eabcc9b23815.png)

### 参考記事

* [1 つの DLL でシンプルな MetaBot を構築](https://docs.automationanywhere.com/bundle/enterprise-v11.3/page/enterprise/topics/aae-developer/aae-simple-meta-bot-one-dll.html?_LANG=jpjp) - 製品ドキュメント
* [シンプルな DLL の作成](https://docs.automationanywhere.com/bundle/enterprise-v11.3/page/enterprise/topics/aae-developer/aae-simple-dll-task.html?_LANG=jpjp) - 製品ドキュメント
* [DLL の構築およびテスト](https://docs.automationanywhere.com/bundle/enterprise-v11.3/page/enterprise/topics/aae-developer/aae-build-and-test-dlls.html?_LANG=jpjp) - 製品ドキュメント

# パッケージ化してBot Storeで配布することも可能
MetaBotは、さらにはインターネット上で他のユーザーに対しても配布が可能で、課金するオプションもあるようです。
アップロードするための情報は英語が多いですが、見つけられたものを以下にリストアップしておきます。

* [Bot Store 用の デジタルワーカー を構築](https://docs.automationanywhere.com/bundle/enterprise-v11.3/page/enterprise/topics/aae-developer/aae-develop-digital-worker.html?_LANG=jpjp)
* [Bot Store に投稿](https://docs.automationanywhere.com/bundle/enterprise-v11.3/page/enterprise/topics/aae-developer/aae-posting-to-bot-store.html?_LANG=jpjp)
    * [Bot Store への送信時のチェックリスト](https://docs.automationanywhere.com/bundle/enterprise-v11.3/page/enterprise/topics/aae-developer/aae-bot-packaging.html?_LANG=jpjp)
* [ベンダー提出契約](https://botstore.automationanywhere.com/jp-vendor-submission-agreement/)
* [How to Submit a Bot or Digital Worker to Automation Anywhere Bot Store (英語ビデオ)](https://www.youtube.com/watch?v=8YFJ7Q1lw2g) - YouTube

# まとめ
以上、MetaBotの使い方をざっと見てきましたが、部品としてうまく活用することで、Botを作成する際の効率、再利用性があがるのではないかと思います！活用していきましょう。

では、また！