こんにちは、TOMです。
今回は『デスクトップ用Power Automate』を使って、PDFデータをExcelに抽出できるようにしました。
1. 使用ツール
●デスクトップ用Power Automate
●Excel
●PDFデータ
2. やりたかったこと
業務の課題として、募集スタッフの獲得件数に対する数値分析のしづらさがありました。
特に勤務時間に対する募集件数を分析する際に、社内システムの関係上、勤務データがPDFデータでしか取得できない現状があります。
社内制約上、PDF変換アプリも入れられないため、今回はデスクトップ用Power Automateを使ってPDFデータからExcelに抽出できるようにして、業務効率を図りたいと思います。
ちなみに、デスクトップ用Power Automateを使った理由は、申請すれば社内でもインストール可能だからです。
下記はイメージ図です。
3. デスクトップ用Power Automateフロー作成
『01.反映』:サブフローで使うファイルパスを保管しているフォルダ
反映データはExcelで記載。C列がファイルパスとなります。
『02.入力』:変換したいPDFデータを入れるフォルダ
今回はサンプルデータとして、自作note記事を用意
『03.統合』:書き出しの元データとフロー内でPDFデータを統合データを保管するためのファイル
『04.出力』:書き出しデータを保管するフォルダ
②サブフロー作成
反映データを呼び出し、ワークシートからセルに記載しているファイルパスをフロー変数として保存しています。
③メインフロー作成
流れとしては、
1.『02.入力』フォルダに保管されているPDFファイルを取得し、統合
これによって、勤務データファイルが複数あっても1回の操作で抽出可能
2.PDFからテキストを抽出する
テキストの行ごとに分割を行い、テキストデータをフロー変数に保存しております。
これによって、1つのセルに全テキストが貼り付けされることがなくなります。
3.書き出しデータに書き込む
変数「1」を設定してループすることで、行ごとに分割していたテキストを1行ずつ貼り付けすることができます。
4.書き出しデータを保存
書き出しデータは繰り返し使用するので、『04.出力』フォルダに保存するように設定。
また、名前は被らないように「yyyyMMddHHmmss」を付けるように設定。
完成(通常4倍速 ループ箇所16倍速)
4. 同僚に使ってもらいました
同じ部署の後輩Aさんにこのフローを紹介し、使用してもらいました。
自部署では担当エリアを東西2分割しており、私が西エリアリーダーで、Aさんが東エリアのリーダーをしています。
また、後輩の中では一番年が近いです。
ちなみに、Aさんに限らず自部署はExcel関数すらも怪しい若手社員がほとんどです(笑)。
『2. やりたかったこと』で抱えている問題は、Aさんも常日頃抱えている問題でしたので、「PDFデータをExcelに自動変換できるようにした」と言ったら喜んでいました。
Aさんも問題なくフローを動かし、PDFデータからExcelに抽出できました。
次に、「このままあなたは使えるか?改善点はあるか?」と質問したところ、
以下のフィードバックをもらいました。
「抽出したExcelを分析するExcelに突合する場合、わかりやすくしてほしい」
とのことでした。
たしかに、現状A列に貼り付けているので、スペース箇所を基準に区切り位置を変えるなどする必要があります。
デスクトップ用Power Automateのアクションにはなさそうなので、自動化するには少し工夫が必要そうです。
これが今後の課題です。
5. 同僚に使ってもらった感想
今回感じたことは、例えば全体の50%を業務効率化したとしても、残り50%で躓いたら業務効率化の意味が薄れてしまうことです。
ですので、どんなレベルの人でも使えるようなツールを作るためには妥協はできないなぁと改めて実感しました。
今後はさらに妥協なく頑張って参ります!
6. 参考:フローソースコード
# 反映データから初期値を取得する
CALL Excel呼び出し
Folder.GetFiles Folder: ExcelData FileFilter: $'''*pdf''' IncludeSubfolders: False FailOnAccessDenied: True SortBy1: Folder.SortBy.NoSort SortDescending1: False SortBy2: Folder.SortBy.NoSort SortDescending2: False SortBy3: Folder.SortBy.NoSort SortDescending3: False Files=> Files
Pdf.MergeFiles PDFFiles: Files MergedPDFPath: $'''%ExcelData2%\\統合データ''' IfFileExists: Pdf.IfFileExists.Overwrite PasswordDelimiter: $''',''' MergedPDF=> MergedPDF
Pdf.ExtractTextFromPDF.ExtractText PDFFile: MergedPDF DetectLayout: False ExtractedText=> ExtractedPDFText
Text.SplitText.Split Text: ExtractedPDFText StandardDelimiter: Text.StandardDelimiter.NewLine DelimiterTimes: 1 Result=> TextList
Excel.LaunchExcel.LaunchAndOpenUnderExistingProcess Path: ExcelData3 Visible: True ReadOnly: False Instance=> ExcelInstance2
SET NewVar TO 1
LOOP FOREACH CurrentItem IN TextList
Excel.WriteToExcel.WriteCell Instance: ExcelInstance2 Value: CurrentItem Column: $'''A''' Row: NewVar
Variables.IncreaseVariable Value: NewVar IncrementValue: 1
END
Excel.CloseExcel.CloseAndSaveAs Instance: ExcelInstance2 DocumentFormat: Excel.ExcelFormat.OpenXmlWorkbook DocumentPath: $'''%ExcelData4%\\書き出しデータ'''
File.RenameFiles.RenameAddDateOrTime Files: ExcelData5 DateTimeToAdd: File.DateTimeToAdd.Current DateTimePosition: File.AddTextPosition.AfterName DateTimeSeparator: File.Separator.Underscore DateTimeFormat: $'''yyyyMMddHHmmss''' IfFileExists: File.IfExists.DoNothing RenamedFiles=> RenamedFiles
Excel.LaunchExcel.LaunchAndOpenUnderExistingProcess Path: $'''『反映データファイルのファイルパス』''' Visible: True ReadOnly: False Instance=> ExcelInstance
# 反映データファイルの「反映データ」シートから初期値を取得する
Excel.SetActiveWorksheet.ActivateWorksheetByName Instance: ExcelInstance Name: $'''反映データ'''
Excel.ReadFromExcel.ReadCell Instance: ExcelInstance StartColumn: $'''C''' StartRow: 2 ReadAsText: False CellValue=> ExcelData
Excel.ReadFromExcel.ReadCell Instance: ExcelInstance StartColumn: $'''C''' StartRow: 3 ReadAsText: False CellValue=> ExcelData2
Excel.ReadFromExcel.ReadCell Instance: ExcelInstance StartColumn: $'''C''' StartRow: 4 ReadAsText: False CellValue=> ExcelData3
Excel.ReadFromExcel.ReadCell Instance: ExcelInstance StartColumn: $'''C''' StartRow: 5 ReadAsText: False CellValue=> ExcelData4
Excel.ReadFromExcel.ReadCell Instance: ExcelInstance StartColumn: $'''C''' StartRow: 6 ReadAsText: False CellValue=> ExcelData5
Excel.CloseExcel.Close Instance: ExcelInstance
※『反映データファイルのファイルパス』の部分は適宜変更してください。