{"id":55000418,"date":"2024-02-01T00:00:00","date_gmt":"2024-02-24T18:01:18","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=418"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Termine_von_Outlook_zum_Google_Calendar_exportieren","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Termine_von_Outlook_zum_Google_Calendar_exportieren\/","title":{"rendered":"Termine von Outlook zum Google Calendar exportieren"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg08.met.vgwort.de\/na\/700f5cb9b40e4c4b8954a120b7d67fa0\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Wenn wir Outlook und Google Calendar nutzen, wollen wir vielleicht auch Termine von Outlook aus zum Google Calendar exportieren. In diesem Artikel zeigen wir, wie das f&uuml;r einfache Termine mit den grundlegenden Eigenschaften gelingen kann. Sp&auml;ter schauen wir uns an, wie wir die hier geschaffenen Prozeduren von verschiedenen Stellen in Outlook aufrufen k&ouml;nnen &#8211; beispielsweise &uuml;ber das Ribbon oder das Kontextmen&uuml;s eines Termins.<\/b><\/p>\n<h2>Ziel dieses Artikels<\/h2>\n<p>Wenn Du diesen Artikel bis zum Ende gelesen hast, verf&uuml;gst Du &uuml;ber Kenntnisse, um einen Termin aus Outlook per VBA in den Google Calendar zu &uuml;bertragen (siehe Bild 1). Zus&auml;tzlich erf&auml;hrst Du, wie &Auml;nderungen an diesem Termin in Outlook automatisch in den Termin im Google Calender &uuml;bertragen werden.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_418_001.png\" alt=\"Ein von Outlook in den Google Calender &uuml;bertragener Termin\" width=\"700\" height=\"487,7279\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Ein von Outlook in den Google Calender &uuml;bertragener Termin<\/span><\/b><\/p>\n<h2>&Uuml;bertragen von Terminen mit Basisdaten<\/h2>\n<p>Termine von Outlook und von Google Calendar k&ouml;nnen sehr viele unterschiedliche Eigenschaften erfordern &#8211; gerade, wenn es um Serientermine geht. Deshalb wollen wir es in diesem Artikel erst einmal einfach halten und nur Termine mit Betreff, Inhalt und den wichtigsten Informationen wie Startdatum und -zeit sowie Enddatum und -zeit &uuml;bermitteln. Auch um ganzt&auml;gige Termine wollen wir uns k&uuml;mmern.<\/p>\n<p>Als Basis f&uuml;r die Prozeduren dieses Artikels k&ouml;nnen wir die im Artikel <b>Google Calendar per Rest-API programmieren <\/b>(<b>www.vbentwickler.de\/410<\/b>) vorgestellten Techniken nurtzen, die wir im Artikel <b>Google Calendar per Rest-API programmieren, Teil 2 <\/b>(<b>www.vbentwickler.de\/415<\/b>) noch erweitert haben. Die Grundlagen f&uuml;r die Authentifizierung f&uuml;r den Austausch von Daten mit dem Google Calendar haben wir in den Artikeln <b>OAuth2-Token f&uuml;r Google per .NET-App holen <\/b>(<b>www.vbentwickler.de\/413<\/b>), <b>Google Calendar per Rest-API programmieren <\/b>(<b>www.vbentwickler.de\/410<\/b>) und <b>Google-Token per DLL holen <\/b>(<b>www.vbentwickler.de\/409<\/b>).<\/p>\n<p>Grundlegende Techniken f&uuml;r den Zugriff auf Outlook-Termine findest Du im Artikel <b>Outlook: Kalender und Termine programmieren <\/b>(<b>www.vbentwickler.de\/415<\/b>).<\/p>\n<h2>Ablauf beim &Uuml;bertragen von Terminen<\/h2>\n<p>Grunds&auml;tzlich ist das &Uuml;bertragen eines Termins von Outlook zum Google Calendar kein Hexenwerk, wenn wir die Techniken aus den oben vorgestellten Artikeln kennen. Wir brauchen nur den zu &uuml;bertragenden Termin zu identifizieren, die relevanten Informationen wie Betreff, Inhalt, Startzeit und Endzeit in einer JSON-Datei zusammenzufassen und diese an Google zu senden.<\/p>\n<p>Allerdings kann es sein, dass sich ein solcher Termin einmal &auml;ndert. Wie k&ouml;nnen wir sicherstellen, dass diese &Auml;nderung auch in den Google Calendar &uuml;bertragen wird? Dazu m&uuml;ssen wir als Erstes ein eindeutiges Merkmal des Termins im Google Calendar ermitteln und dieses mit dem &uuml;bertragenen Termin speichern. Wenn sich dieser dann &auml;ndert, k&ouml;nnen wir die ID nutzen, um den Google-Termin entsprechend anzupassen. An diese ID kommen wir problemlos heran. Speichern k&ouml;nnen wir diese in der Eigenschaft <b>BillingInformation <\/b>&#8211; das ist eine Eigenschaft, die von Outlook selbst nicht genutzt wird und die auch &uuml;ber die Benutzeroberfl&auml;che nicht verf&uuml;gbar ist.<\/p>\n<p>Au&szlig;erdem ben&ouml;tigen wir noch Automatismen, die daf&uuml;r sorgen, dass Aktionen wie das &Auml;ndern oder L&ouml;schen eines Termins in Outlook direkt in den Google Calendar &uuml;bertragen werden.<\/p>\n<h2>Modul im VBA-Projekt von Outlook anlegen<\/h2>\n<p>Um die ben&ouml;tigten VBA-Prozeduren unterzubringen, legen wir ein neues Modul im VBA-Projekt von Outlook an:<\/p>\n<ul>\n<li>Wechseln zum VBA-Editor mit der Tastenkombination <b>Alt + F11<\/b><\/li>\n<li>Erstellen eines neuen Moduls mit <b>Einf&uuml;gen|Modul<\/b><\/li>\n<li>Aktivieren des Eigenschaftenfensters mit der Taste <b>F4<\/b><\/li>\n<li>Markieren des Moduls<\/li>\n<li>&Auml;ndern des Namens in <b>mdlGoogleCalendar<\/b><\/li>\n<\/ul>\n<p>Dem neuen Modul f&uuml;gen wir nun erst einmal die beiden Funktionen <b>GetDefaultCalendar<\/b> und <b>GetSelectedAppointmentItem <\/b>hinzu, die wir im Artikel <b>Outlook: Kalender und Termine programmieren <\/b>(<b>www.vbentwickler.de\/415<\/b>) beschreiben. Diese nutzen wir, um den aktuell selektierten Termin in Outlook zu referenzieren. Genau diesen wollen wir nun in den Google Calendar &uuml;bertragen.<\/p>\n<h2>Weitere Vorbereitungen<\/h2>\n<p>Wir haben alle Module, die wir f&uuml;r die Export-Funktion von Terminen zum Google Calendar ben&ouml;tigen, im Download bereitgestellt. Au&szlig;erdem findest Du dort ein funktionsf&auml;higes VBA-Projekt f&uuml;r Outlook. Wenn Du dieses ausprobieren m&ouml;chtest, kannst Du dieses zeitweise statt Deines eigenen VBA-Projekts unter Outlook nutzen. Dazu &ouml;ffnest Du im Windows Explorer das Verzeichnis <b>C:\\Users\\[Benutzername]\\AppData\\Roaming\\Microsoft\\Outlook<\/b>. Hier findest Du eine Datei namens <b>VbaProject.OTM <\/b>vor. Dieses benennst Du um und f&uuml;gst die gleichnamige Datei aus dem Download zu diesem Artikel hinzu.<\/p>\n<p>Du kannst auch die Module aus dem Download einzeln in das VBA-Projekt importieren. Dazu ziehst Du diese einfach aus dem Windows Explorer in den Projekt-Explorer des VBA-Editors von Outlook. Du musst dann allerdings noch einige Verweise zum VBA-Projekt hinzuf&uuml;gen &#8211; in diesem Fall die unteren drei aus Bild 2:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_418_002.png\" alt=\"Notwendige Verweise f&uuml;r den Einsatz unserer Beispiell&ouml;sung\" width=\"499,6267\" height=\"393,8742\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Notwendige Verweise f&uuml;r den Einsatz unserer Beispiell&ouml;sung<\/span><\/b><\/p>\n<ul>\n<li><b>Microsoft Scripting Runtime<\/b><\/li>\n<li><b>Microsoft XML, v6.0<\/b><\/li>\n<li><b>amvGoogleOAuth2<\/b><\/li>\n<\/ul>\n<p>F&uuml;r den letzten Verweis musst Du au&szlig;erdem noch die DLL <b>amvGoogleOAuth2.dll <\/b>installieren. Alle notwendigen Informationen dazu findest Du im Artikel <b>Google-Token per DLL holen <\/b>(<b>www.vbentwickler.de\/409<\/b>).<\/p>\n<h2>Termin in den Google Calendar &uuml;bertragen<\/h2>\n<p>Damit kommen wir zu der Funktion, mit der wir einen Termin zum Google Calendar &uuml;bertragen wollen. Sie hei&szlig;t <b>AppointmentItemToGoogleCalendar<\/b> und sieht wie in Listing 1 aus.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>AppointmentItemToGoogleCalendar(objAppointmentItem<span style=\"color:blue;\"> As <\/span>Outlook.AppointmentItem)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strToken<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strCalendarID<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strSummary<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strDescription<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>datStart<span style=\"color:blue;\"> As Date<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>datEnd<span style=\"color:blue;\"> As Date<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intColor<span style=\"color:blue;\"> As <\/span>eColor\r\n     <span style=\"color:blue;\">Dim <\/span>bolAllDayEvent<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strEventID<span style=\"color:blue;\"> As String<\/span>\r\n     strToken = GetAppSetting(\"AccessToken\")\r\n     strCalendarID = GetAppSetting(\"CalendarID\")\r\n     <span style=\"color:blue;\">With<\/span> objAppointmentItem\r\n         strSummary = .Subject\r\n         strDescription = .Body\r\n         datStart = .Start\r\n         datEnd = .End\r\n         bolAllDayEvent = .AllDayEvent\r\n         intColor = colBanane\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     CheckToken\r\n     If InsertEvent(strToken, strCalendarID, strSummary, strDescription, datStart, datEnd, bolAllDayEvent, , , _\r\n             intColor, , strEventID) = <span style=\"color:blue;\">True<\/span> Then\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Anlegen erfolgreich.\" & <span style=\"color:blue;\">vbCrLf<\/span> & <span style=\"color:blue;\">vbCrLf<\/span> & \"EventID: \" & strEventID\r\n         AppointmentItemToGoogleCalendar = strEventID\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Anlegen nicht erfolgreich.\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Funktion zum &Uuml;bertragen eines Termins von Outlook zum Google Calendar<\/span><\/b><\/p>\n<p>Die Funktion erwartet nur einen Parameter &#8211; den Verweis auf den Termin, der in den Google Calendar geschrieben werden soll. F&uuml;r den R&uuml;ckgabewert der Funktion definieren wir den Datentyp <b>String<\/b>. Die Funktion soll im Erfolgsfall die <b>EventID <\/b>des neu hinzugef&uuml;gten Kalendereintrags liefern.<\/p>\n<p>Die Funktion liest das Token und die ID des Zielkalenders aus der Registry ein. Mehr zu diesem Thema liest Du im Artikel <b>Anwendungsdaten in der Registry <\/b>(<b>www.vbentwickler.de\/411<\/b>). Im Artikel <b>Anwendungsdaten in der Registry <\/b>(<b>www.vbentwickler.de\/411<\/b>) beschreiben wir, wie diese Werte zuvor in die Registry geschrieben werden.<\/p>\n<p>Den Wert f&uuml;r den Kalender, den wir zuvor teilweise fest im Code verankert hatten, haben wir mit der folgenden Anweisung in der Registry gespeichert (bitte eigenen Kalendernamen einsetzen, der in der Regel der E-Mail-Adresse zum Anmelden entspricht):<\/p>\n<pre>SaveAppSetting \"CalendarID\", \"andre.minhorst@googlemail.com\"<\/pre>\n<p>Danach lesen wir einfach die relevanten Informationen in die daf&uuml;r vorgesehenen Variablen ein, zum Beispiel Betreff, Inhalt, Startdatum und Enddatum.<\/p>\n<p>Nach dem Aufruf der Funktion <b>CheckToken<\/b>, welche die G&uuml;ltigkeit des Tokens pr&uuml;ft und dieses gegebenenfalls erneuert, rufen wir die Funktion <b>InsertEvent<\/b> auf.<\/p>\n<p>Diese haben wir im Artikel <b>Google Calendar per Rest-API programmieren, Teil 2 <\/b>(<b>www.vbentwickler.de\/416<\/b>) beschrieben. <\/p>\n<p>Beim Aufruf von <b>InsertEvent <\/b>pr&uuml;fen wir den R&uuml;ckgabewert in einer <b>If&#8230;Then<\/b>-Bedingung.<\/p>\n<p>Wenn die Funktion den Wert True zur&uuml;ckliefert, geben wir eine Meldung aus, die auch die mit dem Parameter <b>strEventID <\/b>zur&uuml;ckgelieferte ID des Termins ausgibt.<\/p>\n<h2>Aufrufen der Prozedur zum Hinzuf&uuml;gen eines Kalendereintrags im Google Calendar<\/h2>\n<p>Die Prozedur aus Listing 2 trifft die Vorbereitungen und ruft die Funktion <b>AppointmentItemToGoogleCalendar <\/b>auf. Sie holt mit der Funktion <b>GetSelectedAppointmentItem <\/b>(siehe Artikel <b>Outlook: Kalender und Termine programmieren <\/b>(<b>www.vbentwickler.de\/415<\/b>)) den aktuell markierten Termin aus Outlook. Wenn dieser nicht leer ist, weil beispielsweise gerade kein Termin markiert ist, ruft die Prozedur die Funktion <b>AppointmentItemToGoogleCalendar <\/b>auf und &uuml;bergibt das <b>AppointmentItem<\/b>-Element. Der R&uuml;ckgabewert ist im Erfolgsfall die <b>EventID<\/b> des neu erstellten Termins. Diesen tr&auml;gt die Prozedur anschlie&szlig;end in die Eigenschaft <b>BillingInformation <\/b>des aus Outlook exportierten Termins ein und speichert diesen.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Test_AppointmentItemToGoogleCalendar()\r\n     <span style=\"color:blue;\">Dim <\/span>objAppointmentItem<span style=\"color:blue;\"> As <\/span>Outlook.AppointmentItem\r\n     <span style=\"color:blue;\">Dim <\/span>strEventID<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objAppointmentItem = GetSelectedAppointmentItem\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> objAppointmentItem Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         strEventID = AppointmentItemToGoogleCalendar(objAppointmentItem)\r\n         <span style=\"color:blue;\">With<\/span> objAppointmentItem\r\n             .BillingInformation = strEventID\r\n             .Save\r\n         End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Kein zu exportierender Termin angegeben.\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Prozedur zum Aufrufen der Funktion AppointmentItemToGoogleCalendar<\/span><\/b><\/p>\n<h2>Testen, ob die EventID im Outlook-Termin gespeichert wurde<\/h2>\n<p>Mit einer kleinen Prozedur wollen wir nun testen, ob die <b>EventID <\/b>in der Eigenschaft <b>BillingInformation <\/b>eingetragen wurde. Das erledigen wir wieder mit Unterst&uuml;tzung der Funktion <b>GetSelectedAppointmentItem<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Test_EntryID()\r\n     <span style=\"color:blue;\">Dim <\/span>objAppointmentItem<span style=\"color:blue;\"> As <\/span>Outlook.AppointmentItem\r\n     <span style=\"color:blue;\">Set<\/span> objAppointmentItem = GetSelectedAppointmentItem\r\n     <span style=\"color:blue;\">Debug.Print<\/span> objAppointmentItem.BillingInformation\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dies liefert ein Ergebnis wie <b>36kis3n1kt1sc5ch82a54k4u5k<\/b>.<\/p>\n<p>Was k&ouml;nnen wir mit dieser Information nun anfangen? Augenscheinlich sollten wir die <b>EventID <\/b>nutzen k&ouml;nnen, um damit einen bereits zum Google Calendar &uuml;bertragenen Termin aktualisieren zu k&ouml;nnen. Es gibt aber noch einen anderen Nutzen im Hinblick auf das &Uuml;bertragen von Terminen zum Google Calendar. Wie k&ouml;nnen an dem Wert in der Eigenschaft <b>BillingInformation <\/b>erkennen, ob ein Outlook-Termin bereits nach Google &uuml;bertragen wurde. Und das sollten wir erst einmal in der Funktion <b>AppointmentItemToGoogleCalendar <\/b>ber&uuml;cksichtigen, damit ein bereits &uuml;bertragener Termin nicht nochmals &uuml;bertragen wird.<\/p>\n<h2>Pr&uuml;fen, ob ein Termin bereits &uuml;bertragen wurde<\/h2>\n<p>Dazu m&uuml;ssen wir vor dem Aufruf der Funktion <b>InsertEvent <\/b>den Wert von <b>BillingInformation <\/b>pr&uuml;fen. Dies ist ein erster Hinweis darauf, dass dieser Termin zumindest schon einmal zum Google Calendar &uuml;bertragen wurde. Es kann aber auch sein, dass dieser Termin in Google wieder gel&ouml;scht wurde. Wir m&uuml;ssten also zus&auml;tzlich noch pr&uuml;fen, ob dieser Termin noch in Google vorhanden ist.<\/p>\n<p>Dazu nutzen wir die Funktion aus Listing 3. Diese pr&uuml;ft zuerst, ob <b>strEventID <\/b>&uuml;berhaupt gef&uuml;llt ist (<b>strEventID <\/b>kommt aus der Eigenschaft <b>BillingInformation <\/b>des Outlook-Termins). Ist dies nicht der Fall, wird die Funktion direkt mit dem R&uuml;ckgabewert <b>False <\/b>beendet. Anderenfalls ruft die Funktion eine weitere Funktion namens <b>GetEventByID<\/b> auf, die wir im Artikel <b>Google Calendar per Rest-API programmieren, Teil 2 <\/b>(<b>www.vbentwickler.de\/416<\/b>) vorstellen. Sie liefert den Wert <b>True <\/b>zur&uuml;ck, wenn es bereits einen Termin mit der angegebenen <b>EventID <\/b>gibt.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>CheckIfEventExists(strToken<span style=\"color:blue;\"> As String<\/span>, strCalendarID<span style=\"color:blue;\"> As String<\/span>, strEventID<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strEventID) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Exit Function<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">If <\/span>GetEventByID(strEventID) = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n             CheckIfEventExists = <span style=\"color:blue;\">True<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Funktion zur Pr&uuml;fung, ob ein Outlook-Termin bereits als Google-Termin angelegt wurde<\/span><\/b><\/p>\n<h2>Vorhandenen Termin anpassen<\/h2>\n<p>Wenn der Termin bereits vorhanden ist, wollen wir diesen in Google mit den Werten des Outlook-Termins anpassen. Dazu nutzen wir eine weitere Funktion namens <b>UpdateEvent<\/b>, die wir ebenfalls im oben genannten Artikel vorstellen. Diese Funktion erwartet fast die gleichen Parameter wie die weiter oben bereits verwendete <b>InsertEvent<\/b>. Der einzige Unterschied ist, dass wir dieser bereits einen Wert f&uuml;r den Parameter <b>strEventID <\/b>&uuml;bergeben, denn sie soll ja einen vorhandenen Google-Termin mit den Daten aus Outlook aktualisieren.<\/p>\n<h2>Funktion AppointmentItemToGoogleCalendar um Aktualisierung erweitern<\/h2>\n<p>Die obige Funktion <b>AppointmentItemToGoogleCalendar <\/b>enth&auml;lt bisher nur den Aufruf der Funktion <b>InsertEvent<\/b>. Dies wollen wir nun so erweitern, dass wir auch die Funktion <b>UpdateEvent <\/b>nutzen k&ouml;nnen. An der Stelle, wo wir bisher einfach die Funktion <b>InsertEvent <\/b>aufgerufen haben, f&uuml;gen wir nun eine <b>If&#8230;Then<\/b>-Bedingung ein. Diese nutzt die Funktion <b>CheckIfEventExists<\/b>, um zu ermitteln, ob der Termin bereits vorhanden ist. Ist das der Fall, ruft die Prozedur im <b>If<\/b>-Teil die Funktion <b>InsertEvent <\/b>auf und legt so den Termin neu an. Im Erfolgsfall erscheint eine Meldung mit der <b>EventID <\/b>des neuen Termins.<\/p>\n<p>Anderenfalls ruft die Routine im <b>Else<\/b>-Teil die Funktion <b>UpdateEvent <\/b>auf. Liefert diese den Wert <b>True <\/b>zur&uuml;ck, erscheint ebenfalls eine entsprechende Meldung (siehe Listing 4).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>AppointmentItemToGoogleCalendar(objAppointmentItem<span style=\"color:blue;\"> As <\/span>Outlook.AppointmentItem)<span style=\"color:blue;\"> As String<\/span>\r\n     ''...wie in der vorherigen Version\r\n     <span style=\"color:blue;\">If <\/span>CheckToken<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> CheckIfEventExists(strToken, strCalendarID, strEventID)<span style=\"color:blue;\"> Then<\/span>\r\n             If InsertEvent(strToken, strCalendarID, strSummary, strDescription, datStart, datEnd, _\r\n                     bolAllDayEvent, , , intColor, , strEventID) = <span style=\"color:blue;\">True<\/span> Then\r\n                 <span style=\"color:blue;\">MsgBox<\/span> \"Anlegen erfolgreich.\" & <span style=\"color:blue;\">vbCrLf<\/span> & <span style=\"color:blue;\">vbCrLf<\/span> & \"EventID: \" & strEventID\r\n                 AppointmentItemToGoogleCalendar = strEventID\r\n             <span style=\"color:blue;\">Else<\/span>\r\n                 <span style=\"color:blue;\">MsgBox<\/span> \"Anlegen nicht erfolgreich.\"\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             If UpdateEvent(strToken, strCalendarID, strSummary, strDescription, datStart, datEnd, _\r\n                    bolAllDayEvent, , , intColor, , strEventID) = <span style=\"color:blue;\">True<\/span> Then\r\n                 <span style=\"color:blue;\">MsgBox<\/span> \"Aktualisieren erfolgreich.\" & <span style=\"color:blue;\">vbCrLf<\/span> & <span style=\"color:blue;\">vbCrLf<\/span> & \"EventID: \" & strEventID\r\n                 AppointmentItemToGoogleCalendar = strEventID\r\n             <span style=\"color:blue;\">Else<\/span>\r\n                 <span style=\"color:blue;\">MsgBox<\/span> \"Aktualisieren nicht erfolgreich.\"\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Authentifizierung nicht erfolgreich.\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Funktion zum Anlegen oder Aktualisieren eines Outlook-Termins im Google Calendar<\/span><\/b><\/p>\n<h2>Google-Termine l&ouml;schen, wenn Outlook-Termin gel&ouml;scht wird<\/h2>\n<p>Im Artikel <b>Google Calendar per Rest-API programmieren <\/b>(<b>www.vbentwickler.de\/410<\/b>) haben wir mit <b>DeleteEvent <\/b>bereits eine Funktion beschreiben, mit der wir einen Termin im Google Calendar l&ouml;schen k&ouml;nnen.<\/p>\n<p>Diese m&uuml;ssten wir aufrufen, wenn der Benutzer einen Termin in Outlook l&ouml;schen. Das ist allerdings ein wenig aufwendiger, denn dazu m&uuml;ssen wir das entsprechende Ereignis des Termins implementieren.<\/p>\n<p>Im Grunde sind aber auch die bisher vorgestellten Routinen nur dann sinnvoll, wenn wir diese aufrufen, wenn die entsprechenden Aktionen in Outlook ausgel&ouml;st wurde &#8211; also wenn wir einen neuen Termin angelegt oder einen bestehenden Termin ge&auml;ndert haben. Und nun kommt noch das L&ouml;schen eines Termins hinzu, sodass wir &uuml;ber das Implementieren von Ereignissen nachdenken sollten.<\/p>\n<h2>Outlook-Termine immer in den Google Calendar synchronisieren<\/h2>\n<p>Wir m&uuml;ssen also die entsprechenden Elemente von Outlook mit <b>WithEvents <\/b>deklarieren und die ben&ouml;tigten Ereignisse implementieren.<\/p>\n<p>Das erledigen wir allerdings nicht mehr in diesem Artikel, sondern in einem weiteren Artikel namens <b>Outlook: Ereignisse f&uuml;r Termine implementieren <\/b>(<b>www.vbentwickler.de\/417<\/b>).<\/p>\n<p>Hier schauen wir uns an, wie wir neue Termine direkt beim Erstellen referenzieren und auf die Ereignisse dieses Termins reagieren &#8211; vor allem auf das Speichern und L&ouml;schen des Termins. Mit dem Speichern erschlagen wir zwei Fliegen mit einer Klappe: Damit k&ouml;nnen wir n&auml;mlich sowohl das Anlegen neuer Termine als auch das Aktualisieren von Terminen erfassen.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Dieser Artikel zeigt, wie wir Termine von Outlook in den Google Calendar &uuml;bertragen. Dabei lesen wir direkt die <b>EventID<\/b> des neu angelegten Termins aus und speichern diesen mit dem Outlook-Termin.<\/p>\n<p>Dadurch k&ouml;nnen wir bei &Auml;nderungen des Termins in Outlook gleich eine Aktualisierung des entsprechenden Termins im Google Calendar durchf&uuml;hren. Offen ist noch das L&ouml;schen von Terminen, die grundlegenden Techniken schauen wir uns in dem oben erw&auml;hnten Beitrag <b>Outlook: Ereignisse f&uuml;r Termine implementieren <\/b>an.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>ThisOutlookSession.cls<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/FAE6F4D3-5989-476C-AEEF-733ED7427645\/vbe_418.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn wir Outlook und Google Calendar nutzen, wollen wir vielleicht auch Termine von Outlook aus zum Google Calendar exportieren. In diesem Artikel zeigen wir, wie das f&uuml;r einfache Termine mit den grundlegenden Eigenschaften gelingen kann. Sp&auml;ter schauen wir uns an, wie wir die hier geschaffenen Prozeduren von verschiedenen Stellen in Outlook aufrufen k&ouml;nnen &#8211; beispielsweise &uuml;ber das Ribbon oder das Kontextmen&uuml;s eines Termins.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66012024,662024,44000027,44000026],"tags":[],"yst_prominent_words":[],"class_list":["post-55000418","post","type-post","status-publish","format-standard","hentry","category-66012024","category-662024","category-Excel_programmieren","category-Outlook_programmieren"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000418","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000418"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000418\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000418"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000418"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000418"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000418"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}