2018年以降の記事はGitHub Pagesに移行しました

MicrosoftOutlookで消せなくなったフォルダをwin32ole経由でRubyから消してみる

この操作をすると新しくフォルダを追加してもOutlookの画面から見れなくなるようです?win32ole経由だと見えるのになんで…。→Windows再起動したらなおりました。

あらすじ

OutlookのRSSフィード内にどうやっても消えないフォルダが出来てしまい途方に暮れていた。

何がどうなってこうなのかは定かではないんですが、誤って「RSSフィードフォルダ」内にある「RSSフィード記事」に対して「RSSフィードフォルダ」自体をD&Dしてしまった時に生まれたフォルダだと思いまする。。

フィードをまるごと削除しようとしても「権限を見直してからまた挑戦してねてへぺろ(・ω<)」*1とか言って絶対消えてくれないのでOutlookフォルダとかレジストリとかいじらないと消滅させられないのかなーと悩んでいました。

……が、正直どこをどういじればいいかわからないので、最後にダメ元でwin32oleにお願いしてみた。

解法そして解放

これで消えた……。

require 'win32ole'
ol = WIN32OLE::connect("Outlook.Application")
nameSpace = ol.getNameSpace("MAPI")
# RSSFEEDは「RSS フィード」フォルダのEntryId
nameSpace.getFolderFromID(RSSFEED).Folders.Remove(1)
# puts nameSpace.getFolderFromID(RSSFEED).Name => # RSS フィード

Removeメソッドはインデックスを指定するとの事。

メソッド・プロパティ 説明
Add 指定した名前の Outlook フォルダを追加します。
GetFirst 最初の Outlookフォルダを取得します。
GetNext 次の Outlook フォルダを取得します。
Item あるインデックスの Outlook フォルダを取得します。
Remove あるインデックスの Outlook フォルダを削除します。
Rubyist Magazine - Win32OLE 活用法 【第 5 回】 Outlook

また、インデックスは1から始まりフォルダビューの親フォルダ直下にあるフォルダを1とし2, 3...と並んでいる様子。上記のソースでは「RSS フィード」フォルダ直下の(1番目の)フォルダを削除できた!

EntryIdを見つけるにはFoldersオブジェクトを回してEntryIdを調べる。これを繰り返せば深い階層までいける。

folders = nameSpace.Folders
folders.each do |f|
  puts f.Name
  puts f.EntryId
end

ありがとうwin32ole…。

おまけ

Windowsのirbにショートカットでペーストする方法をはじめて知ったのでメモ。*2

  • Shift + insert !!

*1:一応、権限を確認してみたところ己のアカウントは「所有者」となっており、ファイルの削除もできる設定になっていた。というか他のフィードはサクサク消せる。

*2:今までは Alt+Space -> 編集 から貼り付けしていた。