前置き:Outlookのメール検索機能がとにかくイケてない
Outlookのメール検索機能がイケてない(検索ワードと無関係なものまでヒットする)ので以前こんなものを作ろうと画策していました。
が、VBA回してる間Outlookが止まるのも嫌だし何よりコードが複雑でやってられない。。。
そこでPowerShellに手を出してみたら見様見真似で何となくで書いたレベルでもあっという間にできた。
構成
- PowerShellでcsv出力
- csvをPowerQueryで読み込む
- PowerQueryの出力テーブルをUIとしてExcelの普通の機能でメール検索する
- ピボットテーブルやスライサー、簡単なマクロでサポートもできる
PowerShellのコード
# Outlookのフォルダからメール一覧を作成、CSVに吐き出す
# 参考(Outlook取得):https://www.itlab51.com/?p=6171
# 参考(CSV出力):https://use-computer.net/powershell/powershell-course-5
$olFolderInbox = 6
$oOutlook = New-Object -ComObject Outlook.Application
$oNamespace = $oOutlook.GetNamespace("MAPI")
$oFolder = $oNamespace.GetDefaultFolder($olFolderInbox)
# ループ回数の上限を設定(CSVに書き出すメール数)
$LimLoopCnt=10000
# 取得する文字数に制限をかける
$LimLenStr=10000
# 変数の初期化
$i=0
$CsvData = @()
foreach($oItem in $oFolder.Items){
# 取得する文字数に制限をかける
$Str = $oItem.Body
$LenStr = ($oItem.Body).Length
if ( $LenStr -gt $LimLenStr)
{$Str = $Str.Substring(0,$LimLenStr)}
# 1行ずつCSV用の変数に足していく
$CsvData +=[PSCustomObject]@{
No = $i
件名 = $oItem.Subject
本文 = $Str.Replace("`r`n","") #改行殺し
受信日時 = $oItem.ReceivedTime
受信者名 =$oItem.ReceivedByName
送信者名 =$oItem.SenderName
CC = $oItem.CC
ConversationID = $oItem.ConversationID
添付ファイル数 = $oItem.Attachments.Count
}
# ループ脱出
$i = $i + 1
if( $i -gt $LimLoopCnt){break}
}
# CSVに吐き出す
$CsvData | ft -AutoSize
$CsvData | Export-Csv "ol_受信BOX_Itmes.csv" -Encoding Default
実行するとこんなcsvが出力される。
PowerQueryへの給餌手順
CSVデータの読み込み
Excelのデータ
タブから
データの取得と変換
>テキストまたはCSVから
を押す
データの変換
を押す
1行目の余計なものを消す
残ったテーブルの1行目をヘッダとして使用する
あとは閉じて読み込むだけ
データ更新時はPowerShell実行後にPowerQueryのデータ更新するだけ
Excelの普通の機能でメール検索する
GUIを作っていくのが面倒なのと、ExcelそのものがGUIとして超優秀なのでそのまま使います。
PowerQueryの出力がテーブルなのでそのままスライサーも入れられます。
ピボットテーブルでConversationID
ごとにグループ化しても良さげ
ConversationID
というのは返信や転送などで繋がったメールアイテムのグループIDなので、これを親にしておくとやりとりの流れが拾いやすいかと思います。
残課題
添付ファイル名一覧も取り込みたい
$oItem.Attachments.Items
の中身をforeach
で回せば良さげなのでまたやりたい
送信BOXやローカルに移動させたデータファイルも一括読み込みしたい
選択レコードをフォームに表示したい
テーブルそのままを読むのは結構読みづらいのでユーザーフォームに表示するくらいはやってやろうじゃないの
参考ページ
Outlook取得
CSV出力