UiPath Blog
こんにちは。
UiPath株式会社の林です。
UiPathは.NET Framework との親和性が高く、ワークフローを作成する際に .NETの各種クラスを使用することができます。そのためUiPathで開発をおこなっていらっしゃる方の中には .NET Framework(以下、.NET)の開発に長けた方もいらっしゃるのではないでしょうか?
そんな .NETユーザーの方をターゲットに、.NETの機能を生かしたUiPathのワークフロー開発のTipsをお伝えいたします。
テーマの特性上、この記事は、.NET開発の経験があるプログラマー向けのやや高度な内容となっております。また、使用するUiPathのバージョンは2019 LTS といたします。
デリゲート
.NET での開発で切っても切れない機能がデリゲートです。
UiPathでも、デリゲートの型宣言こそできませんが、.NET既定のデリゲート型であるAction、Func などを使用することでデリゲート変数を作成することができます。
変数定義の変数の型に、作成したいデリゲートの引数の数に合致するAction、または Funcクラスを選び、引数並びに戻り値の型を型パラメータを指定することでデリゲート変数を定義可能です。
(戻り値がBoolean、IntegerとStringの二つの引数を使用するするデリゲート変数型の設定例)
例えば スイッチ(Switch)アクティビティで、四則演算記号が代入されさらた文字列変数opを受け取り、受け取った記号に合致する二項演算を行うメソッドをデリゲート変数fに代入する場合、下記のようになります。
上記のように、デリゲートに代入するメソッドを単一行のラムダ式で定義する場合は、代入(Assign)アクティビティの右辺にそのまま記述できます。
複数行のラムダ式を記述したい場合は、コードを呼び出し(Invoke Code)アクティビティを使用する必要があります。
(定義されたメソッドout_fを出力引数として設定し、呼び出し元のデリゲート変数に代入します)
一つ残念なお知らせがあります。UiPathでは、ラムダ式内でアクティビティの外側の変数を使用してクロージャーを形成してしまうと、実行時にエラーとなります。この制約があるため使いどころは限られてしまいますが、イベント的な処理を記述する際には、UiPathでも活用できるかと思います。
LINQ
ラムダ式が使えるということは、もちろんLINQ を使用して各種コレクション変数からデータを取り出すことも可能です。
UiPathでは各種データの格納に、System.Data.DataTableクラスをよく使用します。しかしながら、このDataTableから条件に合致するレコードを抽出したり、ソートしたり、あるいは、列を追加、削除するのはなかなか骨の折れる作業です。
データテーブルをフィルタリング(Filter Data Table)、データテーブルを並び替え(Sort Data Table)といったアクティビティを用意しておりますので、そちらを活用していただいてもよいのですが、LINQを使えば、一発でデータを加工することができます。
例えば、DataTable変数dtに下記のようなデータを追加するとします。
この中から、regionが"Tokyo"かつ、salaryが1,200以上のレコードをageの降順に並べて取得するとしましょう。
LINQのメソッド構文で記述すると、下記のようになります。
dt.AsEnumerable().Where(function(r) r("region").ToString = "Tokyo" AndAlso CType(r("salary"), Int32) > 1200).OrderByDescending(function(r) r("age"))
DataTableクラスのAsEnumerableメソッドで、LINQで操作可能なIEnumerableオブジェクトを取得すると、各種LINQメソッドでデータの取得条件を指定することができます。
今回の場合、Whereメソッドで取得するレコードの条件を指定し、OrderByDescendingメソッド(降順の場合。昇順の場合はOrderByメソッドを使用)でソート順を指定しています。
(LINQ全般の解説に関しましては、Microsoft社のサイト 統合言語クエリ (LINQ) (Visual Basic) 等をご参照ください)
繰り返し各行(コレクションの各要素) アクティビティの コレクション に上記のようなLINQ構文を記述すれば、簡単に意図した条件、順序でレコードを処理することができます。
(LINQで条件に合致したレコードを取得し、idを出力する例)
(条件に合致したレコードのidである、2と4を出力しています)
.NET連携アクティビティ
UiPathでは、より直接的に.NETのライブラリを操作するアクティビティも用意しておりますので、それらもご紹介いたします。
メソッドを呼び出し(Invoke Method)アクティビティ
メソッドを呼び出し アクティビティを使用すると、.NETクラスのメソッドを直接呼び出すことができます。Staticメソッドも、非Staticメソッドも呼び出すことができます。
もちろん .NETのメソッド自体は代入アクティビティ等でも使用することができるのですが、値を戻さない(戻り値がvoidの)メソッドの呼び出しは、このアクティビティの利用が便利です。
他にも便利な用法があります。それは、引数としてbyRef指定されているメソッドの呼び出しです。
例えば、.NET開発時に多用する各数値クラスの TryParseメソッドですが、代入(Assign)アクティビティの右辺などでは使うことができません。これは、TryParseメソッドの第2引数(パースした結果が格納される変数)がbyRefとなっているためです。
具体的な使い方を見ていきましょう。TryParseのような静的メソッドを呼び出す時はTargetTypeに型を指定し、インスタンスのメソッドを呼び出す時はメソッドを呼び出すオブジェクトをTargetObjectに指定し、呼び出すメソッドの名前をMethodNameに指定します。
引数は パラメーター プロパティ、戻り値は 結果 プロパティに記入します。
引数を パラメータ プロパティに指定する際、byRefのときは方向に注意してください。通常は方向を"入力"(既定)としますが、byRefのときは"出力"とし、値に参照する変数を指定します。
この例では、アクティビティ実行後、i(Int32)に123、b(Boolean)にtrue(Parse処理が正常に終了したことを表します)が代入されます。
コードを呼び出し(Invoke Code)アクティビティ
デリゲートの項でも触れましたが、コードを呼び出し(Invoke Code)アクティビティという、.NETのソースそのままズバリ記述することができるアクティビティもあります。
ワークフローが複雑になるようなロジックは、割り切って .NETで書いてしまうというのも一つの方法です。
おわりに
今回は .NETの各種機能のUiPathへの応用事例をお伝えいたしました。.NETのライブラリ・機能を使えばUiPathの開発がますます便利になるはずです。
UiPathでは、今後 .NET開発者待望の(?) C#言語への対応を予定しております。今回紹介したラムダ式も、C#であればより簡単に記述することが可能です。
ぜひ、ご期待ください。
プロフェッショナルサービス本部 テクニカルサービス第二部 プロフェッショナルサービス担当シニアマネージャー, UiPath