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














