Power Automate Desktopで面倒なファイル名変換を一括処理！

こんにちは

今回は**Power Automate Desktop**（以後**PAD**と呼びます）を使った業務改善ツールを紹介します。

:::note warn
Power AutomateのWeb版では試していないのでその点ご容赦ください。
:::

## 作ったフローはこちら

今回組んだ処理は以下の2つです。

1. **`ファイル名の一括取得`**
1. **`ファイル名の一括変換`**

フローをソースコードにしておきましたので、コピペしてお使いください。

:::note warn
使用するフォルダとファイルは、実際に使用するフォルダに適宜変更してお使いください。
:::


<details><summary>PADでコードをコピペして使用する方法はこちらに書いておきました。</summary>

### フローのソースコードをコピーしてご自身の環境で使う方法

PADにソースコードを貼り付けて使用する手順は以下の通りです。

1. ソースコードをコピー
1. PADを開く
1. 新しいフローを作る
1. アクションを配置する場所（下の画像の赤枠部分）を選択し、コピーしたソースコードを貼り付ける
1. 各アクションの中身は自分用に編集する

4の補足下の赤枠の部分をテキトーにクリックし`「Ctrl + v」`や`「右クリック⇒貼り付け」`をすればOK
![ソースコード貼り付け場所.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467782/68983d80-0f8a-859e-afd8-2ac74132058f.png)

</details>

~~~md:ファイル名取得
Folder.GetFiles Folder: $'''「名前を変換したいファイルが保存されているフォルダパスを貼り付け」もしくは「右のアイコンをクリックしてそのフォルダを直接選択」''' FileFilter: $'''*''' IncludeSubfolders: False FailOnAccessDenied: True SortBy1: Folder.SortBy.Extension SortDescending1: False SortBy2: Folder.SortBy.Name SortDescending2: False SortBy3: Folder.SortBy.NoSort SortDescending3: False Files=> Files
LOOP FOREACH CurrentItem IN Files
    Variables.AddItemToList Item: CurrentItem.Name List: FileNameArray
END
Excel.LaunchExcel.LaunchAndOpenUnderExistingProcess Path: $'''「ファイル名変換リストエクセルのフルパスを貼り付け」もしくは「右のアイコンをクリックしてファイル名変換リストエクセルを直接選択」''' Visible: True ReadOnly: False Instance=> ExcelInstance
Excel.WriteToExcel.WriteCell Instance: ExcelInstance Value: FileNameArray Column: $'''A''' Row: 2
Display.ShowMessageDialog.ShowMessage Title: $'''ファイル名取得''' Message: $'''ファイル名をエクセルに記載しました''' Icon: Display.Icon.None Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: False ButtonPressed=> ButtonPressed
~~~


```ruby:ファイル名変換
Excel.LaunchExcel.LaunchAndOpenUnderExistingProcess Path: $'''「ファイル名変換リストエクセルのフルパスを貼り付け」もしくは「右のアイコンをクリックしてファイル名変換リストエクセルを直接選択」''' Visible: True ReadOnly: False Instance=> ExcelInstance
Excel.GetFirstFreeRowOnColumn Instance: ExcelInstance Column: $'''A''' FirstFreeRowOnColumn=> FirstFreeRowOnColumn
Excel.ReadFromExcel.ReadCells Instance: ExcelInstance StartColumn: $'''A''' StartRow: 2 EndColumn: $'''B''' EndRow: FirstFreeRowOnColumn - 1 ReadAsText: False FirstLineIsHeader: False RangeValue=> ExcelData
LOOP FOREACH CurrentItem IN ExcelData
    File.RenameFiles.Rename Files: $'''「名前を変換したいファイルが保存されているフォルダパスをここにコピペしてからかぎかっこを消す（かぎかっこの後にある\"\\%CurrentItem[0]%\"はそのまま残しておく）」\\%CurrentItem[0]%''' NewName: CurrentItem[1] KeepExtension: False IfFileExists: File.IfExists.DoNothing RenamedFiles=> RenamedFiles
END
Display.ShowMessageDialog.ShowMessage Title: $'''ファイル名変換処理''' Message: $'''できた！''' Icon: Display.Icon.None Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: False ButtonPressed=> ButtonPressed

```


## 実際に動かすとこんな感じ：動画
動画は実行ボタンをクリックした直後から始まっていますがご了承ください。

**ファイル名取得**
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Power Automate Desktopで、指定したフォルダ内のファイル名を一括取得 <a href="https://t.co/eT9ueqqZg7">pic.twitter.com/eT9ueqqZg7</a></p>&mdash; go west (@west_twitt) <a href="https://twitter.com/west_twitt/status/1688414558644539392?ref_src=twsrc%5Etfw">August 7, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

**ファイル名変換**
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Power Automate Desktopで、指定したフォルダ内のファイル名を一括変換 <a href="https://t.co/jnk8KHq7mh">pic.twitter.com/jnk8KHq7mh</a></p>&mdash; go west (@west_twitt) <a href="https://twitter.com/west_twitt/status/1688415029178355712?ref_src=twsrc%5Etfw">August 7, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


## これを作った背景
実は以前から職場の同僚に「**ファイル名を一個一個直すのがめんどくさい！どうにかならない？**」と言われていました。

というのも、その同僚の元には社内の色んな人から申請書やら提出物のpdfやらが毎日のように届くのですが、そのファイル名がバラバラで困っているとのことでした。
管理するためには、そのファイル名を **「社員番号　+　氏名」** のような規則正しい名前にする必要があるのですが、それを一個一個手作業でファイル名を変更していたそうです。

### とりあえずファイル名変換処理を作成してみた
そこで、とりあえず上の2つ目の動画で示したようなファイル名変換処理をPADで作成して使ってみてもらいました。（この時はファイル名取得処理は作っていませんでした）

とりあえず「これを使えばファイル名変換が一括でできますよ」
とだけ伝えて実際に使ってもらいました。
処理が動くと

「おお～」
と感動はしてくれたのですが、こちらから感想を聞く前に同僚から一言

**「すごいけど、これ結局変更前のファイル名を一旦全部手で打ち込まないといけないからめんどくさいよね」**

:::note warn
この時はまだファイル名取得の方の処理を作っていなかったので、下の画像のエクセルに、「変換前」のファイル名をいちいち手で打ち込む必要がありました。
:::

![ファイル名変換リスト 変換後も入力.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467782/6c79fd48-cff5-c4f6-4c10-7e029e80f1f4.png)


### ファイル名取得処理も追加してみた
ごもっともですね。
楽する処理を作っても、その準備がめんどくさければ意味がありませんね。

ということで今度は「変換したいファイル名自体も一括で取得してくれる処理」も作ってみました。
それが上で示した「ファイル名取得」処理です。

この2つの処理を再度試してもらったところ、同僚の感動レベルが明らかに跳ね上がりました。

**「これめっちゃ便利！！！」**

というわけで、みなさんの職場でも使えるかもしれませんので気になった方は試してみてください。


## フロー作成前の事前準備
では、ここから実装手順を説明します。
まずは以下の2点を用意します。

* 取得したファイル名リストを入力するためのエクセル
* フォルダ2種類


### 取得したファイル名を入力するためのエクセル
下の画像の様なエクセルを1つ作ってください。
実際のファイル名等はまだ何も入れなくて構いません。
![ファイル名変換リスト 入力無し.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467782/2bef2d4d-6f69-f4e2-62da-23a4d724f702.png)

### フォルダ2種類
上で作成したエクセルを入れておくフォルダと
名前を変換したいファイルを入れておくフォルダを
それぞれこんな感じで用意します。
![フォルダ作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467782/98d56d32-93f4-b639-aab5-ee8a1f68ca79.png)

**それぞれのフォルダの中身はこんな感じ**

**ファイル名変換リストを入れておくフォルダ**
さっき作ったエクセルを入れておきます。
![ファイル名変換リストのフォルダ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467782/83013173-a557-07d1-4742-77472fe831f6.png)

**変換したいファイルを入れるフォルダ**
画像の様に、実際に名前を変換したいファイルを入れておきましょう。

![変換したいファイル一覧.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467782/ee7bdf8b-88f6-fcca-60ee-47e67030165e.png)


## 実行1　ファイル名取得フロー
ここから実行する流れを説明していきます。
まずはファイル名取得フローの各アクションを設定しましょう。

もう一度、フローの全体像はこんな感じ
（フォルダ名は一部隠しています。）
![ファイル名取得　全体.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467782/3f0e6189-2766-bf23-75cb-4eb341311add.png)

**フォルダー内のファイルを取得**
先ほど作成した、**変換したいファイルを入れるフォルダ**を選択
![ファイル名取得　1フォルダー内のファイル名を取得.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467782/416201da-d5b3-924a-51a0-c3944fafe9fa.png)

**For each**
For eachで、フォルダ内の全てのファイルに対して処理を行います。
![ファイル名取得　2ForEach.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467782/4b1e6572-5808-f655-dd09-1ac76d2814b3.png)

**項目をリストに追加**（For Each内）
全てのファイル名を取得して、一時的に `リスト`というものに保管していきます。
リストの名前は好きに付けてOKです。（今回は「FileNameArray」という名前にしました。）
![ファイル名取得　3ファイル名をリストに追加.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467782/5f851206-5cbd-c400-bd7d-1446bb30269b.png)

**Excelの起動**
先ほど作った「ファイル名変換リスト.xlsx」を選択
![ファイル名取得　4Excelを起動.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467782/c1e53aeb-7c88-8f77-6141-e6e157f6d5b5.png)

**Excelワークシートに書き込む**
`書き込む値` 欄では、先ほど自分で名前を付けた「一時的にファイル名を保管するリスト」を選択

:::note warn
1行目にはヘッダーがあるので2行目以降に転記する設定にしています。
ヘッダーのサイズや、転記したい場所によって臨機応変に設定してください。
:::
![ファイル名取得　5ワークシートに書き込む.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467782/1457e222-30aa-0f9c-e523-12c7905c8a35.png)

**メッセージを表示**
完了したことをお知らせするためのメッセージ
あってもなくても処理には影響しません。
![ファイル名取得　6完了メッセージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467782/68279061-582d-fedb-6e9e-815a3ca47c2c.png)

## 実行2　変換後のファイル名を入力
上記のファイル名取得フローを実行すると、下の画像の様に「ファイル名変換リスト.xlsx」にファイル名が入力されます。
![ファイル名変換リスト ファイル名取得直後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467782/83e53c37-7a6d-830c-b3ed-fc507c0090a9.png)

その後、変換後のファイル名をそれぞれB列に入力してください。

**入力後**
今回はファイル名を規則的な名前に統一したいのでこんな名前に変換したいと思います。
![ファイル名変換リスト 変換後も入力.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467782/c1c9a8f2-3737-f6ac-65b3-02ec6a6619ae.png)


入力が完了したら、上書き保存して閉じます。



## 実行3　ファイル名変換フロー
最後にファイル名変換フローのアクションも設定して実行しましょう。
ファイル名変換フローの全体像はこんな感じ
（フォルダ名は一部隠しています。）
![ファイル名変換処理　全体.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467782/69d21d57-b625-4453-cb3a-63dca6102c1f.png)


**Excelの起動**
ファイル名変換リストエクセルを選択
![ファイル名変換処理　1Excelを起動.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467782/01427fc2-1f91-5bfa-14fe-0698d9c5ffe4.png)

**Excelワークシートから列における最初の空の行を取得**
変換するファイル数が毎回同じとは限らないので、「ファイル名変換リスト.xlsx」から最終行を取得しておく
![ファイル名変換処理　2ワークシートから最初の空白行を取得.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467782/9fcdb01a-c4f0-eb50-404b-c72c6691ca98.png)

**Excelワークシートから読み取る**
いま「ファイル名変換リスト.xlsx」には、変換前のファイル名と変換後のファイル名が入っている状態なので、これを一旦`リスト`化して取得します。

:::note warn
最終行は1つ前のアクションで取得した「最初の空白行」を用います。
取得したのは、最初に出てくる空白の行の行番号なので、実際のリストの最後の行は「1を引いた行番号」になります。
:::

![ファイル名変換処理　3ワークシートから読み取る.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467782/92771913-7c4d-4617-205d-d31f9dc520da.png)

**For each**
取得した`リスト`の要素（行数）の数だけ処理を繰り返します。
![ファイル名変換処理　4For Each.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467782/98ac0296-982b-1f3c-af99-4e817e4141af.png)

**ファイルの名前を変更する**（For each内）
ここは少しややこしいので以下に説明します。
分かる方は飛ばしてもらって構いません。

<details><summary>設定方法の詳細な説明はこちら</summary>

**名前を変更するファイルの設定**
PADに特定のファイルを認識してもらうためには、

`フォルダパス` + `\` + `ファイル名`

という形式の文字を入力欄に入れておく必要があります。

**フォルダパスの部分**
下の画像の赤枠部分には、ご自身で作成した「変換したいファイルを入れるフォルダ」のフォルダパスをコピペしてください。

**\の部分**
コピペしたフォルダパスの直後に直接`\`を入力します。

**ファイル名の部分**
今回、For eachで全てのファイル名を変換したいので、変換するファイル名は繰り返し処理の度に変わります。
なので、`ファイル名`に当たる部分には変数を入れ、繰り返し処理に対応できるようにします。

`CurrentItem`というのは、先ほどエクセルから取得した「変換前のファイル名と変換後のファイル名」のリストです。
`CurrentItem[0]`とすることによって、「そのリストの現在の行の1列目の値」を取ってきます。

:::note warn
リスト内の行番号と列番号は1ではなく0から始まります。
5つのデータを入れたリストの場合、最初の値は`リスト[0]`となり、最後の値は`リスト[4]`となります。
今回のケースでは、`CurrentItem`という変数がリスト内の特定の行全体を表すので、「その行の中で何列目にあるか」を[　]の中に記載すれば、その列番号の値を持ってくることが出来ます。
変換する前のファイル名はリスト内では0列目に存在しているので、[0]と付けます。
:::


**新しいファイル名の設定**
変換後のファイル名は、エクセル内では2列目、リスト内の数え方では1列目に当たるので
`CurrentItem[1]`とします。

</details>

![ファイル名変換処理　5ファイル名変換.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467782/4f721b56-aad7-83d4-9c0b-ca77898fa254.png)

**メッセージを表示**
完了したことをお知らせするためのメッセージ
これも必須ではありません。
![ファイル名変換処理　6完了メッセージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467782/0ab19bb4-12f2-4c88-9814-a98c8b21c3f7.png)


## 実行4　実際に動かしてみる：動画
上記の設定が完了したら実行ボタンをクリックしてフローを実行してみましょう。
下の動画の様にファイル名の取得、変換が出来るかと思います。

**ファイル名取得**
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Power Automate Desktopで、指定したフォルダ内のファイル名を一括取得 <a href="https://t.co/eT9ueqqZg7">pic.twitter.com/eT9ueqqZg7</a></p>&mdash; go west (@west_twitt) <a href="https://twitter.com/west_twitt/status/1688414558644539392?ref_src=twsrc%5Etfw">August 7, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

**ファイル名変換**
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Power Automate Desktopで、指定したフォルダ内のファイル名を一括変換 <a href="https://t.co/jnk8KHq7mh">pic.twitter.com/jnk8KHq7mh</a></p>&mdash; go west (@west_twitt) <a href="https://twitter.com/west_twitt/status/1688415029178355712?ref_src=twsrc%5Etfw">August 7, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


## 今後の改善点
今回紹介したのはあくまでも最低限の機能を持たせたフローです。
実際に実務で使う際には以下のようなことも考慮した方が良いかもしれません。

* 実行前にファイル名変換リストに入っている既存のデータをクリア
* エラーが起きた時の処理

この辺りはおいおいやっていくとして、今日の所はここまでにします。

それではまた