Tentative2Free / FixNotesAppointments

Bei der Migration von Postfächern aus Notes  nach Exchange mittels der Transporter Suite werden alle "vorgemerkten" Termine als "unter Vorbehalt" migriert. Notes kennt ja nur "belegt" oder eben "unter Vorbehalt". Letzteres wird von Notes aber als "Frei" angesehen, d.h. der Mitarbeiter hat den Termin schon im Kalender aber weiß noch nicht, ob er ihn wahrnimmt. Das ist im Grund auch richtig, wenn der Termin ist ja vorgemerkt. Schade nur dass dies auch für Erinnerungen, Jahrestage und Geburtstage und andere Termine gilt. Notes kennt meines Wissens keine Einstellung, einen Termin einzutragen und dennoch als "Frei" in den Frei/Belegt-Zeiten zu kennzeichnen.

Als Folge blockieren Geburtstage etc. im Terminplan in Outlook die freien Zeiten. Dieses Skript sollte direkt nach der Migration eines Notes Postfaches nach Exchange aufgerufen werde, um im Kalender des Benutzers alle Termine, die nur "unter Vorbehalt" eingetragen sind, auf "Frei" umzustellen.

Achtung:
Das Skript kann nicht zwischen Terminen unterscheiden, die vom Benutzer "absichtlich" als "unter Vorbehalt" eingetragen wurden. Er werden immer alle Termine, die "unter Vorbehalt" stehen, als "Frei" gesetzt.

Funktionsweise

Das Skript ist in VBSCRIPT geschrieben und sollte über CSCRIPT aufgerufen werden. zwei Voraussetzungen sind zu erfüllen:

  • Privilegierter Account
    Der Aufrufende Prozess muss die fraglichen Postfächer öffnen können.
  • CDO
    Das Skript nutzt CDO, um sich mit den Postfächern zu verbinden.

Das Script selbst erwartet ein paar Parameter und die Liste der Mailboxen über STDIN.

Aufruf und Ausgaben

Aufgrund negativer Erfahrungen beim Einsatz durch andere Personen binde ich den Einsatz von MBReport an die Zustimmung des IT-Leiter oder Geschäftsführer der Exchange Organisation und meine Mithilfe. Eine Abgabe an Dienstleister, externe Berater oder Administratoren ist leider nicht mehr möglich.
Aber für den Einsatz für ausgewählte Ordner ist die VBA-Variante sowieso viel besser geeignet. Sieh am Ende der Seite.
Informationen, warum diese Skripte nicht öffentlich sind, finden Sie auf nicht public.

Hier ein Muster:

echo User1 | cscript tentative.free.vbs /server:srv01 /mode:MOD /reportcsv c:\tentative2free.csv

Das Skript verbindet sich dann mit dem aktuell angemeldeten Benutzer an das Postfach "User1" und "MOD"-ifiziert die Kalendereinträge. Natürlich können Sie dem Skript auch eine Liste von Postfächern (Alias oder SMTP-Adresse) über STDIN zusenden oder über einen FOR-Schleife das Skript mit jedem Postfach einzeln aufrufen und so pro Postfach eine eigene Reportdatei anlegen lassen.

Die Ausgabe in einer DOS-Box ist unspektakulär, zumindest die Anzahl der Elemente überschaubar ist:

Die Ausgaben werden zwecks Nachvollziehbarkeit aber auch als Textdatei gespeichert. Zudem landen in einer CSV-Datei die Termine und die durchgeführte Aktion

Damit ist sichergestellt, dass zu jeder Zeit nachvollzogen werden kann, welche Termine durch das Skript "gefixt" wurden.

VBA-Version

Wer nur die Termine in einem Ordner bearbeiten will, kann die hier veröffentlichte VBA-Version verwenden.

Sub tentative2free()
    Dim objfolder As MAPIFolder
    Set objfolder = Outlook.GetNamespace("MAPI").PickFolder
    
    Dim Item As Object 'Appointmentitem geht nicht da auch andere Objekte möglich für Each Item In objfolder.items
        If Item.MessageClass = "IPM.Appointment" Then
            Debug.Print "Check Appointment:" & Item.subject
            If Item.Recipients.count = 0 Then
                Debug.Print "  RecipientCount = 0,  Set Busystatus FREE"
                Item.BusyStatus = olFree
                Item.Save
            End If
        Else
            Debug.Print "Skip nonAppointment:" & Item.subject
        End If
    Next
End Sub

Hinweise zum umgang mit VBA-Dateien finden Sie auf Outlook VBA.

Wer in dem Zuge noch die Termine konvertieren will, die durch die Notes Migration von 04:00-20:00 uhr eingetragen wurden kann dies mir folgendem VBA-Makro durch die Anwender durchführen lassen:

Sub fixtermin()
    Dim objfolder As MAPIFolder
    Set objfolder = Outlook.GetNamespace("MAPI").PickFolder
        
    Dim Item As Object 'Appointmentitem geht nicht da auch andere Objekte möglich
    Dim objappointment, MasterAppt  As AppointmentItem für Each Item In objfolder.items
        If Item.MessageClass = "IPM.Appointment" Then
            Set objappointment = Item
            Debug.Print "Check Appointment:" & objappointment.subject
            
            If objappointment.IsRecurring Then
                Debug.Print "      Recurring Appointment. Getting Master"
                Set MasterAppt = objappointment.GetRecurrencePattern.Parent 'Get the parent Appointment
                Set objappointment = MasterAppt
            End If
            
            If (TimeValue(objappointment.Start) = "04:00:00") And _
                                (TimeValue(objappointment.End) = "20:00:00") Then
                Debug.Print "Found"
                If Not objappointment.IsRecurring Then
                    objappointment.AllDayEvent = True
                    objappointment.Save
                Else
                    Dim recpattern As RecurrencePattern
                    Set recpattern = objappointment.GetRecurrencePattern
                    recpattern.StartTime = 0
                    recpattern.Duration = 1440
                    objappointment.Save
                End If
            End If
        Else
            Debug.Print "Skip nonAppointment:" & Item.subject
        End If
    Next
End Sub

Da diese Änderungen aber auch Termineinladungen etc. aktualisieren gibt es hierzu keine "Serverlösung", die diese Änderung gleich für alle Kalender anwendet. Bei der Analyse für dieses Skript habe ich entdeckt, dass eine Änderung des "RecurrencePattern" nicht dazu führt, dass das Masterobjekt selbst "Dirty" ist. Eine Abfrage auf "if objappointment.saved = false then objappointment.save" funktioniert nicht. Ich habe mich auf Notes Felder auch etwas über die unorthodoxe Speicherung von Zeiten in Notes Objekten gewundert um dann zu sehen, dass Outlook bei ganztägigen Serienterminen was ähnliches macht:

Das Start und Endedatum ist auf Anfang 1601 gesetzt. In VBA kann man so ein Datum aber nicht schreiben. Aber ein einfaches "recpattern.StartTime = 0" funktioniert problemlos.

Weitere Links