「A360で、フォルダ内の各フォルダに対してループして、さらにフォルダ内の各ファイルを開く場合はどうすればいいんですか?」的な質問がTwitterに挙がっていたので、回答してみます。
こんなフォルダとファイルを扱うよ
今回は例題として、こんなフォルダを扱います。
表にまとめるとこんな感じです。
フォルダ | フォルダパス | フォルダの中身 |
---|---|---|
親フォルダ | C:\RPA Test\フォルダ内ファイルの練習 | フォルダ1、フォルダ2、フォルダ3が入っている |
フォルダ1 | C:\RPA Test\フォルダ内ファイルの練習\フォルダ1 | ファイル1、ファイル2が入っている |
フォルダ2 | C:\RPA Test\フォルダ内ファイルの練習\フォルダ2 | ファイル3、ファイル4、ファイル5が入っている |
フォルダ3 | C:\RPA Test\フォルダ内ファイルの練習\フォルダ3 | ファイル6、ファイル7が入っている |
扱うフォルダとファイルの条件
今回は基本編として、「親フォルダに対して、配下の一層目は必ずフォルダが入っていて、二層目にファイルが入っている」という条件で扱います。
頭に「???」が浮かんだ方のために、図にするとこんなかんじです。
これが、以下のように階層が入り組んでいると、この記事で扱うBotそのままでは扱えませんのでご注意ください。
(でも基本のエッセンスは一緒です)
それでは、Here we go!!
手順
Step1:親フォルダのパスを格納する変数を作ろう
まず、親フォルダのフォルダパスを格納する変数を作りましょう。
Step2:ループを2つ作ろう
今回の処理構造として、親フォルダ直下のフォルダを回すループと、その各フォルダ配下のファイルを回すループが必要になります。
以下のように、まずはループの形を作りましょう。
Step3:外側のループに、フォルダを回す設定をしよう
外側のループは、親フォルダ直下のフォルダを回すループです。
以下のように設定します。
No | 項目 | 設定内容 |
---|---|---|
① | 反復子 | 「フォルダ内の各フォルダーに対して」を選択します |
② | フォルダパス | Step1で作成した、親フォルダのパスが格納された変数を設定します |
③ | フォルダ名をこの変数に代入 | フォルダ名を格納する変数(文字列)を作成して指定します (.20以降では、FolderNameという変数名が自動提案されます。変数名は変更も可能です。) |
こうしておくことで、③の変数に、ループのたびに「フォルダ1」「フォルダ2」などのフォルダ名が入ります。
Step4:内側のループに、ファイルを回す設定をしよう
内側のループは、フォルダ1、フォルダ2などの各フォルダの配下にあるファイルを回すループです。
以下のように設定します。
No | 項目 | 設定内容 |
---|---|---|
① | 反復子 | 「フォルダ内の各ファイルに対して」を選択します |
② | フォルダパス | Step1で作成した、親フォルダのパスを格納する変数と、Step3で作成したフォルダ名を格納する変数を、「\」つなぎで指定します。 「\」(バックスラッシュ)は、半角の円マークと同じです。 (半角モードで円マークを入力すると、画面上バックスラッシュになります) こうすることによって、1回目の処理では「親フォルダのパス\フォルダ1」、2回目の処理では「親フォルダのパス\フォルダ2」……というふうに、処理対象のフォルダを指定できるわけです。 |
③ | フォルダ名をこの変数に代入 | ファイル名と拡張子を格納する変数(ディクショナリ)を作成して指定します。 (.20以降では、FilesInFolderという変数名が自動提案されます。変数名は変更も可能です。) |
Step4補足:ディクショナリって……?!
上記の③で出て来た、「ディクショナリ」がよくわからない方のために補足します。
ディクショナリとは、以下のように「見出し」と「値」をセットで持っている変数の形のことです。
上記のようなディクショナリに対して、「価格表というディクショナリの中から、バナナの値を探してきてね」と指定すると、Botが「877だよ」と返してくれるというわけです。
ファイルをループする際に作成するディクショナリ変数も、要領は同じことです。
Step4で作成した変数には、以下のようなディクショナリが入ります。
この、「name」や「extension」といった見出しはどこから来るの? と思うかもしれませんが、Step4の③から変数を作ると、これらの見出しを持つディクショナリをA360が勝手に作ってくれるという仕組みです。
これに対して、「FileInFolderというディクショナリの中の、nameの値を探してきてね」と指定することによって、Botは今のループで処理中のファイルのファイル名を取り出してくれます。
同様に、「FileInFolderというディクショナリの中の、extensionの値を探してきてね」と指定すると、今のループで処理中のファイルの拡張子(docxとかxlsxとかtxtとか)を取り出してくれます。
この指定をどうやるかは、Step5で解説します。
Step5:ループしているファイルを使う
ここまでできれば、あとはループの中で作った変数を使って、実際のファイルを処理していくだけです。
ファイルパスを表示してみよう
試しに、各ファイルのフルパスを指定してみましょう。
上記のように、**「今処理しているファイルのフルパスを取り出す」**というやりかたさえわかれば、あとはこのファイルを開くなり閉じるなり、好きに処理するだけです。
(閉じるときはセッションで閉じるはずなので、ファイル名の指定はいりませんが)
ファイルのフルパスの指定の仕方は?
上記のメッセージボックスの指定内容(=ファイルのフルパスの指定の仕方)がわからない方のために補足をします。
要は、各Stepで作成した変数をつなぎあわせて、フルパスの文字列を作っているだけなのです。
いくつかの方法で説明するので、わかりやすい方法で理解してもらえればと思います。
説明①:理屈は知らんけど処理さえできればいい人向け。
理屈は知らーん! とにかく、処理さえできればいいんじゃー! という人は、各Stepでこのページにあるとおりに変数名を指定して、フルパスを取り出したい箇所では以下をコピペしてください。
$cInputFolderPath$\$FolderName$\$FilesInFolder{name}$.$FilesInFolder{extension}$
説明②:理屈はこういうことです
以下の指定方法と解説で、①②③を突き合わせてみてください。
【指定方法】
$①$\$②$\$③{name}$.$③{extension}$
【解説】
No | サンプルの変数名 | 説明 |
---|---|---|
① | cInputFolderPath | Step1で作成した、親フォルダのフォルダパスを格納する変数 |
② | FolderName | Step3で作成した、処理中のフォルダ名を格納する変数 (ループごとに、フォルダ1、フォルダ2などが入る) |
③ | FilesInFolder | Step4で作成した、処理中のファイル名を格納する変数 (これに{name}をつけるとファイル名、{extension}をつけると拡張子が取り出せる) |
説明③:理屈はこういうことです(図解版)
以上!
いかがでしたか?
わかりづらい点があれば、QiitaやTwitterなどでどしどしご指摘ください。
また、他にもAutomation Anywhereについてわからない点があれば、ぜひQiitaやTwitterなどでコメントをいただければと思います。