Automation360：フォルダ内のファイルを一括処理するループの組み方

AutomationAnywhereのAutomation360で、フォルダ内のファイルを一括処理するループの組み方を説明します。

このループはIQ Botを動かすTaskBotでほぼ必ず使うので、この記事でもIQ Botを例に説明します。

初めて作るときは、裏に隠れた辞書変数の扱いでちょっと「？！」ってなる人がいるかもしれませんが、慣れればどうってことありません。

そんなわけで、さっそくやってみましょうー♪

#完成形はこんなかんじ

まずはできあがった姿を見てみましょう。こんなかんじです。

![00_完成形.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/33c2049d-ccc2-46af-76c8-600efe528889.jpeg)

ほらね、こわくない……！（風の谷のナ●シカ）

#作り方

……ということで作り方です。以下の手順で作ります。

- Step1：対象のファイルパスを変数に入れる
- Step2：ループを回す
- Step3：ループの中で処理させたい処理を行う

以下、めちゃくちゃ噛み砕きながら説明するので若干長いですが、わかる人は適度に飛ばしながら読み進めてください。
 
##Step1：対象のファイルパスを変数に入れる

いきなり変数の登場ですが、メンテ効率を考えずにとにかく「動けばなんでもいい」のであれば、変数は使わなくてもOKです。
ですが、ここでファイルパスを変数に入れておくことで、**処理したいフォルダが変わったときも修正箇所が１か所ですむ**という利点があります。

A2019では変数に型という概念が導入されていて、この点はプログラミングに慣れ親しんだ人を安心させる一方で、初心者をびびらせるポイントにもなっているようです。

ですが、以下の手順でやれば実はそんなに型を意識しなくてもBotが作れちゃいます。

まず、文字列の代入アクションを選択して、処理したいファイルが入っているフォルダのパスを指定します。
![01_ファイルパスを定義.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/2339835d-8b1b-9d59-3af0-191b8a27baba.jpeg)

そして、ちょっと見づらいですが変数名を指定するボックスの横のマークを押すと、以下のように、**該当のアクションで処理するために適切な型の変数を自動的に作ってくれます**。

この場合は文字列型ですが、下図のとおり、**「タイプ」のところに既に「文字型」が入っていて変えられないようになっています。**
![02_適した型の変数を作ってくれる.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/593ae06a-d0ae-3cf9-de97-a2dff2c20a0f.jpeg)

なので、やるべきことは変数に名前をつけるだけ。
ここでは`vFilePath`という変数名にしておきます。

変数名を入力したら、「作成して選択」をクリックします。その後、アクションの「適用」を押すのも忘れずに……。
![03_適用.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/ea1aab48-c132-eb8b-e2eb-9a7ba9f083c3.jpeg)

##Step2：ループを回す

次にループを回します。

ループのアクションを選択し、反復子は「フォルダーの各ファイルに対して」を選択します。
![04_ループを選択.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/7ce330cf-d89b-607b-c18e-46077b7f6000.jpeg)

そして、ループを回したいフォルダパスを指定。
ここは変数じゃなく、フォルダパスをベタ書きで指定してもいいのですが、今回はStep1で変数にフォルダ名を入れているので、その変数を指定します。

![05_フォルダパスを指定.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/69d025fc-c4b2-fa49-6c70-726966764f1c.jpeg)

「はい、Insertを実行します」を選択すると、フォルダパスのところに`$vFilePath$`と入っているはず。

そして、次が最大のポイントなのですが、ファイル名と拡張子を変数に代入します。
最大のポイントといってもやることは簡単で、Step1の③と同じように、代入する変数の右側にあるχのマークを押して、変数に名前をつけるだけです。

ここでは変数名を `vFileName` としておきます。
![06_ディクショナリ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/54473f83-1944-9f1c-c98e-b5095693237f.jpeg)

こちらも上記の図の通り、**χのマークを押してポップアップが出てきた瞬間に、すでに「タイプ」にディクショナリ（「サブタイプ」に文字列）が入っていて、変更できない**ようになっています。

そして、ここが裏仕様っぽくてちょっと最初は私も戸惑ったところなのですが、**ここで作ったディクショナリ型の変数に、ループの回ごとにフォルダ内のファイル名と拡張子が格納されます。このとき、ファイル名はname、拡張子はextensionというキーに紐づく値として格納されます。**

大事なことなのでもう一度言います。

**ここで作ったディクショナリ型の変数に、ループの回ごとにフォルダ内のファイル名と拡張子が格納されます。
このとき、ファイル名はname、拡張子はextensionというキーに紐づく値として格納されます。**

これの意味がわかった人もわからなかった人も、ひとまず次に進みましょう。

##Step3：ループの中で実行したい処理を行う

ここまででループを回す準備はできたので、あとは中身の処理を作っていくだけです。

今回はIQ Botの処理を例に説明します。

まずはIQ BotのUpload Documentを選択し、処理したいラーニングインスタンスをリストから選択します。
![07_LI選択.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/a9a7b819-d1e8-a077-718c-55e9a02a48d8.jpeg)

そして、次が最大のポイントです。
……あれ？　さっきも最大のポイント２回目……？？　ですが、先ほどの最大のポイントと関わる部分です。

処理するファイルのファイルパスを、以下のように指定します。

![08_ファイル名の指定.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/a36fd1a6-530a-2d97-571b-4f09d6a9dbe4.jpeg)

`$ファイルパスの変数名$\$ファイル名の変数名{name}$.$ファイル名の変数名{extension}$`です。
今回の例のとおりに変数名を指定している場合は、`$vFilePath$\$vFileName{name}$.$vFileName{extension}$` となります。
円マークとバックスラッシュはフォントの違いなので、どちらでも大丈夫です。

上記の内容は「参照」ボタンのすぐ左にあるχのマークからも入力できますが、`$vFilePath$\$vFileName{name}$.$vFileName{extension}$` をコピペした方が早いです。

`$ファイルパスの変数名$\$ファイル名の変数名{name}$.$ファイル名の変数名{extension}$` の内容を図解すると、こういうことです。

![09_かみ砕く.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/4fd25593-624e-8a8a-0852-6412b28c0815.jpeg)

もっと細かく言えば、こういうことです。

![10_もっと細かく.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/e878ccf7-af22-90bc-f076-e5961270a660.jpeg)

ファイル名の変数名の直後の`{}`の中に、どうして知らないうちに `name` や `extension` が入ってくるのかというと……！！

**Step2の⑧で作ったディクショナリ型の変数に、ループの回ごとにフォルダ内のファイル名と拡張子が格納され、
そのとき、ファイル名はname、拡張子はextensionというキーに紐づく値として格納されるから** です！（最大のポイントの伏線回収）

#補足

ループ処理の作り方は以上です。あとは保存して実行するのみ……！　ですが、以下に補足を書いておきます。

##初回実行時はデバイスの登録が必要

初回に実行する場合はデバイスの登録が必要になります。

デバイス登録のやりかたは、[公式ドキュメントサイト](https://docs.automationanywhere.com/bundle/enterprise-v2019/page/enterprise-cloud/topics/control-room/devices/cloud-add-local-device.html?_LANG=jpjp)を参考に。
うまくいかない場合は、[こちらの記事](https://qiita.com/RPAbot/items/f2dc74ce269090336c29)も参考にしてみてください。

##変数の型について

A2019の変数の型について詳しく知りたい方は、SB C&Sさんがやっている以下のブログが参考になると思います。
[【外部リンク】Automation Anywhere -【A2019】変数](https://licensecounter.jp/engineer-voice/blog/articles/20200226_AutomationAnywhere-A2019-Variable.html)

以上です！