【Automation Anywhere】フォルダ内のフォルダとファイルをループする方法（Automation360）


「A360で、**フォルダ内の各フォルダに対してループして、さらにフォルダ内の各ファイルを開く**場合はどうすればいいんですか？」的な質問がTwitterに挙がっていたので、回答してみます。

##こんなフォルダとファイルを扱うよ

今回は例題として、こんなフォルダを扱います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/62861333-ba14-3431-10ef-0f35af883c77.png)

表にまとめるとこんな感じです。

| フォルダ | フォルダパス | フォルダの中身 |
|:-----------|:------------|:------------|
| 親フォルダ | C:\RPA Test\フォルダ内ファイルの練習 |　フォルダ１、フォルダ２、フォルダ３が入っている |
| フォルダ１ | C:\RPA Test\フォルダ内ファイルの練習\フォルダ１ | ファイル１、ファイル２が入っている |
| フォルダ２ | C:\RPA Test\フォルダ内ファイルの練習\フォルダ２ | ファイル３、ファイル４、ファイル５が入っている |
| フォルダ３ | C:\RPA Test\フォルダ内ファイルの練習\フォルダ３ | ファイル６、ファイル７が入っている |

##扱うフォルダとファイルの条件

今回は基本編として、「親フォルダに対して、配下の一層目は必ずフォルダが入っていて、二層目にファイルが入っている」という条件で扱います。

頭に「？？？」が浮かんだ方のために、図にするとこんなかんじです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/36ae34f4-6d57-adea-66d2-28cf97cbe508.png)


これが、以下のように階層が入り組んでいると、この記事で扱うBotそのままでは扱えませんのでご注意ください。
（でも基本のエッセンスは一緒です）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/7653a602-a6bc-71fa-200a-8198ca01d851.png)

それでは、Here we go!!

##手順

### Step1：親フォルダのパスを格納する変数を作ろう

まず、親フォルダのフォルダパスを格納する変数を作りましょう。

こんなかんじです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/4c797b55-568f-192e-7eae-33640aa90cf3.png)

### Step2：ループを２つ作ろう

今回の処理構造として、親フォルダ直下のフォルダを回すループと、その各フォルダ配下のファイルを回すループが必要になります。

以下のように、まずはループの形を作りましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/cac7ae6c-b227-756a-c2ae-0fe9f7e6cc81.png)

### Step3：外側のループに、フォルダを回す設定をしよう

外側のループは、親フォルダ直下のフォルダを回すループです。
以下のように設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/f61e5a0e-8845-1a4a-3c48-7a6f9aacec32.png)

| No | 項目 | 設定内容 |
|:-----------|:------------|:------------|
| ① | 反復子 |「フォルダ内の各フォルダーに対して」を選択します |
| ② | フォルダパス | Step1で作成した、親フォルダのパスが格納された変数を設定します |
| ③ | フォルダ名をこの変数に代入 | フォルダ名を格納する変数（文字列）を作成して指定します<br>(.20以降では、FolderNameという変数名が自動提案されます。変数名は変更も可能です。) |

こうしておくことで、③の変数に、ループのたびに「フォルダ１」「フォルダ２」などのフォルダ名が入ります。

### Step4：内側のループに、ファイルを回す設定をしよう

内側のループは、フォルダ１、フォルダ２などの各フォルダの配下にあるファイルを回すループです。
以下のように設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/36436961-4f04-6d4f-bb47-140a786d44e3.png)

| No | 項目 | 設定内容 |
|:-----------|:------------|:------------|
| ① | 反復子 |「フォルダ内の各ファイルに対して」を選択します |
| ② | フォルダパス | Step1で作成した、親フォルダのパスを格納する変数と、Step3で作成したフォルダ名を格納する変数を、「\」つなぎで指定します。<br>「\」（バックスラッシュ）は、半角の円マークと同じです。<br>（半角モードで円マークを入力すると、画面上バックスラッシュになります）<br>こうすることによって、１回目の処理では「親フォルダのパス\フォルダ１」、２回目の処理では「親フォルダのパス\フォルダ２」……というふうに、処理対象のフォルダを指定できるわけです。 |
| ③ | フォルダ名をこの変数に代入 | ファイル名と拡張子を格納する変数（ディクショナリ）を作成して指定します。<br>(.20以降では、FilesInFolderという変数名が自動提案されます。変数名は変更も可能です。) |

#### Step4補足：ディクショナリって……？！

上記の③で出て来た、「ディクショナリ」がよくわからない方のために補足します。

ディクショナリとは、以下のように「見出し」と「値」をセットで持っている変数の形のことです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/546f0ac8-e555-a662-abb2-2617af82c53d.png)

上記のようなディクショナリに対して、「価格表というディクショナリの中から、バナナの値を探してきてね」と指定すると、Botが「877だよ」と返してくれるというわけです。

ファイルをループする際に作成するディクショナリ変数も、要領は同じことです。
Step4で作成した変数には、以下のようなディクショナリが入ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/d97f41f4-6fc8-758b-bc2a-bc908b7584a5.png)

この、「name」や「extension」といった見出しはどこから来るの？　と思うかもしれませんが、Step4の③から変数を作ると、これらの見出しを持つディクショナリをA360が勝手に作ってくれるという仕組みです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/5f32547f-054d-1664-9485-17f2521ca1d9.png)

これに対して、「FileInFolderというディクショナリの中の、nameの値を探してきてね」と指定することによって、Botは今のループで処理中のファイルのファイル名を取り出してくれます。

同様に、「FileInFolderというディクショナリの中の、extensionの値を探してきてね」と指定すると、今のループで処理中のファイルの拡張子（docxとかxlsxとかtxtとか）を取り出してくれます。

この指定をどうやるかは、Step5で解説します。

### Step5：ループしているファイルを使う

ここまでできれば、あとはループの中で作った変数を使って、実際のファイルを処理していくだけです。

####ファイルパスを表示してみよう

試しに、各ファイルのフルパスを指定してみましょう。

メッセージボックスに以下のように指定して動かしてみると……
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/f42371cd-cc76-8061-cc2d-3a80ba79bb62.png)

こうなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/e009249b-b660-a599-b80d-f7ae41e17cf0.png)

上記のように、**「今処理しているファイルのフルパスを取り出す」**というやりかたさえわかれば、あとはこのファイルを開くなり閉じるなり、好きに処理するだけです。
（閉じるときはセッションで閉じるはずなので、ファイル名の指定はいりませんが）

####ファイルのフルパスの指定の仕方は？

上記のメッセージボックスの指定内容（＝ファイルのフルパスの指定の仕方）がわからない方のために補足をします。

要は、各Stepで作成した変数をつなぎあわせて、フルパスの文字列を作っているだけなのです。

いくつかの方法で説明するので、わかりやすい方法で理解してもらえればと思います。

####説明①：理屈は知らんけど処理さえできればいい人向け。

理屈は知らーん！　とにかく、処理さえできればいいんじゃー！　という人は、各Stepでこのページにあるとおりに変数名を指定して、フルパスを取り出したい箇所では以下をコピペしてください。
`$cInputFolderPath$\$FolderName$\$FilesInFolder{name}$.$FilesInFolder{extension}$`

####説明②：理屈はこういうことです

以下の指定方法と解説で、①②③を突き合わせてみてください。

【指定方法】
`$①$\$②$\$③{name}$.$③{extension}$`

【解説】

| No | サンプルの変数名 | 説明 |
|:-----------|:------------|:------------|
| ① | cInputFolderPath |Step1で作成した、親フォルダのフォルダパスを格納する変数 |
| ② | FolderName | Step3で作成した、処理中のフォルダ名を格納する変数<br>(ループごとに、フォルダ１、フォルダ２などが入る)|
| ③ | FilesInFolder |Step4で作成した、処理中のファイル名を格納する変数<br>（これに{name}をつけるとファイル名、{extension}をつけると拡張子が取り出せる） |


####説明③：理屈はこういうことです（図解版）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/6047d41e-915c-473e-d0fc-bf283a93d23d.png)

#以上！

いかがでしたか？

わかりづらい点があれば、QiitaやTwitterなどでどしどしご指摘ください。

また、他にもAutomation Anywhereについてわからない点があれば、ぜひQiitaやTwitterなどでコメントをいただければと思います。