【Power Automate Desktop】選択したフォルダ内のファイル情報一覧をエクセルへ書き出す(+各ファイル名にハイパーリンクを設定)
- 1.やりたいこと
- 2.実践① フロー作成 ~ エクセル見出し行の書き込み・変数の設定
- 3.実践② ループ処理: ファイル情報の書き込みとハイパーリンク設定
- 4.実践③ キーの送信:エクセルシートの書式調整他
- 5.実践④ エクセル名前を付けて保存:パスからフォルダ名を抽出し付加
- 6.フローの実行
- 7.最後に
1.やりたいこと
下図に記載の通り、選択したフォルダ内(サブファルダを含む)の各種ファイルの情報を取得してエクセルに書き出し保存します。また、各ファイル名には各々のファイルパスをハイパーリンクとして設定し、ファイル名をクリックすると各ファイルが開くようにします。で、この一覧を使って何をしたいか・何を管理したいかについては明確には考えていません。今後、電子帳簿保存法の関係等で使える場面が出てくるかもしれません。
【PADフロー作成のポイント】
・各ファイル情報は、For eachでCurrentItemのプロパティから読み取る。
・ハイパーリンク、エクセルの列幅調整等は「キーの送信」で処理。
・エクセルファイル保存時に使用する元フォルダの名前は、「テキストの解析」等
で抜き出す。
2.実践① フロー作成 ~ エクセル見出し行の書き込み・変数の設定
トップ画面から、新しいフローをクリックします。
任意の名前を付けて作成ボタンをクリックします。
画面左のアクション一覧からフォルダ→特別なフォルダーを取得 をダブルクリック(又は真ん中のフロー詳細へドラッグ&ドロップ)します。このアクションは以降のファイル選択等の際に「初期フォルダ」を設定するために変数化しておくものです。
ここでは、特別なフォルダ―の名前: デスクトップ を選択します。特別なフォルダーのパス:は自身のデスクトップのパスが自動設定されます。生成された変数はデフォルトの SpecialFolderPath のままとし、保存します。
【対象フォルダを選択をするためのダイアログ設定】
アクション一覧 → メッセージボックス → ファイルの選択ダイアログを表示 をダブルクリックします。
下図の通り入力し保存します。
ダイアログの説明: 対象のフォルダを選択(任意のテキスト)
初期フォルダ:%SpecialFolderPath% (右端の{X}をクリックし、変数名を選択)
フォルダ―選択ダイアログを常に手前に表示する:オン
生成された変数・ SelectedFolder(初期値)のままとする。
【対象フォルダ内のファイルを取得】
アクション一覧 → フォルダー → フォルダー内のファイルを取得 をダブルクリック。
下図の通り入力し保存します。
フォルダー: %SelectedFolder% (右端の{X}をクリックし、変数名を選択)
ファイルフィルター:*
サブフォルダを含める:オン(オフにしてもかまいません)
生成された変数・ Files(初期値のまま)
【ファイル情報を書き込むエクセルを起動】
アクション一覧 → Excel → Excelの起動 をダブルクリック
下図の通り入力し、保存します。
Excelの起動:空のドキュメントを使用 を選択
インスタンスを表示する:オン
※このあと、「キーの送信」を使用してエクセルを操作するため、ここは必ずオンにしておく必要があります。
生成された変数・ExcelInstance(初期値)
次のアクションについては、一見意味のないように見えるのですが、後述のハイパーリンクをキーの送信で設定するにあたり、これを入れておかないとうまくフローが進まなくなってしまうため、設定するものです。
アクション一覧 → UIオートメーション → ウィンドウにフォーカスする をダブルクリック
下図の通り入力し、保存します。
ウィンドウの検索モード:タイトルやクラスごと を選択
ウィンドウタイトル: BOOK1-Excel を選択
ウィンドウクラス:入力不要
※ここで、ウィンドウタイトルをBOOK1としています。つまり、このフローで開いたExcelファイルはこの時点でBOOK1である必要があります。よって、このフローを実行する際に別ファイルでBOOK1(未保存の新規ブック等)が開かれているとうまく処理ができませんので気をつけてください。
【Excelに見出し行を書き込む】
エクセルファイルの一行目に見出しを書き込みます。今回、書き込むファイルの情報は次の通りです。見出し名は日本語でも構いませんが、わかり易いよう後述のファイルプロパティ名と合わせています。また、ファイルのプロパティで取得できる情報は今回書き出すものがすべてではありませんので必要に応じて追加・変更してください。
アクション一覧 → Excel → Excelワークシートに書き込み をダブルクリック
下図の通り入力し保存します。
Excelインスタンス: %ExcelInstance% を選択
書き込む値: Directory を入力
書き込みモード:指定したセル上 を選択
列: 1
行: 1
2列目以降はほぼ同様の処理となりますので以下画像の貼り付けのみとします。
【ループ処理用の変数(行数)を設定】
アクション一覧 → 変数 → {x}変数の設定 をダブルクリック
下図の通り入力し保存します。
設定: RowCount とします(任意の値)
宛先: 2 (Excelシートへの書き込みは2行目からである為、初期値2行目とする)
ここまでで作成したフローは以下の通りです。
3.実践② ループ処理: ファイル情報の書き込みとハイパーリンク設定
【ループ処理の設定】
アクション一覧 → ループ → For each をダブルクリック
下図の通り入力し保存します。
反復処理を行う値:%Files% (右端の{X}をクリックし、変数名を選択)
生成された変数・ CurrentItem(初期値)
【ファイル情報をExcelへ書き込む】
アクション一覧 → Excel → Excelワークシートに書き込み をダブルクリック
下図の通り入力し保存します。
Excelインスタンス:%ExcelInstance% (右端の{X}をクリックし、変数名を選択)
書き込む値:%CurrentItem.Directory% と入力
※変数CurrentItemはFiles変数を格納したものであり、ファイルのデータ型プロパティを持っています。変数のデータ型のプロパティについては公式のリンクを参照願います。
書き込みモード: 指定したセル上 を選択
列: 1
行: %RowCount% (右端の{X}をクリックし、変数名を選択)
2列目以降はほぼ同様の処理となりますので以下画像の貼り付けのみとします。
書き込む値のCurrentItemのプロパティに注意してください。
【ハイパーリンク設定に伴うセル選択】
このアクションにより、最初の行のファイル名(Name列)が選択された状態になります。
アクション一覧 → Excel → Excelワークシート内のセルをアクティブ化 をダブルクリック
下図の通り入力し保存します。
アクティブ化:絶対位置で指定したセル を選択
列:2
行:%RowCount%
この後「キーの送信」を使ってエクセルを操作する場面がいくつかありますが、通常エクセルで使用するショートカットキーを使います。エクセルのショートカットがある程度頭に入っていた方が理解が早いと思います。
【ハイパーリンクを設定】
アクション一覧 → マウスとキーボード → キーの送信 をダブルクリック
下図の通り入力し保存します。
送信するテキスト:{Control}({K}) と入力します。
※キーボードのCtrl+K はエクセルの「ハイパーリンクの挿入」のショートカットキーです。
キー入力の間隔の遅延:100 とします。デフォルトの10だと速すぎてうまく入力ができない場合がある為、100としました。このあたりは、実際にテストしながら調整していけばよいと思います。
テキストをハードウェアキーとして送信します:オフ
【補足】
前述のCtrl+K をエクセルで送信すると下図のダイアログが表示されます。カーソルは「アドレス」の箇所に初期セットされるため、次のPADアクションでは、ファイルパスを送信します。
再度、「キーの送信」アクションから以下の通り入力し保存します。
送信するテキスト: %CurrentItem.FullName%
※FullNameプロパティとすることでファイルパスが送信されます。
再度、「キーの送信」アクションから以下の通り入力し保存します。
送信するテキスト: {Return}
※{Return}= Enterキーとなります。これを送ることで「ハイパーリンクの挿入」ダイアログのOKボタンが押下されたことになります。
【補足】
上述の「キーの送信」アクションでは、3つのアクションを分割して登録しました。1つのアクションでキーを続けて入力することも可能ですが、予期せぬエラー等に対応するためにアクションを分割してひとつひとつの挙動を確認しながら進めるのが無難だと思います。
【RowCount変数(行数)のカウントアップ】
アクション一覧 → 変数 → 変数を大きくする をダブルクリックします。
下図の通り入力し保存します。
変数名: %RowCount% (右端の{X}をクリックし、変数名を選択)
大きくする数値: 1
このループ処理の項目で作成したフローは下図の通りとなります。
4.実践③ キーの送信:エクセルシートの書式調整他
これまでに作成したフローを実行すると、下図のエクセルが出来上がります。想定通りに書き込みはできていますが、列幅が初期のままですので入力値が見えません。また、Sizeが桁区切りでなくわかりにくいため調整します。
【Size(D列)を桁区切りスタイルへ】
アクション一覧 → マウスとキーボード → キーの送信 をダブルクリック
順番として、①D列を全選択し、②D列を桁区切りスタイルに変更したいと思います。この時点で、エクセルシート上のカーソルはB11セル(B列の最終行)にありますので、次のキーの送信で右矢印キー(→)を2回押下し、Clrl + Spaceキー でD列を選択するようにします。
送信するテキスト: {Right}{Right}{Control}({Space})
次に、Ctrl + Shift + 1 のショートカットで桁区切りスタイルにします。
送信するテキスト: {Control}({Shift}({D1}))
※注意点:「1」とそのまま入力するとうまくいかないため、1のキーを送信するときは {D1} と入力します。
【列幅の自動調整】
①Ctrl+A でセルを全選択し
②Alt + H 、O、I で列幅を自動調整します。
【補足】
参考まで、前述の一連のキーの送信をエクセルで操作した場合の挙動を以下画像で貼り付けておきます。
この後、エクセルファイルを保存する前に、アクティブセルをA1にするためにCtrl+Home を入れたいのですが、テストしたところなぜかうまく動作しなかったので遅延処理をはさみました。
アクション一覧 → 遅延 → Wait をダブルクリック
期間: 1(秒)を入力し保存します。
アクション一覧 → マウスとキーボード → キーの送信 をダブルクリック
下図の通り入力し保存します。
送信するテキスト: {Control}({Home})
5.実践④ エクセル名前を付けて保存:パスからフォルダ名を抽出し付加
最後に作成したエクセルファイルに名前を付けて保存するのですが、そのエクセルファイル名には対象フォルダの名前を含めたいと思います。フォルダ名単体はプロパティ等からそのままとることはできない為、少し工夫しました。一旦概要を下図にまとめましたので内容を頭に入れたうえでフローの処理に進んでください。
アクション一覧 → テキスト → テキストの解析 をダブルクリック
下図の通り入力し保存します。
解析するテキスト:%SelectedFolder.FullName%(右端の{X}をクリックし、変数名を選択)
検索するテキスト: \
正規表現である:オフ
解析の開始位置: 0
最初の出現箇所のみ:オフ(すべての出現箇所を取得します)
大文字と小文字を区別しない:オフ
生成された変数・ Positions(初期値)
アクション一覧 → 変数 → リストを逆にする をダブルクリック
逆にするリスト: %Positions% とし保存します。
アクション一覧 → テキスト → サブテキストの取得 をダブルクリック
下図の通り入力し保存します。
元のテキスト:%SelectedFolder.FullName%
※対象フォルダのフォルダパスとなります。ちなみにCurrentItem.FullNameで取得すると最終処理がサブフォルダだった場合にズレが生じてしまいます。
開始インデックス: 文字の位置 を選択
文字の位置: %Positions[0] + 1%
長さ: テキストの末尾 を選択
生成された変数・ FolderName に変更します。
アクション一覧 → Excel → Excelを閉じる をダブルクリック
下図の通り入力し保存します。
Excelインスタンス: %ExcelInstance% を選択
Excelを閉じる前: 名前を付けてドキュメントを保存 を選択
ドキュメント形式: 既定(拡張機能から) を選択
ドキュメントパス: %SpecialFolderPath%\%FolderName%_ファイル情報.xlsx
※デスクトップに、対象フォルダ名 + _ファイル情報 の名前で保存する設定にしています。
これでフローの作成は完了です。ループ処理の後から最後までのフローは下図の通りとなります。
6.フローの実行
前項までで作成したフローを保存して一旦閉じ、トップ画面から作成したフローを実行します。
対象のフォルダを選択し、OKをクリックします。
エクセルが起動し、書き込みがされます。下図は書き込み途中の処理です。ちょうど最終行のファイル名にハイパーリンクを挿入しているところです。
正常に処理が完了し、完了の通知が表示されました。
デスクトップにエクセルファイルが作成されています。
エクセルファイルを開き、ハイパーリンクが正しく設定されているか確認するため、試しにリンクをクリックしてみます。
ハイパーリンクの設定通り、pdfファイルが開きました。
7.最後に
思った通りのフローができたのですが、「キーの送信」で操作するとなんとなくチープな感じ(不安定)になってしまう気がします。フロー実行中にキーボードやマウスを操作してしますとうまく実行できなくなってしまうところも気になるところです。