2020.03.05
今回は、UiPathでConfigファイルを使う際の説明を行っていきたいと思います。
UiPathでファイルパスを指定したり、何かを入力したりする際など、変数へ直にそれを打ち込んではいないでしょうか。
例えば「C:\hoge\fuga.csv」というファイルを指定する際に、代入アクティビティや変数パネル内で変数「piyo」に「”C:\hoge\fuga.csv”」と指定しているのを指します。
当然、このファイルパスが正しければ変数piyoを使用した際呼び出されるのはfuga.csvというファイルになります。
ただ、もしこのfuga.csvというファイルがhogeフォルダからhogehogeフォルダに移動となった場合はどうなるでしょう?
XAMLファイルを開き、該当箇所の変数(ここではpiyo)に規定されている「”C:\hoge\fuga.csv”」を「”C:\hogehoge\fuga.csv”」に直さなくてはエラーとなってしまいます。
Studioをすぐに編集できる環境であるならばこれでも問題はないでしょう。
ですが、Studioを編集できる人とロボットの使用者が異なっていた場合はそう簡単ではありません。
また、XAMLファイルを利用者が簡単に編集できていいのか、という保守性の問題も浮上します。
そこで作成されるのが、Configファイルです。
ConfigファイルはExcelで作成します。
もしロボットを運用するPC上にExcelが入っていなくても、ファイルがあればExcel上での作業は必要ないので動作の心配はありません。
読み込めれば問題ないです。
編集の際は、使用者のローカルPC上などで作業してファイルだけを入れてあげればよいでしょう。
Configファイルで必要なのは、「Key」と「Value」という列です。
ただ、それだけではどれが何を指すのか分からなくなってしまうでしょうから、その隣に説明用の列を作ってあげると親切です。
また、シート名も初期のSheet1などのままではなく、Settingなどわかりやすい名前を付けます。
「Key」と「Value」は二つで一つです。単語帳のように、ひとつのKey(単語)にひとつのValue(意味)があります。
Keyを呼び出してあげるとValueの値が入るように設定をします。
以下の画像はConfigファイルの中身のサンプルです。
Key、Valueの行は色を付けてわかりやすくしておくと良いでしょう。
Keyは変数と同じようにわかりやすいネーミングを付けます。
Valueのほうは、ここでは「String型(文字列)」「Int型(数字)」「Boolean値(True or False)」「Timespan値(時間)」を入れました。
これらの呼び出し方は後述いたします。
Configファイルを使うために、KeyとValueをセットにしてUiPathで読み込んであげなくてはなりません。
この際使うのが「Dictionary型」です。
「単語帳」のイメージがあるので近しいものを感じられるのではないでしょうか。
では、UiPathの画像を使用しながらConfigファイルの読込を説明いたします。
Configファイルの読込は、多くのロボットを開発する環境だと共通フローとしてInvokeできるようにすることが多いのですが、
今回はInvokeを考慮しないサンプルです。
Configファイル読込は「シーケンス」で作成します。
フローチャートを使うほど大型でも複雑でもないので、これで十分です。
代入アクティビティを使用し、新しい辞書型の入れ物を作成します。
わかりやすく「Config」という変数名を設定しました。
この段階ではまだGeneric型なので、これを辞書型にします。
(ダークモードのUiPathを使用しています。異なるのは色だけなので操作や中身は変わりません。)
ここを開いても辞書型は最初から出ていません。
一番下の「型の参照…」をクリックします。
種類選択画面が開くので、「型の名前(N):」の横にある入力ボックスに「dictionary」と入力します。
いくつか候補が出てくるのですが、選択するのは「mscorlib[4.0.0.0]」→「System.Collections.Generic」→「Dictionary<TKey, TValue>」です。
これを選択すると、先ほどの型の名前入力ボックスの下にKeyとValueに対して使用する型を選ぶプルダウンのボックスが出現します。
Excel上のConfigファイルは、Key値がStringなのでStringを、Value値には今回の場合様々な型が入っているのでObjectを設定します。
基本的にはString, Objectと覚えておいて問題はないでしょう。
設定するとConfig変数は下図のようになります。
これで左辺の設定は終了しました。
次に、右辺に移ります。ここには
「New Dictionary(of String, Object)」
と入力します。
これは「Config」という変数の中に新しい「文字列KeyとオブジェクトValueを持つ辞書の枠組み」を作成していることになります。
ちなみに左辺でValue値をObjectに設定しているため右辺もObjectを設定していますが、Stringで設定しているのならば右辺もStringにします。
枠組みができたので、Excelファイルから中身をこの辞書に入れていきます。
Excelファイルが一行ずつ書かれていることからわかるように、For Each Row(繰り返し(各行))アクティビティを使用します。
まずはConfigファイルを「ReadRange(範囲を読み込み)」アクティビティを使用してデータテーブルに出力します。
ファイルパスとシート名を設定し、プロパティパネルにある出力欄でデータテーブルを指定します。
(※システム→ファイル→ワークブックに含まれる「範囲を読み込み」アクティビティを使用しています)
ここではConfigファイルのパスを変数で指定しています。
プロジェクトのフォルダ(Main.xamlのあるフォルダ)にConfigというフォルダを作り、そこにConfigファイルが格納されている想定です。
また、この場合は相対パスで読み取ってくれます。
シート名も変更している場合は忘れずに設定します。
また、範囲に関してはシート全体を読み取ってもらうので設定不要です。
プロパティパネルのデータテーブル入力箇所で変数を作成すると自動的にDataTable型にしてくれます。
まずは繰り返しの設定です。
コレクションの欄には先ほど出力したデータテーブルを設定します。
これで、Configファイルを読み込んでくれる設定ができました。
読込をするのはKey列とValue列が空ではない行だけにしたいと思います。
そこで、条件分岐を中に入れてから設定値をセットしていきます。
少々わかりにくいので個別に解説します。
まず、条件分岐のコンディションに入れるのは
「Not string.IsNullOrEmpty(row(“Key”).ToString) and Not String.IsNullOrEmpty(row(“Value”).ToString)」
長くて難しく感じられますが、「and」の部分で区切りがあります。
前はKeyが空欄ではないかの判定、後はValueが空欄ではないかの判定です。
先頭についている「Not」はそのあとに続くものの否定となります。
「String.IsNullOrEmpty」はこの後にかっこ書きで指定する引数の文字列がNullか空である場合を指します。
「(row(“Key”).ToString)」は「Key列を文字列型にしたもの」を指します。
and以降はKeyがValueになっただけであることがわかると思います。
つまり、「文字列(”Key列”)がNullか空ではない、そして文字列(”Value列”)がNullか空ではない」ことがTrueのときにThenの処理をします、という意味になります。
Thenの処理ではKeyからValueを呼び出せるようにセットする処理を行います。
画像では切れてしまっているのですが、左辺には
「Config(row(“Key”).ToString.Trim)」
という式が入っています。
これは「変数Config(列(“Key”)を文字列に直して前後のスペースを消したもの)」を表しています。
Configファイルの中身を例にとって表すと、
「Config(“StringTest”).ToString.Trim」=「“文字列の表示をします。”」
が一行目を実行したときの結果になります。
こうしてあげることで、KeyとValueが結びつき、簡単に呼び出すことが可能になります。
この各行の処理をKey列とValue列の両方が空になるまで繰り返せばConfigファイルの読み込み設定は終了です。
まずは基本である、文字列の呼び出し方です。
メッセージボックスアクティビティを見ればわかるように、Config(“Key名”)で設定したValueの値である「文字列の表示をします。」が表示されていることがわかります。
しかし、最初にDictionary型で設定した通りこのValue値はObject型をとっています。
なので、条件分岐やInvokeで引数の既定値として使用する場合は「ToString」を使用して文字列にしてあげなくてはなりません。
また、ファイルパスも同様に.ToStringをつけることで使用が可能です。
最初にValue値を設定した際様々な型を設定しました。
そして、今呼び出したValueがObject型だ、というのもご理解いただけていると思います。
ではどうやってこの型を当てはめてあげるのか、に移っていきます。
・数字を使用したい場合(Int型)
わかりやすいように、
「Int型に設定したIntTestという変数にConfigファイルのKey:IntTestのValue(68が入っています)を代入する」
というケースを想定して説明します。
これはただConfig(“IntTest”)と入れた場合です。
エラーが出てしまっていて、曰く「ObjectからIntegerへの暗黙の型変換はできません」とのことです。
IntTestという変数がInt型なのに、ConfigのValueはObject型なので自動的にそれをInt型に変換することはできない、というわけです。
なので、明示的にこのConfig(“IntTest”)がInt型だといってあげれば解決します。
その際使用するのが「CInt」です。
代入の右辺には式エディタに表示されている式が入っています。
CIntでConfig(“IntTest”)をInt型に変換してあげることで、エラーが消えたことがわかります。
このままメッセージボックスにIntTestの変数を入れて実行すると、「68」が表示されます。
・TrueかFalseを判定したい場合(Boolean値)
先程文字列の条件分岐を行った際は文字列が含まれてるかどうか、という判定を行いました。
しかし、ConfigからTrueかFalseを判定したい、例えば本番環境とテスト環境で動作を分けたい場合、
本番環境はTrue、テスト環境はFalseとして分岐させたい場合もあるでしょう。
そこで使用するのが「CBool」です。
これを使用することで、ここの条件分岐のConditionは「Configの“BooleanTest”の値がTrue」という設定になります。
そしてConfigファイルでの設定はTrueになっているので、Thenに進んでメッセージボックスには「Trueです」という表示がされます。
・時間を設定したい(Timespan型)
リトライの間隔や待機(Delayアクティビティの使用には賛否がありますが、使用しなくてはならない場合もあるかとおもいます)などで使われているのがTimespan型です。
Excel上ではHH:mm:ssを文字列として書き込みます。
リトライや待機の間隔をそろえたい際、Configファイルに書き込んで一度に設定できるようにしたいときに使用するのが
Timespan.Parse
です。
これは文字列をTimespan型として表示する際に使うので、Configファイルからの呼び出しでは下図のような設定となります。
Configから呼び出すときに文字列型にしないとエラーが起きますのでご注意ください。
これで待機を実行すると、下のようになります。
5秒間の待機が発生したことがわかります。
Configファイルの値を変更すれば、10秒、1分といったように一括で管理することが可能です。
ユーザ側の編集も簡単かつ、同じ変数を使用していれば一括で管理できますのでConfigファイルの使用方法は覚えておくべきでしょう。
また、変数やじかに表示させるだけではなく、それぞれの表記方法を使用することでInvoke WorkFlowで呼び出したフローの引数へ既定値として設定させることも可能です(当たり前ではありますが、両方が同じ型であることに注意してください)。
以上、UiPathでConfigファイルを使う際の説明をしました。
Uipathの導入、運用についてお困りの際は
是非、弊社に問い合わせをしていただけたらと思います。