こんにちは
今回はPower Automate Desktop(以後PADと呼びます)を使った業務改善ツールを紹介します。
Power AutomateのWeb版では試していないのでその点ご容赦ください。
作ったフローはこちら
今回組んだ処理は以下の2つです。
ファイル名の一括取得
ファイル名の一括変換
フローをソースコードにしておきましたので、コピペしてお使いください。
使用するフォルダとファイルは、実際に使用するフォルダに適宜変更してお使いください。
PADでコードをコピペして使用する方法はこちらに書いておきました。
フローのソースコードをコピーしてご自身の環境で使う方法
PADにソースコードを貼り付けて使用する手順は以下の通りです。
- ソースコードをコピー
- PADを開く
- 新しいフローを作る
- アクションを配置する場所(下の画像の赤枠部分)を選択し、コピーしたソースコードを貼り付ける
- 各アクションの中身は自分用に編集する
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
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
実際に動かすとこんな感じ:動画
動画は実行ボタンをクリックした直後から始まっていますがご了承ください。
ファイル名取得
Power Automate Desktopで、指定したフォルダ内のファイル名を一括取得 pic.twitter.com/eT9ueqqZg7
— go west (@west_twitt) August 7, 2023
ファイル名変換
Power Automate Desktopで、指定したフォルダ内のファイル名を一括変換 pic.twitter.com/jnk8KHq7mh
— go west (@west_twitt) August 7, 2023
これを作った背景
実は以前から職場の同僚に「ファイル名を一個一個直すのがめんどくさい!どうにかならない?」と言われていました。
というのも、その同僚の元には社内の色んな人から申請書やら提出物のpdfやらが毎日のように届くのですが、そのファイル名がバラバラで困っているとのことでした。
管理するためには、そのファイル名を 「社員番号 + 氏名」 のような規則正しい名前にする必要があるのですが、それを一個一個手作業でファイル名を変更していたそうです。
とりあえずファイル名変換処理を作成してみた
そこで、とりあえず上の2つ目の動画で示したようなファイル名変換処理をPADで作成して使ってみてもらいました。(この時はファイル名取得処理は作っていませんでした)
とりあえず「これを使えばファイル名変換が一括でできますよ」
とだけ伝えて実際に使ってもらいました。
処理が動くと
「おお~」
と感動はしてくれたのですが、こちらから感想を聞く前に同僚から一言
「すごいけど、これ結局変更前のファイル名を一旦全部手で打ち込まないといけないからめんどくさいよね」
この時はまだファイル名取得の方の処理を作っていなかったので、下の画像のエクセルに、「変換前」のファイル名をいちいち手で打ち込む必要がありました。
ファイル名取得処理も追加してみた
ごもっともですね。
楽する処理を作っても、その準備がめんどくさければ意味がありませんね。
ということで今度は「変換したいファイル名自体も一括で取得してくれる処理」も作ってみました。
それが上で示した「ファイル名取得」処理です。
この2つの処理を再度試してもらったところ、同僚の感動レベルが明らかに跳ね上がりました。
「これめっちゃ便利!!!」
というわけで、みなさんの職場でも使えるかもしれませんので気になった方は試してみてください。
フロー作成前の事前準備
では、ここから実装手順を説明します。
まずは以下の2点を用意します。
- 取得したファイル名リストを入力するためのエクセル
- フォルダ2種類
取得したファイル名を入力するためのエクセル
下の画像の様なエクセルを1つ作ってください。
実際のファイル名等はまだ何も入れなくて構いません。
フォルダ2種類
上で作成したエクセルを入れておくフォルダと
名前を変換したいファイルを入れておくフォルダを
それぞれこんな感じで用意します。
それぞれのフォルダの中身はこんな感じ
ファイル名変換リストを入れておくフォルダ
さっき作ったエクセルを入れておきます。
変換したいファイルを入れるフォルダ
画像の様に、実際に名前を変換したいファイルを入れておきましょう。
実行1 ファイル名取得フロー
ここから実行する流れを説明していきます。
まずはファイル名取得フローの各アクションを設定しましょう。
もう一度、フローの全体像はこんな感じ
(フォルダ名は一部隠しています。)
フォルダー内のファイルを取得
先ほど作成した、変換したいファイルを入れるフォルダを選択
For each
For eachで、フォルダ内の全てのファイルに対して処理を行います。
項目をリストに追加(For Each内)
全てのファイル名を取得して、一時的に リスト
というものに保管していきます。
リストの名前は好きに付けてOKです。(今回は「FileNameArray」という名前にしました。)
Excelの起動
先ほど作った「ファイル名変換リスト.xlsx」を選択
Excelワークシートに書き込む
書き込む値
欄では、先ほど自分で名前を付けた「一時的にファイル名を保管するリスト」を選択
1行目にはヘッダーがあるので2行目以降に転記する設定にしています。
ヘッダーのサイズや、転記したい場所によって臨機応変に設定してください。
メッセージを表示
完了したことをお知らせするためのメッセージ
あってもなくても処理には影響しません。
実行2 変換後のファイル名を入力
上記のファイル名取得フローを実行すると、下の画像の様に「ファイル名変換リスト.xlsx」にファイル名が入力されます。
その後、変換後のファイル名をそれぞれB列に入力してください。
入力後
今回はファイル名を規則的な名前に統一したいのでこんな名前に変換したいと思います。
入力が完了したら、上書き保存して閉じます。
実行3 ファイル名変換フロー
最後にファイル名変換フローのアクションも設定して実行しましょう。
ファイル名変換フローの全体像はこんな感じ
(フォルダ名は一部隠しています。)
Excelワークシートから列における最初の空の行を取得
変換するファイル数が毎回同じとは限らないので、「ファイル名変換リスト.xlsx」から最終行を取得しておく
Excelワークシートから読み取る
いま「ファイル名変換リスト.xlsx」には、変換前のファイル名と変換後のファイル名が入っている状態なので、これを一旦リスト
化して取得します。
最終行は1つ前のアクションで取得した「最初の空白行」を用います。
取得したのは、最初に出てくる空白の行の行番号なので、実際のリストの最後の行は「1を引いた行番号」になります。
For each
取得したリスト
の要素(行数)の数だけ処理を繰り返します。
ファイルの名前を変更する(For each内)
ここは少しややこしいので以下に説明します。
分かる方は飛ばしてもらって構いません。
設定方法の詳細な説明はこちら
名前を変更するファイルの設定
PADに特定のファイルを認識してもらうためには、
フォルダパス
+ \
+ ファイル名
という形式の文字を入力欄に入れておく必要があります。
フォルダパスの部分
下の画像の赤枠部分には、ご自身で作成した「変換したいファイルを入れるフォルダ」のフォルダパスをコピペしてください。
\の部分
コピペしたフォルダパスの直後に直接\
を入力します。
ファイル名の部分
今回、For eachで全てのファイル名を変換したいので、変換するファイル名は繰り返し処理の度に変わります。
なので、ファイル名
に当たる部分には変数を入れ、繰り返し処理に対応できるようにします。
CurrentItem
というのは、先ほどエクセルから取得した「変換前のファイル名と変換後のファイル名」のリストです。
CurrentItem[0]
とすることによって、「そのリストの現在の行の1列目の値」を取ってきます。
リスト内の行番号と列番号は1ではなく0から始まります。
5つのデータを入れたリストの場合、最初の値はリスト[0]
となり、最後の値はリスト[4]
となります。
今回のケースでは、CurrentItem
という変数がリスト内の特定の行全体を表すので、「その行の中で何列目にあるか」を[ ]の中に記載すれば、その列番号の値を持ってくることが出来ます。
変換する前のファイル名はリスト内では0列目に存在しているので、[0]と付けます。
新しいファイル名の設定
変換後のファイル名は、エクセル内では2列目、リスト内の数え方では1列目に当たるので
CurrentItem[1]
とします。
メッセージを表示
完了したことをお知らせするためのメッセージ
これも必須ではありません。
実行4 実際に動かしてみる:動画
上記の設定が完了したら実行ボタンをクリックしてフローを実行してみましょう。
下の動画の様にファイル名の取得、変換が出来るかと思います。
ファイル名取得
Power Automate Desktopで、指定したフォルダ内のファイル名を一括取得 pic.twitter.com/eT9ueqqZg7
— go west (@west_twitt) August 7, 2023
ファイル名変換
Power Automate Desktopで、指定したフォルダ内のファイル名を一括変換 pic.twitter.com/jnk8KHq7mh
— go west (@west_twitt) August 7, 2023
今後の改善点
今回紹介したのはあくまでも最低限の機能を持たせたフローです。
実際に実務で使う際には以下のようなことも考慮した方が良いかもしれません。
- 実行前にファイル名変換リストに入っている既存のデータをクリア
- エラーが起きた時の処理
この辺りはおいおいやっていくとして、今日の所はここまでにします。
それではまた