【デスクトップ用Power Automate】PDFデータをExcelに抽出するフロー作成

こんにちは、TOMです。

今回は『**デスクトップ用Power Automate』を使って、PDFデータをExcelに抽出**できるようにしました。

# 1. 使用ツール
**●デスクトップ用Power Automate**
**●Excel**
**●PDFデータ**

# 2. やりたかったこと
業務の課題として、**募集スタッフの獲得件数に対する数値分析のしづらさ**がありました。


特に勤務時間に対する募集件数を分析する際に、社内システムの関係上、**勤務データがPDFデータでしか取得できない現状**があります。

社内制約上、PDF変換アプリも入れられないため、今回は**デスクトップ用Power Automateを使ってPDFデータからExcelに抽出できる**ようにして、業務効率を図りたいと思います。

ちなみに、デスクトップ用Power Automateを使った理由は、申請すれば社内でもインストール可能だからです。

<br>
下記はイメージ図です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819461/0356ff47-5f12-95fb-2fa6-5db05ba561f5.png" width="75%">

<br>
<br>



# 3. デスクトップ用Power Automateフロー作成


**①フォルダ・ファイルを事前準備**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819461/298a0f5e-560e-6537-250b-494dd2422cf7.png)

<br>
<br>
『01.反映』：サブフローで使うファイルパスを保管しているフォルダ


![プロトアウト0807_反映データ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819461/f3d9e033-fc07-f19f-5e83-236abaa6aa84.png)

:::note info
反映データはExcelで記載。C列がファイルパスとなります。
:::

<br>
<br>
『02.入力』：変換したいPDFデータを入れるフォルダ

<br>
<br>
今回はサンプルデータとして、自作note記事を用意
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819461/3b4ee90c-9053-44fc-8a00-d199b344e60b.png" width="50%">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819461/5ae2bcaf-19d5-0e7e-df68-beaade88c506.png" width="50%">
<br>
<br>
<br>
『03.統合』：書き出しの元データとフロー内でPDFデータを統合データを保管するためのファイル

<br>
<br>

書き出しデータは空欄
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819461/8e23013c-e290-4d55-330f-d3a679ddf63b.png" width="50%">

<br>
<br>
『04.出力』：書き出しデータを保管するフォルダ

<br>
<br>
<br>

**②サブフロー作成**

**完成サブフロー**
![プロトアウト0807_サブフロー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819461/ac7d22ab-c7ca-f490-e375-e4dade93bb81.png)

反映データを呼び出し、ワークシートからセルに記載しているファイルパスをフロー変数として保存しています。

<br>
<br>

**③メインフロー作成**


**完成メインフロー**
![プロトアウト0807_メインフロー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819461/0771c789-90f2-b3d9-c699-9cc442608428.png)

流れとしては、

**1.『02.入力』フォルダに保管されているPDFファイルを取得し、統合**
これによって、勤務データファイルが複数あっても1回の操作で抽出可能

**2.PDFからテキストを抽出する**
テキストの行ごとに分割を行い、テキストデータをフロー変数に保存しております。
これによって、1つのセルに全テキストが貼り付けされることがなくなります。

**3.書き出しデータに書き込む**
変数「１」を設定してループすることで、行ごとに分割していたテキストを1行ずつ貼り付けすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819461/ba1a0df3-fc33-0369-ba21-b3343aaeb5b5.png)

**4.書き出しデータを保存**
書き出しデータは繰り返し使用するので、『04.出力』フォルダに保存するように設定。
また、名前は被らないように「yyyyMMddHHmmss」を付けるように設定。


ExcelにPDFデータが抽出されました。
![プロトアウト0807_書き出しデータ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819461/ba6013ea-9f61-385e-6e25-96d3cf0483bf.png)


**完成（通常4倍速　ループ箇所16倍速）**

https://x.com/tom678174/status/1821143612798738618



# 4. 同僚に使ってもらいました
同じ部署の後輩Aさんにこのフローを紹介し、使用してもらいました。

自部署では担当エリアを東西2分割しており、私が西エリアリーダーで、Aさんが東エリアのリーダーをしています。

また、後輩の中では一番年が近いです。

ちなみに、Aさんに限らず自部署はExcel関数すらも怪しい若手社員がほとんどです（笑）。

『2. やりたかったこと』で抱えている問題は、Aさんも常日頃抱えている問題でしたので、「PDFデータをExcelに自動変換できるようにした」と言ったら喜んでいました。

Aさんも問題なくフローを動かし、PDFデータからExcelに抽出できました。

次に、「**このままあなたは使えるか？改善点はあるか？**」と質問したところ、
以下のフィードバックをもらいました。

:::note warn
「**抽出したExcelを分析するExcelに突合する場合、わかりやすくしてほしい**」
:::
とのことでした。

<br>

たしかに、現状A列に貼り付けているので、スペース箇所を基準に区切り位置を変えるなどする必要があります。

デスクトップ用Power Automateのアクションにはなさそうなので、自動化するには少し工夫が必要そうです。

これが今後の課題です。

# 5. 同僚に使ってもらった感想
今回感じたことは、例えば全体の50％を業務効率化したとしても、残り50％で躓いたら業務効率化の意味が薄れてしまうことです。

ですので、どんなレベルの人でも使えるようなツールを作るためには妥協はできないなぁと改めて実感しました。


今後はさらに妥協なく頑張って参ります！

# 6. 参考：フローソースコード
```言語:フォルダー内にあるPDFファイルを統合し、Excelに書き出すフロー（メイン）
# 反映データから初期値を取得する
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


```

```言語:フォルダー内にあるPDFファイルを統合し、Excelに書き出すフロー（サブ）
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



```

:::note info
※『反映データファイルのファイルパス』の部分は適宜変更してください。
:::