Lies in den Artikel rein und unten bekommst Du ein unschlagbares Angebot!
Google-Kalender sind praktisch: Sie sind von überall erreichbar, können mit endlos vielen Schnittstellen und Diensten verbunden werden und bieten weitere Vorteile. Noch schöner wäre es natürlich, wenn wir auch per VBA auf diese Kalender zugreifen könnten. Die Vorbereitungen haben wir bereits in zwei weiteren Artikeln erledigt – damit haben wir eine App bei Google angelegt und eine COM-DLL programmiert, mit der wir ein Token für die Authentifizierung bei Google generieren können. Damit folgt nun die Kür: Wir erzeugen VBA-Prozeduren, um auf die verschiedenen Informationen der Google Calendar API zuzugreifen. Dazu gehören Kalender, Termine und vieles mehr. Welche Möglichkeiten sich zum Lesen, Schreiben, Ändern und Löschen von Terminen bieten, zeigen wir auf den folgenden Seiten.
Keine Rest-API ohne JSON
Die Kommunikation mit der Rest-API des Google Calendars erfolgt wie bei den meisten Rest-APIs über JSON. Wir haben dazu bereits eine Bibliothek vorgestellt, die uns den Zugriff auf die in JSON-Dateien enthaltenen Informationen unter VBA stark vereinfacht. Alles Weitere dazu liest Du im Artikel Mit JSON arbeiten (www.vbentwickler.de/361).
Vorbereitungen
Wie schon in der Einleitung erwähnt, sind zwei wichtige Schritte nötig, bevor wir mit der eigentlichen Programmierung des Rest-API-Zugriffs beginnen können. Jeder wird in einem eigenen Artikel abgehandelt:
- Google Calendar programmieren: Vorbereitungen (www.vbentwickler.de/408): Hier liest Du, wie Du eine App bei Google anlegst und die Client-ID und das Client-Secret ermittelst, das für das Ermitteln eines Tokens für den Zugriff auf die Rest-API erforderlich ist.
- Google-Token per DLL holen (www.vbentwickler.de/409): Hier zeigen wir, wie Du eine COM-DLL programmierst, mit der Du auf Basis der Client-ID und des Client-Secret ein Access-Token für den Zugriff auf den Kalender eines Benutzers sowie ein Refresh-Token für das schnelle Aktualisieren des Access-Tokens generieren kannst.
Außerdem fügen wir der Anwendung, egal, ob es sich um eine Excel-, Outlook-, Access- oder twinBASIC-Anwendung handelt, neben dem Verweis auf die COM-DLL amvGoogleOAuth2 noch zwei weitere wichtige Verweise hinzu. Dabei handelt es sich um Microsoft Scripting Runtime und Microsoft XML, v6.0 (siehe Bild 1). Dies ist das Verweise-Fenster des VBA-Editors, unter twinBASIC sieht dies etwas anders aus.
Bild 1: Verweise für die Lösung
Außerdem fügen wir dem Projekt die beiden Module mdlJSON und mdlJSONDOM hinzu. Diese enthalten die Elemente zum Parsen und Lesen der gelieferten JSON-Dokumente.
Im Modul mdlClipboard finden wir die Funktion InZwischenablage, die immer praktisch ist, um längere JSON-Dokumente in die Zwischenablage zu kopieren, um diese dann beispielsweise formatiert in Visual Studio einzufügen und anzuzeigen.
Das Modul mdlTools enthält aktuell nur die Funktion SQLDatum, mit dem wir Datumsangabe in das SQL-Format übertragen können.
Das Modul mdlRegistry enthält einige Funktionen, mit denen wir Daten wie die ClientID, das ClientSecret, das Access-Token und das Refresh-Token in der Registry speichern und wieder auslesen können.
Diese beschreiben wir im Detail im Artikel Anwendungsdaten in der Registry (www.vbentwickler.de/411).
Das Modul mdlAuthentication enthält die Prozeduren, mit denen wir das Access-Token für die Authentifizierung unserer Anfragen an die Rest-API von Google generieren.
Das Modul mdlGoogleCalendar enthält schließlich die eigentlichen Prozeduren, um auf die Daten des Google-Kalenders zuzugreifen.
Client-ID und Client-Secret holen und speichern
Im Artikel Google Calendar programmieren: Vorbereitungen (www.vbentwickler.de/408) beschreiben wir, wie Du die Client-ID und das Client-Secret über die Webseite von Google holst und dazu auch eine App anlegst. Die beiden Daten sind wichtige Voraussetzungen für das Erhalten eines Access-Tokens und damit letztlich für den Zugriff auf die Rest-API von Google.
Im Modul mdlAuthentication findest Du eine Prozedur namens SetClientData, mit der Du die gewonnenen Daten für Client-ID und Client-Secret in die Registry schreibst, von wo weitere Prozeduren sich diese Informationen im weiteren Verlauf holen. Wir können diese zwar auch in Form von Konstanten direkt im Modul speichern, aber da die weiteren benötigten Informationen wie das Access-Token und das Refresh-Token sich gelegentlich ändern und wir diese deshalb in der Registry speichern wollen, legen wir dort auch gleich Einträge für Client-ID und Client-Secret an.
Wir tragen die entsprechenden Werte also in den folgenden Zeilen für die Platzhalter xxxxxx und yyyyyy ein und rufen dann die Prozedur auf:
Public Sub SetClientData() SaveAppSetting "ClientID", "xxxxxx" SaveAppSetting "ClientSecret", "yyyyyy" End Sub
Diese landen dann wie in Bild 2 in der Registry.
Bild 2: Informationen in der Registry
Token für den Zugriff auf die Rest-API holen
Google liefert zwei Arten von Token:
- Access-Token: Das eigentliche Token, welches wir für den Zugriff auf die Rest-API von Google nutzen. Dieses ist in der Regel nur für 60 Minuten gültig.
- Refresh-Token: Langlebiges Token, mit dem wir das Access-Token aktualisieren können.
Mit der Prozedur GetTokens holen wir beide Token und speichern diese in weiteren Einträgen in der Registry. Die Prozedur ermittelt als Erstes die Werte der Registry-Einträge ClientID und ClientSecret und gibt entsprechende Meldungen aus, wenn diese nicht aus der Registry eingelesen werden können.
Sind beide Werte vorhanden, ruft die Prozedur eine weitere Prozedur namens GetTokensDLL auf. Diese erwartet die Client-ID, das Client-Secret und weitere leere Variablen als Parameter, die mit dem Access-Token, dem Refresh-Token und der Haltbarkeit des Access-Tokens in Sekunden gefüllt werden sollen. Liefert diese Funktion den Wert True zurück, trägt die aufrufende Prozedur die Werte der nun gefüllten Parameter strRefreshToken, strAccessToken und lngExpiresInSeconds unter den Namen RefreshToken, AccessToken und TokenExpiresAt in die Registry ein. Dabei berechnet sie für den Eintrag TokenExpiresAt die aktuelle Zeit plus die Anzahl der Sekunden aus lngExpiresInSeconds (siehe Listing 1).
Public Sub GetTokens() Dim strClientID As String Dim strClientSecret As String Dim strRefreshToken As String Dim strAccessToken As String Dim lngExpiresInSeconds As Long strClientID = GetAppSetting("ClientID") If Len(strClientID) = 0 Then MsgBox "Keine ClientID in der Registry gefunden. Verwende die Prozedur SetClientData.", vbOKOnly + _ vbExclamation, "ClientID fehlt" Exit Sub End If strClientSecret = GetAppSetting("ClientSecret") If Len(strClientSecret) = 0 Then MsgBox "Kein ClientSecret in der Registry gefunden. Verwende die Prozedur SetClientData.", vbOKOnly + _ vbExclamation, "ClientSecret fehlt" Exit Sub End If If GetTokensDLL(strClientID, strClientSecret, strRefreshToken, strAccessToken, lngExpiresInSeconds) Then SaveAppSetting "RefreshToken", strRefreshToken SaveAppSetting "AccessToken", strAccessToken SaveAppSetting "TokenExpiresAt", DateAdd("s", lngExpiresInSeconds, Now) End If End Sub
Listing 1: Die Prozedur GetTokens ruft die Funktion GetTokensDLL auf.