Power Automateでファイルダウンロードの繰り返し処理もラクラク！

## 店舗ごとにデータダウンロードしなきゃいけない！？
どうも、アラ還サラリーマンです。
とある地方の某小売業の会社で、店舗運営全般を統括する部署の管理部門の担当をしています。
管理部門では、店舗事務方のサポートやデータ管理などなど、多岐にわたる業務を担当しています。

ある日、パート社員のＤさんから「困りごと」を相談されました。
Ｄさんはエクセルやパワーポイントを使って資料をまとめることに長けており、部署内でも頼られる存在です。
しかもＤさんの机の上には、デスクトップパソコンが２台鎮座しています。

そんなＤさんからの「困りごと」は、「店舗の数だけあるCSVファイルを１つに簡単にまとめられないか」というものでした。
話を聞く限りでは、Excelの「VBA」で実装できそうです。

しかしそもそも、どうして「店舗の数だけ」CSVファイルが存在するのでしょうか？
そのあたりをＤさんに詳しく聞いてみると、Ｄさんが資料作成のために使用しているシステムの仕様がそうなっているとのことでした。
そのシステムを使用すると、店舗のレジごとのデータ（売上や客数等）を検索・データ保存できます。
でも１店舗ずつしかデータを抜けないとは不便だなぁ・・・。

Ｄさんは店舗ごとにデータをCSV形式でダウンロードして、ファイル名も店舗名にして保存していました。
Ｄさんは、「ファイル名はコピペしているから時間はそんなにかかりませんよ」と言っていました。
いやいや、でもこれをやっている間は、何もできませんよ、Ｄさん！
こっちの方をなんとかせねば！

ということで、店舗ごとにデータダウンロードする方法について考えました。

## 今回使用したツール
**Power Automate Desktop**

https://www.microsoft.com/ja-jp/biz/smb/column-power-automate-desktop

上記のページから引用すると、

>Microsoft Automate Desktopは、ワーク フローを自動化するツールである Microsoft Power Automate の一機能です。デスクトップ操作を自動化するための機能を持ち、Windows 10 および Windows 11 ユーザーであれば、無償で利用することができます。
>Microsoft Excel や Microsoft Word で利用できるマクロや VBA と似ていますが、Microsoft Office アプリに依存せず、マウスをクリックするというような操作も含めて簡単に自動化できることが特長です。
>夜間やタイマーでの自動実行ではなく、ユーザーが実行ボタンを押す場合は無料で活用できます。使い方も簡単で、画面に表示されたアイコンをパズルのように組み合わせるだけで自動化したい操作を組み立てることが可能です。

とのこと。

自分自身も最近、 **Power Automate Desktop** を少し勉強したので、今回はこれを使用したいと思います。

## 実際にできた動画がこちら！

https://x.com/hiromae123/status/1833410988772835765

* 社内用のアプリケーションを使用しているので、ほとんどモザイクがかかっています（笑）
* フローには、社内システムにログイン後、いろいろ設定していますが、長くなるので動画ではカットしました。

**操作方法**
* デスクトップに **レジデータ** という名前のフォルダを用意します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842559/674cf259-9448-13c4-c7bb-39eea38e255e.png)

* **レジデータ** フォルダの中に **マスタ.csv** を入れておきます。
* **マスタ.csv** は、1列目は6桁の店舗コード、2列目は店舗名、3列目は保存時のファイル名を入力しています。（下のサンプルでは3店舗しかありませんが、実際は数十倍以上あります）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842559/65518510-98b9-c8b9-b470-6bdc0544c787.png)

* **Power Automate Desktop** の **レジデータ取得** フローを実行します。
* 出現するインプットボックスに何週目か入力します。この数字で **レジデータ** フォルダの中に **入力した数字w** というフォルダを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842559/5fd0911b-74b6-5d36-ef79-ab51c00e5507.png)

* 次に出現するインプットボックスに開始年月日を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842559/2b70067c-9593-b3e9-461e-2e1bc6febbe2.png)

* 次に出現するインプットボックスに終了年月日を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842559/a6b4c54a-5618-ef74-0141-c9270db4b4a8.png)

* あとは、**入力した数字w** フォルダ内に、上記で指定した期間のレジデータが、店舗ごとにcsvファイルで次々にダウンロードされます。
* 何らかの原因でダウンロードされなかった場合、失敗した店舗コード・店舗名を、最後にメッセージボックスで表示します。

## Power Automate Desktop のフロー説明
社内システムを使用しているため、一部隠している箇所もありますがご了承ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842559/2a254e55-ac0a-838e-815e-62ef7c812982.png)

**フロー3～4行目**
* メッセージボックス内に、改行を含めたコメント（このフローでは未処理の店舗）を表示したかったのですが、改行コードをみつけられず・・・。
ネット検索していたら下記の記事を発見し、参考にさせていただきました！

https://blog-tips.sekenkodqx.jp/2021/07/01/power-automate-desktop-new-line/

* 改行を変数 **newLine** に格納して使用します。
 
**フロー10～13行目**
* 開始年月日と終了年月日の日付をそれぞれ **yyyyMMdd** 形式のテキストに変換します。
 
**フロー14～25行目**
* 社内システムにログイン後、いろいろ設定しています。細かいことは割愛します。
 
**フロー26～60行目**
* **マスタ.csv** の行数分ループ処理します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842559/41ea3953-4e7d-2b10-cf2d-d5ec3ed33e16.png)
* 保存先の **CurrentItem** に、**マスタ.csv** の1行分が読み込まれます。
店舗コード、店舗名はそれぞれ、 **CurrentItem[0]** 、**CurrentItem[1]** のように指定します。
 
**フロー29～41行目**
* **店舗コード** 入力後、実際に反映した文字列（店舗コード＋店舗名）とを比較し、店舗コードが一致していれば次に進みます。一致していなければ同じ処理を3回まで繰り返し、一致しなければ、不一致店舗を **skipLog** に記録し、次の店舗に処理を移します。

**フロー43、45行目**
* テキストに変換した開始年月日と終了年月日をそれぞれ入力します。

**フロー49～54行目**
* データ検索後、必要なUI要素が出現するまで待機します。

**フロー55～59行目**
* データ保存ボタンを押され、デスクトップの **レジデータ** フォルダ内の **○○w** フォルダ内に、**マスタ.csv** の3列目のファイル名で保存されます。
* ファイル名はフルパスで指定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842559/f2da51ff-7d70-dd7e-3684-bd8b457e6162.png)

**フロー61～64行目**
* 社内システムからログアウトします。

**フロー65～70行目**
* 未処理店舗があれば『店舗名』を、なければ『ありません』とメッセージを表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842559/a0574ff8-6173-d1b0-fd0f-55e9dfe3ac44.png)

* 最後に『処理完了！』のメッセージを表示します。

## Ｄさんに実際に使用してもらいました！
さっそくＤさんの片方のデスクトップに **Power Automate Desktop** を設定し、フローを共有しました。
そしていよいよ **レジデータ取得** フローを実行！

しばらくパソコン画面を見つめながら、かたまっていたＤさん。
反応がうすいなぁと思っていたところ、「なんでこれ動くの？」「ほっといても大丈夫？」「すごい・・・」と、とても驚いた様子でした。
「これで片方のデスクトップで別の仕事ができますね。ありがとうございます！」とＤさんには満足していただけたようです。

## まだまだ改善の余地あり！
このフローでは、何回か実行しているとどういうわけかUI要素をうまくとらえられなくなり、途中で止まることがよく発生しました。なので **キーの送信** アクションを多用しています。
実は **フロー29～41行目** や **フロー49～54行目** は、最初につくったフローにはありませんでした。
実際にＤさんに試してもらったときは、最初につくったフローでもうまくいきました。
しかし自分のパソコンで実行したときに、ファイル名の店舗のレジデータと、ファイルの中身のレジデータが全然違っていたケースが３件発生しました。（ファイルの中身には店舗名を識別するデータがない！）
これを防ぐために上記を追加しました。
ひょっとすると、Ｄさんと私のこの社内用のアプリケーションの設定がどこか違うのかもしれません。（権限の問題か？）
まだまだエラーが発生しそうなところもありますが、都度、解決していきたいと思います。
一応使ってもらえるところまでたどり着きました！　やったー！！

ではでは、今日はこのへんで！

尚、**フローのソースコード（Robin）** については、社内用のアプリケーションを使用していることもあり、今回は割愛しました。