Lies in den Artikel rein und unten bekommst Du ein unschlagbares Angebot!
In verschiedenen anderen Artikeln haben wir die Techniken vorgestellt, mit denen per VBA wir Termine in den Google Calendar eintragen können und auf Ereignisse wie das Anlegen, Ändern oder Löschen von Terminen in Outlook reagieren können. Wir wollen dies nun alles in einem COM-Add-In zusammenbringen. Das COM-Add-In stellt Ribbon- und Kontextmenü-Einträge bereit, mit denen man Termine per Mausklick nach Google übertragen kann und hält Automatismen bereit, die dafür sorgen, dass Änderungen an Terminen wie das Anlegen, Bearbeiten oder Löschen automatisch in den Google Calendar übertragen werden. Damit ist nur noch eine kurze Installation nötig, um diese Funktionen in Outlook bereitzustellen.
Voraussetzungen und Vorbereitungen
Die erste Voraussetzung ist, dass Du eine App bei Google erstellt hast. Wie das gelingt, zeigen wir im Artikel Google Calendar programmieren – Vorbereitungen (www.vbentwickler.de/408). Außerdem benötigst Du die .NET-DLL, mit der wir das Access-Token für den Zugriff auf den Google Calender holen: Google-Authentifzierung mit OAuth2, Update (www.vbentwickler.de/414). Grundlegende Techniken zum automatischen Reagieren auf das Hinzufügen, Ändern und Löschen von Outlook-Terminen beschreiben wir in Outlook: Ereignisse für Termine implementieren (www.vbentwickler.de/417). Außerdem liefert der Artikel Termine von Outlook zum Google Calendar exportieren (www.vbentwickler.de/418) Informationen darüber, wie wir Termine von Outlook zum Google Calendar schicken. Schließlich lernst Du Einiges über das Programmieren der Rest-API von Google in den Artikeln Google Calendar per Rest-API programmieren (www.vbentwickler.de/410) und Google Calendar per Rest-API programmieren, Teil 2 (www.vbentwickler.de/416)
Lösung ausprobieren
Bevor wir beschreiben, wie die Lösung funktioniert, zeigen wir erst einmal, wie Du sie auf Deinem Rechner installieren und ausprobieren kannst. Dazu führen wir folgende Schritte aus:
- .NET-DLL installieren
- COM-Add-In für Outlook installieren
- Google-App für den Zugriff auf den Kalender erstellen
- Outlook starten und die beim Erstellen der Google-App erhaltenen Daten (Client-ID, Client-Secret) in die Optionen eintragen
- Authentifizieren
- Loslegen!
Doch eins nach dem anderen.
.NET-DLL installieren
Die .NET-DLL aus dem Artikel Google-Token per DLL holen (www.vbentwickler.de/409) findest Du in den Verzeichnissen x64 und x86. Je nachdem, welche Office-Version Du installiert hast, verwendest Du die aus dem Verzeichnis x64 (64-Bit) oder x86 (32-Bit). Du benötigst das komplette Verzeichnis auf Deinem Rechner. Wo Du dieses speicherst, spielt keine Rolle.
Um die jeweilige Version zu installieren, gehst Du wie folgt vor:
- Kopiere den kompletten Pfad zur Datei amvGoogleOAuth2.dll in die Zwischenablage.
- Öffne die Eingabeaufforderung im Administrator-Modus. Dazu gibst Du den Suchbegriff cmd in die Windows-Suche ein und klickst mit der rechten Maustaste auf den Eintrag Eingabeaufforderung. Hier wählst Du den Befehl Als Administrator ausführen… aus.
- Navigiere zur Datei Regasm.exe. Hier ist wieder die Unterscheidung zwischen Office 32-Bit und Office 64-Bit nötig. Für 32-Bit navigierst Du beispielsweise zum Verzeichnis C:\Windows\Microsoft.NET\Framework\v4.0.30319, für 64-Bit zum Verzeichnis C:\Windows\Microsoft.NET\Framework64\v4.0.30319. Hier gibst Du für die 32-Bit-Version den folgenden Befehl ein: Regasm “C:\…\x86\amvGoogleOAuth2.dll” /codebase /tlb. In der Eingabeaufforderung erhalten wir das Ergebnis aus Bild 1.
Bild 1: Registrieren der .NET-DLL
Ob die .NET-DLL korrekt installiert ist, können wir in einem beliebigen VBA-Projekt testen. Hier öffnen wir den Verweise-Dialog (Extras|Verweise) und suchen nach dem Eintrag amvGoogleOAuth2. Ist der Eintrag wie in Bild 2 vorhanden, können wir fortfahren.
Bild 2: Prüfen, ob die .NET-DLL erfolgreich installiert wurde
COM-Add-In für Outlook installieren
Als Nächstes installieren wir das COM-Add-In, dessen Erstellung wir später in diesem Artikel erläutern. Das COM-Add-In kommt ebenfalls in zwei Versionen für die 32-Bit- und die 64-Bit-Fassung von Outlook.
Die entsprechenden Dateien heißen amvAppointmentsToGoogle_win32.dll und amvAppointmentsToGoogle_win64.dll. Die Installation ist etwas einfacher:
- Als Erstes öffnen wir Outlook.
- Dann zeigen wir mit dem Ribbonbefehl Datei|Optionen den Optionen-Dialog von Outlook an.
- Hier wechseln wir zum Bereich Add-Ins.
- Dort finden wir neben dem Auswahlfeld Verwalten mit dem Wert COM-Add-Ins die Schaltfläche Los…, die wir nun betätigen.
- Damit zeigen wir den Dialog COM-Add-Ins an, in dem wir auf die Schaltfläche Hinzufügen… klicken.
- Dies öffnet einen Dateiauswahl-Dialog, mit dem wir je nach Office-Version die Datei amvAppointmentsToGoogle_win32.dll oder amvAppointmentsToGoogle_win64.dll selektieren.
- Nach dem Hinzufügen zeigt der Dialog den neuen Eintrag wie in Bild 3 an.
Bild 3: Installieren des COM-Add-Ins in Outlook
Wenn nicht nur dieser Eintrag vorhanden ist, sondern Du unter Datei ganz unten auch noch den Eintrag amvAppointmentToGoogle, hat alles funktioniert.
Google-App für den Zugriff auf den Kalender
Um fortzufahren, benötigen wir die Client-ID und das Client-Secret einer Google-App. Wie Du diese erhältst, haben wir in Google Calendar programmieren – Vorbereitungen (www.vbentwickler.de/408) ausführlich gezeigt.
Outlook starten und Optionen eintragen
Damit können wir, falls nicht bereits geöffnet, Outlook starten und die soeben ermittelten Werte in die entsprechenden Optionen eintragen. Dazu wählen wir im Ribbon-Tab Datei den Eintrag amvAppointmentToGoogle aus. Dies zeigt den Bereich aus Bild 4 an.
Bild 4: Die Optionen des COM-Add-Ins amv-Appoint-ment-ToGoogle
Hier sehen wir oben die beiden Eigenschaften Client-ID und Client-Secret, die noch leer sein dürften. Hier trägst Du die beim Erstellen der Google-App erhaltenen Informationen ein.
Authentifizieren
Danach klicken wir auf die Schaltfläche Token aktualisieren, um erstmalig das Access-Token zu ermitteln, das wir für den Zugriff auf den Google Calendar im Kontext eines Benutzers benötigen.
Für diesen Schritt benötigen wir die .NET-DLL. Die darin enthaltenen Funktionen konnten wir nicht mit vertretbarem Aufwand in einer DLL auf Basis von VB6/twinBASIC erstellen geschweige denn mit VBA realisieren, daher haben wir hier .NET gewählt.
Danach öffnet sich ein Webbrowser und zeigt den Dialog an, mit dem wir angeben wollen, welches Konto wir als Kontext für den Zugriff auf den Google Calendar nutzen wollen (siehe Bild 5).
Bild 5: Konto für das Access-Token authentifizieren
Durch die Anmeldung mit diesem Konto erfolgt die Authentifizierung und die .NET-DLL liefert uns das Access-Token, ein Refresh-Token und die Zeit, wie lange das Token gültig ist und für den Zugriff auf den Google Calendar über die Rest-API erfolgen kann. Das Access-Token wird daraufhin gleich im entsprechenden Feld der Optionen angezeigt.
Wir können uns auch gleich die E-Mail-Adresse merken, die wir für die Authentifizierung verwendet haben. Diese tragen wir nun in das Feld Calendar-ID der Optionen des COM-Add-Ins ein. Alle Daten, die Du in den Optionen siehst, werden in der Registry gespeichert – mehr dazu später.
COM-Add-In anwenden
Danach können wir das COM-Add-In in Outlook ausprobieren. Wir haben folgende Funktionen implementiert:
- Manuelles Übertragen eines Termins zum Google Calendar per Kontextmenü oder Ribbon-Eintrag
- Manuelles Löschen eines Termins per Kontextmenü oder Ribboneintrag
- Automatisches Anlegen eines neuen Termins im Google Calendar, wenn ein neuer Termin im Outlook erstellt wird
- Automatisches Aktualisieren eines Termins im Google Calendar, wenn dieser in Outlook geändert wurde
- Automatisches Löschen beziehungsweise Setzen von Google-Terminen auf den Status Cancelled, wenn der entsprechende Outlook-Termin gelöscht wurde
Wenn wir beispielsweise einen Termin aktivieren, zeigt das Ribbon-Tab Termin im Bereich Google Calendar zwei Befehle an. Mit In Google Calendar übertragen schicken wir den Termin zum Google Calendar.
Mit Aus Google Calendar löschen entfernen wir den Termin wieder beziehungsweise setzen seinen Status auf Cancelled (siehe Bild 6).
Bild 6: Funktionen zum manuellen Übertragen und Löschen von Terminen
Die gleichen Befehle tauchen nochmals auf, wenn wir das Kontextmenü eines Termins öffnen und dort das Untermenü Google Calendar … öffnen.
Automatische Synchronisierung aktivieren
Damit Termindaten automatisch zum Google Calendar übertragen werden, sobald ein Termin angelegt, geändert oder gelöscht wird, müssen wir einige Optionen aktivieren. Diese finden wir im unteren Bereich der Optionen von amvAppointmentToGoogle.
Hier können wir festlegen, ob neu angelegte Termine, geänderte Termine oder gelöschte Termine mit dem Google Calendar synchronisiert werden sollen (siehe Bild 7). Mit der Option Mit Google synchronisierte Termine in diese Kategorie: können wir festlegen, dass Termine in Outlook, die nach Google übertragen wurden, automatisch eine bestimmte Kategorie erhalten. Den Namen dieser Kategorie geben wir im Textfeld rechts daneben an. Wichtig: Die Kategorie muss vorhanden sein, sonst wird diese nicht zugeordnet.
Bild 7: Aktivieren der automatischen Synchronisierung
Programmieren des COM-Add-Ins
Das COM-Add-In haben wir mit twinBASIC programmiert, der neuen Entwicklungsumgebung, die sich als Nachfolger von VB6 anschickt und über die wir bereits in einigen Artikeln geschrieben haben – mehr liefert die Suchfunktion mit dem Begriff twinBASIC auf https://www.vbentwickler.de.
Anlegen des Projekts und Optionen einstellen
Wir legen ein neues twinBASIC-Projekt an und stellen unter Settings den Projektnamen, die Beschreibung und den Anwendungstitel alle auf den Text amvAppointmentsToGoogle ein.
Außerdem fügen wir unter Library References noch einige zusätzliche Einträge hinzu (siehe Bild 8). Vor allem ist hier der Verweis auf die .NET-DLL amvGoogleOAuth2 wichtig.
Bild 8: Verweise des twinBASIC-Projekts
Registrierung auf Outlook anpassen
Damit das COM-Add-In beim Start von Outlook ebenfalls gestartet wird, nehmen wir am Modul DLLRegistration der COM-Add-In-Vorlage von twinBASIC einige Änderungen vor.
Für die Konstante AddinClassName tragen wir amvAppointmentsToGoogle ein. Den Zielpfad in der Registry passen wir auf Outlook an:
Const RootRegistryFolder As String = "HKCU\SOFTWARE\Microsoft\Office\Outlook\Addins\" & AddinQualifiedClassName & "\"
Die restlichen Anpassungen kannst Du im Modul DLLRegistration anschauen.
Die Programmierung des Ribbons und der Kontextmenüs von Outlook haben wir bereits in den folgenden Artikel ausführlich erläutert:
- Outlook: Ribbon per COM-Add-In anpassen (www.vbentwickler.de/376)
- Outlook: Kontextmenüs anpassen (www.vbentwickler.de/369)
- Outlook: Anhang speichern per Kontextmenü (www.vbentwickler.de/375)
Daher gehen wir hier etwas knapper auf die verwendeten Techniken ein und beschreiben diese einmal etwas anders – nämlich nach dem Zeitpunkt des Aufrufs.
Start des COM-Add-Ins
Sobald das COM-Add-In einmal erstellt und registriert ist, stehen in der Registry einige Einträge, die Outlook beim Start ausliest.
Dadurch wird das COM-Add-In direkt beim Start von Outlook ebenfalls geladen.
Die dazu wichtigsten Funktionen sind in der Hauptklasse des COM-Add-Ins namens amvAppointmentsToGoogle enthalten.
Beim Starten geschehen zwei Dinge:
- Die Ereignisprozedur OnConnection der Schnittstelle IDTExtensibility2 wird ausgelöst. Hier führen wir initiale Schritte durch.
- Die Funktion GetCustom der Schnittstelle IRibbonExtensibility wird aufgerufen. Diese liefert die Ribbondefinition für das COM-Add-In an Outlook.
Wichtige Variablen initialisieren
Wir benötigen verschiedene Variablen, die beim Starten des COM-Add-Ins gefüllt werden. Eine davon muss anwendungsweit verfügbar sein und nimmt den Verweis auf die Outlook-Anwendung auf, die das COM-Add-In geladen hat.
Daher deklarieren wir diese als Public im Modul mdlOutlook:
Public objOutlook As Outlook.Application
Drei weitere Variablen benötigen wir nur in der Klasse amvAppointmentsToGoogle:
Private objRibbon As IRibbonUI Private WithEvents objCalendar As Outlook.Folder Private WithEvents objCalendarItems As Outlook.Items
- Die Variable objRibbon nimmt einen Verweis auf die benutzerdefinierte Ribbondefinition des COM-Add-Ins auf.
- objCalendar referenziert den Ordner mit den Kalendereinträgen. Diese Variable wird mit dem Schlüsselwort WithEvents deklariert, damit wir die Ereignisse des Folder-Elements implementieren können.
- objCalendarItems referenziert die Items-Auflistung des Kalender-Ordners. Auch diese Objektvariable deklarieren wir mit WithEvents.
Die Initialisierung der Variablen erfolgt in der beim Start von Outlook ausgelösten Ereignisprozedur OnConnection (siehe Listing 1).
Sub OnConnection(ByVal Application As Object, ByVal ConnectMode As ext_ConnectMode, ByVal AddInInst As Object, _ ByRef custom As Variant()) Implements IDTExtensibility2.OnConnection Set objOutlook = Application Set objCalendar = objOutlook.GetNamespace("MAPI").GetDefaultFolder(olFolderCalendar) Set objCalendarItems = objCalendar.Items End Sub
Listing 1: Die Funktion GetCustomUI stellt eine Ribbondefinition zusammen und gibt diese zurück.
Diese erhält mit ihren Parametern zum Beispiel einen Verweis auf die aufrufende Anwendung. Diesen speichern wir in der Objektvariablen objOutlook.
Den Kalender-Ordner für die Variable objCalendar ermitteln wir über die Funktion GetDefaultFolder des MAPI-Namespaces und in objCalendarItems speichern wir die Items-Auflistung des gleichen Ordners.
Laden des Ribbons
Damit unsere Ribbondefinition beim Laden eingelesen wird, ruft das COM-Add-In beim Starten automatisch die Funktion GetCustomUI auf, welche die Ribbondefinition zusammenstellen.
Diese besteht unterhalb der Elemente customUI und ribbon aus mehreren Teilen, die genau so angeordnet werden müssen, wie es hier der Fall ist:
- contextualTabs: Passt das kontextabhängige Ribbon-Tab mit der Beschriftung Termine an und fügt zwei Schaltflächen zum Übertragen eines Termins nach Google und zum Löschen bestehender Termine aus dem Google Calendar hinzu.
- backstage: Erweitert den Backstage-Bereich, den wir über das Ribbon-Tab Datei anzeigen, um einen Eintrag namens amvAppointmentsToGoogle. Klickt man darauf, erscheinen einige Optionen für das COM-Add-In.
- contextMenu: Passt das Kontextmenü von Terminen in der Kalenderübersicht an und fügt ein Untermenü mit den beiden Befehlen zum Übertragen von Terminen nach Google und zum Löschen von dort vorhandenen Terminen hinzu.
Eine komplette Beschreibung der Ribbondefinition würde den Rahmen sprengen. Einige Feinheiten wollen wir jedoch dokumentieren.
Aufruf der Ribbon-Befehle
Die Schaltflächen, die wir in den drei Ribbonerweiterungen definieren, enthalten jeweils das Attribut onAction.
Ein Klick diese Schaltflächen löst die dafür hinterlegte VBA-Prozedur onAction aus, die wie folgt aussieht:
Public Sub OnAction(control As IRibbonControl) Select Case control.Id Case "btnRefreshToken" GetTokens objRibbon.Invalidate() Case "btnInGoogleCalendarUebertragen", _ "btnInGoogleCalendarUebertragen_Shortcut" Call InsertEventInGoogleCalendar Case "btnAusGoogleCalendarLoeschen", _ "btnAusGoogleCalendarLoeschen_Shortcut" Call DeleteEventFromGoogleCalendar Case Else MsgBox "OnAction nicht behandelt: " & control.Id End Select End Sub
Die Select Case-Bedingung prüft den Wert der Eigenschaft Id des Parameters Control, die den Namen des Steuerelements liefert. Darüber rufen wir verschiedene Prozeduren auf. Die beiden Schaltflächen btnInGoogleCalendarUebertragen und btnInGoogleCalendarUebertragen_Shortcut sorgen für den Aufruf der Prozedur InsertEventInGoogleCalendar, die beiden Schaltflächen btnAusGoogleCalendarLoeschen und btnAusGoogleCalendarLoeschen_Shortcut die Prozedur DeleteEventFromGoogleCalendar.