UiPathで呼び出し先のロボットからファイルを参照する

RPAエンジニア 小林

ロボットを動作させるとき、Excelファイルやテキストファイルなど、何らかの外部ファイルを参照するシーンがよくあります。 UiPathで外部ファイルを参照するには、適切なアクティビティに適切なファイルパスを渡せばよいのですが、Invoke Workflow File(ワークフローファイルを呼び出し)アクティビティで呼び出されたアクティビティからファイルを参照する際にはパスの扱いに注意が必要な点があります。 今回は、UiPathで呼び出し先のロボットからファイルを参照する方法について考えてみます。

ロボットから外部ファイルを参照するとき、ファイルが置かれている場所をフルパスで考えたほうがわかりやすい場合と、ロボットから見た相対的な位置(相対パス)で考えたほうがわかりやすい場合があります。 例えば、共有フォルダにあるExcelファイルをロボットで編集するなどの場合は、参照したいファイルの置き場所をフルパスで記述してロボットに参照させることが多いと思います。 一方で、ロボットを動作させる上で一時ファイルを書き出したり、スクリプトを実行したりするということもあります。 このようなロボットの一部とも言えるファイルは、ロボットから見た相対パスで参照する場所を考えたほうが都合がよいことが多いです。

スクリプトなどロボットの動作を補助するファイルを含んだプロジェクトの場合、参照するファイルの場所は相対パスで考えたほうがわかりやすい

しかし、相対パスでファイルを参照しているロボットを別のロボットから呼び出す場合、注意が必要な点があります。 それは、呼び出し先のロボットから見た相対パスでファイルパスを記述しても、実行時には呼び出し元のロボットから見たファイルパスで解釈されるという点です。例えば図のように、何らかのスクリプトを読み込むロボット「read.xaml」と、「read.xaml」を呼び出すロボット「Main.xaml」を考えます。(このとき、「read.xaml」と「Main.xaml」はそれぞれ別のフォルダに置かれているものとします。)

スクリプトを読み込むread.xaml(左)と、read.xamlを呼び出すMain.xaml(右)。このままMain.xamlを実行してもスクリプトは正しく参照されない。

「read.xaml」は、Read Text File(テキストファイルを読み込む)アクティビティでファイル名に「.\script\script1.js」を指定することで、同じフォルダ内にある「script」フォルダの中の「script1.js」ファイルを読み込んでいます。 この状態で「read.xaml」を直接実行すると、問題なく動作します。 一方でこのロボットを呼び出す「Main.xaml」を実行するとエラーとなってしまいます。 パス「.\script\script1.js」が「Main.xaml」から見たパスとして解釈されてしまい、本来読み込もうとしていたスクリプトが参照できないためです。

このような事態を避けるためには、呼び出し先のロボットが置かれているフォルダを取得できればよさそうです。 ロボットが置かれているフォルダは、Get Environmental Variable(環境変数を取得)アクティビティを使って取得できますが、この場合も問題は変わらず、呼び出し元のロボットがあるフォルダが取得されてしまいます。 そこで、ロボットを呼び出す際に呼び出し先のロボットがあるディレクトリのパスを渡すという方法をとります。 上記の例で言えば、「read.xaml」はフォルダ「D:\robot\read\」内にあるので、このパスを引数(図では「currentDir」)に渡し、「read.xaml」内でcurrentDirとそれに続くパス「script\script.js」を結合するようにします。 このとき、currentDirのデフォルト値には「.\」を入れておきます。こうすることで、「read.xaml」を直接実行した場合も、「Main.xaml」から呼び出した場合も正しく「script1.js」を参照することができます。 ファイルの参照方法としてはフルパスですが、呼び出し先のロボットを開発するときには相対パスだけを考えればよいというメリットがあります。

呼び出し元のロボットでは、呼び出し先のロボットが置かれているフォルダのパスを設定する
呼び出し先のロボットではフォルダパスを受け取る引数の既定値として「.\」を設定する

また、パスを結合する際には、Path.Combineメソッドが便利です。このメソッドを使うと、フォルダ名の後ろが\で終わっているかどうかにかかわらず、適切にパスを結合できます。 (Path.CombineはアクティビティではなくVB.NETのメソッドです。UiPath内でVB.NETの表現を使うことについて、詳しくはこちらの記事をご覧ください。)

Path.Combineメソッドを使うとファイルパスの結合が簡単にできる

今回は、UiPathで呼び出し先のロボットからファイルを参照するときの注意点を紹介しました。 「直接実行していたときには問題なかったのに、別のロボットから呼び出そうとすると動作しない!」という事態に陥らないために、適切にファイルパスの設定をしたいですね。