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
-
Feiertag
VBScript um zentrale Termine in Postfachkalender einzutragen. - Notes
- TransporterSuite Notes
- FixNotesItems
- GetTransporterError
- Outlook VBA