Получить часы работы календаря Outlook

Я использую обменные веб-службы и хотел бы получить для пользователей "Рабочее время". Рабочие часы - это настройка в Календаре, которая помогает при расчете занятости / занятости, но я хотел бы получить или рассчитать фактические значения.

У меня полный доступ к календарю. Если я смогу использовать EWS Managed API, это будет моим предпочтением. Я искал в Интернете, и посмотрел на GetUserAvailability операция, но я не смог найти метод, который даст мне эти данные.

1 ответ

Решение

Если вы используете Exchange 2010 или более позднюю версию, вы можете получить конфигурацию рабочего времени (задокументировано в http://msdn.microsoft.com/en-us/library/ee202895%28v=exchg.80%29.aspx) из IPM.Configuration. Объект FAI WorkHours UserConfiguration (связанные с папками) с использованием операции GetUserConfiguration в EWS http://msdn.microsoft.com/en-us/library/office/dd899439%28v=exchg.150%29.aspx. например

UserConfiguration usrConfig = UserConfiguration.Bind(service, "WorkHours", WellKnownFolderName.Calendar, UserConfigurationProperties.All);
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(new MemoryStream(usrConfig.XmlData));
XmlNodeList nlList =  xmlDoc.GetElementsByTagName("WorkHoursVersion1");
Console.WriteLine(nlList.Item(0).InnerXml);

Я думал, что обновлю это для VBA, я знаю, что это старый поток, но он может помочь людям и сэкономить им время. Я написал следующее для использования в Excel, чтобы перейти к настройкам календаря Outlook. Я был бы признателен за любые отзывы и советы по лучшему / более аккуратному написанию кода.

Function GetUserWorkingHours(WHType As String, oCalendarFolder As Object) As String
' Returns user's Calendar Start or End work times
' Uses existing Outlook calendar folder object
' The workinghours data is stored in a hidden Outlook storage binary stream in xml format (no, seriously, it is!)
' ... with a sign on the door saying "beware of the leopard"
'
' Cheshire Catalyst software July 2020
'
Dim olStorage   As Object
Dim olPropacc   As Object
Dim olBytes()   As Byte
Dim a           As Variant
Dim xmlString   As String       ' xml stream text stored here
Dim objDOM      As Object       ' xml object to parse the xml stream
Dim Result      As String       ' Holding place for return value

    ' Loads the hidden Outlook xml store to retrieve WorkingHours
    Set olStorage = oCalendarFolder.GetStorage("IPM.Configuration.workhours", 2)
    Set olPropacc = olStorage.PropertyAccessor
    olBytes = olPropacc.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x7C080102")

    ' Translate binary stream into text byte by byte (there may be a better way to do this but this way works)
    For Each a In olBytes
        xmlString = xmlString & Chr(a)
    Next a

    ' Generate the xml object to parse
    Set objDOM = CreateObject("Msxml2.DOMDocument.3.0")

    ' Load the xml stream into the xml parser
    objDOM.LoadXML xmlString

    ' Filter on what we are looking for
    Select Case WHType
        Case "Start"
            Result = objDOM.SelectSingleNode("Root/WorkHoursVersion1/TimeSlot/Start").Text
        Case "End"
            Result = objDOM.SelectSingleNode("Root/WorkHoursVersion1/TimeSlot/End").Text
        Case Else
            ' Perhaps we should have tested for this before all that messing about with Outlook stores
            Result = "Invalid"     ' Invalid request
    End Select

    GetUserWorkingHours = Result

    ' Tidy up all those objects
    Set olStorage = Nothing
    Set olPropacc = Nothing
    Set objDOM = Nothing
    Erase olBytes
End Function

Sub testit()
Dim oOutlook    As Object   ' Outlook instance
Dim oNS         As Object   ' Outlook namespace
Dim oCalendar   As Object   ' Calendar folder of Outlook instance
    Set oOutlook = GetObject(, "Outlook.Application")
    Set oNS = oOutlook.GetNamespace("MAPI")
    Set oCalendar = oNS.GetDefaultFolder(9)

    MsgBox ("Start: " & GetUserWorkingHours("Start", oCalendar) & " End: " & GetUserWorkingHours("End", oCalendar))
End Sub
Другие вопросы по тегам