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