【自動化の棚卸し】PADとPowerShellで9本作ったら、月1,070分の手作業が61分になった話
Excelの締切チェック、入力チェック、朝の実行、報告メール……気づいたら手作業だらけでした。
そこで1ヶ月かけて、PAD(Power Automate for desktop)とPowerShellで自動化を9本作りました。
結果、月1,070分(約17.8時間)かかっていた手作業が、月61分(約1時間)になりました。削減は月1,009分、約16.8時間です。
この記事でわかること。
1ヶ月で作った自動化9本の中身と、それぞれの削減時間
削減時間を自動で集計するPowerShellスクリプト(コピペで動きます)
自動化が増えたときにハマった3つのこと(文字化け・合計エラー・同時実行の競合)
1. 困りごと:手作業を「分」で書き出したらゾッとした
最初は「なんとなく忙しい」だけでした。棚卸しのために、自動化する前の作業をぜんぶ分単位で書き出してみたんです。

1,070分。月17.8時間です。営業日20日で割ると、毎日53分。1日の1割弱を「Excelを開いて目で見て、コピーして、メールを書く」に使っていた計算になります。
ちなみに#03のトースト通知は、それ単体では時間を減らしません。ただ「気づくのが遅れる」を潰す役なので、#06の「異常に気づくまで平均5時間 → 3分」はこれのおかげです。
2. 構成:削減時間を自動で集計する
棚卸しを手でやると、それ自体が手作業になります。なので集計もスクリプトにしました。
流れはこうです。
automation_list.csv に「ツール名・Before分・After分・月あたり回数」を書いておく
PowerShellでCSVを読んで、削減時間を計算する
合計と、削減が大きい順のランキングを出す
まずCSVです。文字コードは**UTF-8(BOM付き)**で保存します(理由は後述)。
Name,BeforeMin,AfterMin,Note
PAD締切監視,240,12,#01/#04
入力チェックchecker.ps1,120,15,#02
タスクスケジューラ自動実行,200,0,#05
エラー処理・リトライ,90,10,#06
ログ設計,180,20,#07
Outlook報告メール,140,0,#08
Excel差分チェック,100,4,#09集計スクリプトです。
# tanaoroshi.ps1 - 自動化の削減時間を集計する
$ErrorActionPreference = 'Stop'
$csvPath = Join-Path $PSScriptRoot 'automation_list.csv'
# Import-Csv は全項目が文字列で返るので、明示的に数値へ変換する
$rows = Import-Csv -Path $csvPath -Encoding UTF8 | ForEach-Object {
[pscustomobject]@{
Name = $_.Name
BeforeMin = [int]$_.BeforeMin
AfterMin = [int]$_.AfterMin
SavedMin = [int]$_.BeforeMin - [int]$_.AfterMin
Note = $_.Note
}
}
$before = ($rows | Measure-Object -Property BeforeMin -Sum).Sum
$after = ($rows | Measure-Object -Property AfterMin -Sum).Sum
$saved = $before - $after
Write-Host ("Before : {0,6} 分/月" -f $before)
Write-Host ("After : {0,6} 分/月" -f $after)
Write-Host ("削減 : {0,6} 分/月 (約 {1} 時間)" -f $saved, [math]::Round($saved / 60, 1))
Write-Host "`n--- 削減が大きい順 ---"
$rows | Sort-Object SavedMin -Descending |
Format-Table Name, BeforeMin, AfterMin, SavedMin, Note -AutoSize
# 月次の記録として追記しておく(#07のログ設計と同じ発想)
$stamp = Get-Date -Format 'yyyy-MM'
$rows | Select-Object @{n='Month';e={$stamp}}, Name, BeforeMin, AfterMin, SavedMin |
Export-Csv -Path (Join-Path $PSScriptRoot 'tanaoroshi_history.csv') `
-Encoding UTF8 -NoTypeInformation -Append実行するとこうなります。
Before : 1070 分/月
After : 61 分/月
削減 : 1009 分/月 (約 16.8 時間)tanaoroshi_history.csv に月ごとに積み上がっていくので、来月また回せば「先月より増えたか」がそのまま見えます。
3. ハマった点
PowerShell Import-Csv が文字化けする(BOMなしUTF-8)
症状:CSVをUTF-8で保存したのに、Name が PADç· åˆ‡ç›£è¦– みたいな化け方をする。
原因:Windows PowerShell 5.1 の Import-Csv は、既定だと日本語環境のANSI(Shift-JIS)として読みます。BOM付きUTF-8なら自動で判別してくれますが、BOMなしUTF-8だと化けます。VS Codeやメモ帳の「UTF-8」は基本BOMなしなので、ここで踏みました。
解決:読むときに明示します。
Import-Csv -Path $csvPath -Encoding UTF8PowerShell 7 系は既定がUTF-8なので、そのままで読めます。5.1と7が混在している環境だと「自分のPCでは動くのに、サーバーだと化ける」が起きるので、-Encoding は書いておくのが安全です。書き出す側の Export-Csv も同じで、指定しないと5.1ではANSIで出ます。
Measure-Object -Sum で「is not numeric」エラーになる
症状:合計を出そうとしたら怒られる。
Measure-Object : Input object "240" is not numeric.原因:Import-Csv が返すのは全部Stringです。見た目は数字でも中身は文字列なので、5.1の Measure-Object -Sum はそれを数値として扱ってくれません。
解決:上のスクリプトのように、読んだ直後に [int] でキャストしてから流します。1行で済ませたいときはこう書いても同じです。
($rows | Measure-Object -Property {[int]$_.BeforeMin} -Sum).Sumちなみに文字列のまま + すると、"240" + "120" が 240120 になります。エラーにならず静かに間違うので、こっちのほうが怖いです。数値として扱う列は、読み込みの時点で型を決めておくのが確実でした。
タスクスケジューラで同じ時刻に走らせて、Excelがロックされた
症状:自動化が増えてきたころ、朝の実行がときどき落ちるようになりました。ログを見ると、
The process cannot access the file '...\master.xlsx' because it is being used by another process.原因:#05でタスクスケジューラに登録するとき、どれも「毎朝8:30」にしていました。1本のときは問題なかったのに、締切監視(#01)と差分チェック(#09)が同じ master.xlsx を同時に触りにいって競合しました。ImportExcelの Import-Excel も、ファイルが他プロセスに掴まれていると読めません。
解決:まず開始時刻を5分ずつずらしました。8:30/8:35/8:40という具合です。
それでも重なる可能性が残るので、同じファイルを触るスクリプトにはロックファイルを噛ませました。
$lock = 'C:\auto\master.lock'
$acquired = $false
foreach ($i in 1..30) { # 最大5分待つ
try {
$fs = [System.IO.File]::Open($lock, 'OpenOrCreate', 'ReadWrite', 'None')
$acquired = $true
break
} catch { Start-Sleep -Seconds 10 }
}
if (-not $acquired) { throw 'ロック取得に失敗しました' }
try {
# ここでExcelを読む処理
}
finally {
$fs.Close()
Remove-Item $lock -ErrorAction SilentlyContinue
}finally で必ず閉じるのがポイントです。ここを忘れると、一度こけたあとずっとロックが残って全部止まります(一度やりました)。
4. 動いた結果
改めて数字です。
手作業:月1,070分 → 月61分(削減 月1,009分/約16.8時間)
異常に気づくまで:平均5時間 → 3分(#03のトースト通知+#06のリトライ)
障害の原因特定:1件45分 → 5分(#07のログ設計)
朝の手動実行:毎日10分 → 0分(#05のタスクスケジューラ)
残った61分の中身は、入力チェックの目視確認15分、エラーが出たときの対応10分、ログの確認20分、差分チェックの結果確認4分、締切監視の確認12分。つまり**「判断が要るところ」だけが残った**形です。ここはたぶん、これ以上は減らさないほうがいいところだと思っています。
作るのにかかった時間は、9本ぜんぶで30時間くらい。月16.8時間の削減なので、2ヶ月弱で元が取れた計算になります。
おわりに
この棚卸しスクリプト、自動化以外にも使えます。「定例会議」「レビュー」「報告書作成」みたいな、削れるかもしれない作業をぜんぶCSVに突っ込んで並べると、どこが重いのかが一目でわかります。感覚で「あれが大変」と言うより、数字で並べたほうが話が早かったです。
次回は、この1ヶ月で一番ハマった**「PADのExcel日付シリアル値」を単独で深掘り**します。2026/08/08 が 46242 になるアレです。なぜズレるのか、1900年うるう年バグの話まで含めて、変換の決定版を書きます。
役に立ったら、スキを押してもらえると次を書く力になります。
