Outlook 2003 のその他の予定表を Outlook 2007/2010 の共有の予定表にインポートするスクリプト


Outlook 2003 と Outlook 2007/2010 とではナビゲーション ウィンドウで表示される項目の保存方法が以下の通り異なります。

Outlook 2003 : %appdata%\Microsoft\Outlook\プロファイル名.xml または Common Views フォルダにメッセージ クラスが IPM.Microsoft.WunderBar.Persistence の隠しアイテムとして保存

Outlook 2007 以降 : Common Views フォルダにメッセージ クラスが IPM.Microsoft.WunderBar.Link の隠しアイテムとして保存

そして、Outlook 2007 または Outlook 2010 でメールボックスに最初にログオンするタイミングで、Persistence のデータを Link のデータとして変換します。
ただし、最初にログオンするタイミングかどうかは Link のデータがあるかどうかでのみ判断されるため、一つでも Link のデータがあると変換処理は行われません。
そのため、何らかの理由により変換処理が途中で失敗したり、初回アクセスの際にローカルの XML ファイルや Persistence のデータの読み込みに失敗したような場合、引継ぎが正常に行われなくなります。
また、Exchange Server 2010 の OWA は Link データの読み書きをサポートしていますが、Persistence のデータは読み込まないため、2007 や 2010 にアップグレードする前に OWA でアクセスして Link データの書き込みが行われた場合、Perstence のデータは引き継がれません。

このように、何らかの理由で引き継ぎに失敗した場合、残念ながら Outlook 2003 の情報を Outlook  2007 以降にインポートするような手段が用意されていません。
そこで、Outlook 2003 の共有フォルダーの情報を Outlook 2007/2010 に取り込むスクリプトを作りました。下記の内容をメモ帳などのテキスト エディタで拡張子 .vbs として保存して実行すると、Outlook 2003 のその他の予定表を Outlook 2007 以降の共有の予定表グループに追加します。

' ここをトリプルクリックでスクリプト全体を選択できます。
Const PR_COMMON_VIEWS_ENTRYID = "http://schemas.microsoft.com/mapi/proptag/0x35e60102"
Const PR_PERSIST_DATA = "http://schemas.microsoft.com/mapi/proptag/0x68430102"
Const adTypeBinary = 1
Const adTypeText = 2
Dim olkApp
Dim fldInbox
Dim binCommonViewEID
Dim strCommonViewEID
Dim fldCommonView
Dim objWBPersist
Dim binXML
Dim strXML
Dim adoStream
'
Set olkApp = CreateObject("Outlook.Application")
' 既定のストアを取得するため、受信トレイを取得
Set fldInbox = olkApp.Session.GetDefaultFolder(6) ' =olFolderInbox
' 受信トレイのストアから共通ビューのフォルダーを取得
binCommonViewEID = fldInbox.Store.PropertyAccessor.GetProperty(PR_COMMON_VIEWS_ENTRYID)
strCommonViewEID = fldInbox.PropertyAccessor.BinaryToString(binCommonViewEID)
Set fldCommonView = olkApp.Session.GetFolderFromID(strCommonViewEID)
' Outlook 2003 の Outlook バーの情報を取得
Set objWBPersist = fldCommonView.GetStorage("IPM.Microsoft.WunderBar.Persistence", 2) ' =olIdentifyByMessageClass
binXML = objWBPersist.PropertyAccessor.GetProperty(PR_PERSIST_DATA)
' バイナリで保存されているデータを UTF-8 文字列として取得
Set adoStream = CreateObject("ADODB.Stream")
With adoStream
    .Open
    .Type = adTypeBinary
    .Write binXML
    .Position = 0
    .Type = adTypeText
    .Charset = "utf-8"
    strXML = .ReadText()
    .Close
End With
' XML の共有フォルダー情報をナビゲーション ウィンドウに追加
AddFoldersFromXML strXml
' ローカルの Outlook バーの XML ファイルを読み込み
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("WScript.Shell")
Set objEnv = objShell.environment("PROCESS")
Set stmFile = objFSO.OpenTextFile(objEnv("APPDATA") & "\Microsoft\Outlook\" & olkApp.Session.CurrentProfileName & ".xml")
strXml = stmFile.ReadAll()
' XML の共有フォルダー情報をナビゲーション ウィンドウに追加
AddFoldersFromXML strXml
'
' XML の共有フォルダー情報をナビゲーション ウィンドウに追加するルーチン
Sub AddFoldersFromXML(strXml)
    Dim xmlDoc
    Dim nlShared
    Dim ndShared
    Dim elemWdLnk
    Dim ndEid
    Dim ndEidStore
    Dim navCal
    Dim navGroup
    Dim fldCal
    Dim navFolder
    ' ナビゲーション ウィンドウの [共有の予定表] グループを取得
    Set navCal = olkApp.ActiveExplorer.NavigationPane.Modules.GetNavigationModule(1) ' = olModuleCalendar
    Set navGroup = navCal.NavigationGroups.GetDefaultNavigationGroup(2) ' = olPeopleFoldersGroup
    ' XML 文字列を XML の DOMDocument に設定
    Set xmlDoc = CreateObject("Microsoft.XmlDom")
    xmlDoc.LoadXML strXml
    ' sharedcalendars の情報を取得
    Set nlShared = xmlDoc.getElementsByTagName("sharedcalendars")
    If nlShared.Length > 0 Then
        Set ndShared = nlShared.Item(0)
        ' sharedcalendars のすべての子ノード (wdlnk) について処理
        For Each elemWdLnk In ndShared.ChildNodes
            ' エントリー ID を取得
            Set ndEidStore = elemWdLnk.getElementsByTagName("eidstore").Item(0)
            Set ndEid = elemWdLnk.getElementsByTagName("eid").Item(0)
            ' エントリー ID からフォルダーを取得
            Set fldCal = olkApp.Session.GetFolderFromID(ndEid.Text, ndEidStore.Text)
            ' 取得したフォルダーを  [共有の予定表] グループに追加
            Set navFolder = navGroup.NavigationFolders.Add(fldCal)
        Next
    End If
End Sub

マクロの登録方法やメニューへの追加について

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中