0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Excelをメール検索GUIとして使う】PowerShellでOutlookのメールアイテム一覧をcsvで吐いてPowerQueryに食わせる

Last updated at Posted at 2022-03-16

前置き:Outlookのメール検索機能がとにかくイケてない

Outlookのメール検索機能がイケてない(検索ワードと無関係なものまでヒットする)ので以前こんなものを作ろうと画策していました。

が、VBA回してる間Outlookが止まるのも嫌だし何よりコードが複雑でやってられない。。。

そこでPowerShellに手を出してみたら見様見真似で何となくで書いたレベルでもあっという間にできた。

構成

  1. PowerShellでcsv出力
  2. csvをPowerQueryで読み込む
  3. PowerQueryの出力テーブルをUIとしてExcelの普通の機能でメール検索する
  4. ピボットテーブルやスライサー、簡単なマクロでサポートもできる

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が出力される。

image.png

PowerQueryへの給餌手順

CSVデータの読み込み

Excelのデータタブから
データの取得と変換テキストまたはCSVからを押す

image.png

データの変換を押す

image.png

image.png

1行目の余計なものを消す

image.png

残ったテーブルの1行目をヘッダとして使用する

image.png

あとは閉じて読み込むだけ

image.png

データ更新時はPowerShell実行後にPowerQueryのデータ更新するだけ

リボンからでも
image.png

右クリックメニューからでも
image.png
どちらでもOK

Excelの普通の機能でメール検索する

GUIを作っていくのが面倒なのと、ExcelそのものがGUIとして超優秀なのでそのまま使います。

PowerQueryの出力がテーブルなのでそのままスライサーも入れられます。

image.png

ピボットテーブルでConversationIDごとにグループ化しても良さげ

ConversationIDというのは返信や転送などで繋がったメールアイテムのグループIDなので、これを親にしておくとやりとりの流れが拾いやすいかと思います。

image.png

残課題

添付ファイル名一覧も取り込みたい

$oItem.Attachments.Itemsの中身をforeachで回せば良さげなのでまたやりたい

送信BOXやローカルに移動させたデータファイルも一括読み込みしたい

選択レコードをフォームに表示したい

テーブルそのままを読むのは結構読みづらいのでユーザーフォームに表示するくらいはやってやろうじゃないの

参考ページ

Outlook取得

CSV出力

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?