Accueil‎ > ‎

GooCalendar

 
Ajoutez un événement à votre calendrier Google, en utilisant l'API Google Calendar et la méthode authentification Auth2...


I. Introduction

I-A. Pré-requis

Le pré-requis semble évident, il vous faut un compte Google, si vous n'en possédez pas,
rendez-vous ici : "Créez un compte maintenant" .

I-B. Créer un projet

Ensuite direction la console développer pour créer un projet: "Créer un projet" .
Image non disponible

Donnez un nom à votre projet, pour ma part je choisi "gooCalendar" , un ID est alors généré :
Image non disponible
vous pouvez alors dans votre "tableau de bord" relever l'ID et le numéro de votre projet :
Image non disponible

I-C. Activer et gérer des API

Passez ensuite à l'activation des API google :
Image non disponible


Sélectionnez le projet :
Image non disponible puis selectionnez l'API "Calendar API" :
Image non disponible
et un clic sur "Enable" pour activer l'API calendar :

Image non disponible


Le message suivant signale la nécessité de créer des identifiants, ce qui est fait en actionnant le bouton "Accéder à 'Identifiant'" Image non disponible


Sélectionnez alors l'API Calendar , pour la plate forme windows ( "Autre plate-forme avec interface utilisateur").
et l'accès aux "Données utilisateur" Image non disponible
donnez un nom as vos identifiants, par exemple GooCalendar :
Image non disponible


définir ensuite les informations s'affichant lors de la demande d'accord à l'utilisateur de l'application :
Image non disponible


relever alors le "Client ID" :
Image non disponible
L'identifiant apparait alors dans la liste d'identifiants du projet : Image non disponible


Et voilà ... l'on est prêt à utiliser l'API .

II. Documentations API et autres liens utiles

II-A. API-Calendar

L'on peu trouver toutes les documentations relatives à l'API : "Google Calendar API" sur le site developers de Google :
Google Calendar APIGoogle Calendar API
l'onglet "Référence" permet d'accéder as la description de tous les objets et fonctions de l'API : Google Calendar API - RéférenceGoogle Calendar API - Référence

II-B. Explorateur d'API

L'explorateur d'API permet de tester toutes les fonctions d'une API google, voir :
APIs Explorer - Google CalendarAPIs Explorer - Google Calendar

Un exemple pour la fonction calendarList.list ici :
calendarList.list une action sur le bouton "Autorize and execute" permet d'effectuer un appel à cette API :
Image non disponible
suite à l'action sur le bouton le site affiche la requête utilisée :


GET https://www.googleapis.com/calendar/v3/users/me/calendarList?key={YOUR_API_KEY}

nous verrons plus loin comment obenir l'API Key (YOUR_API_KEY) ..., la réponse obtenue :


 
200 OK
- Show headers -
  
{
 "kind": "calendar#calendarList",
 "etag": "\"1455563059019000\"",
 "nextSyncToken": "CPj50vi6-soCEhJwaGIuaW5lb0BnbWFpbC5jb20=",
 "items": [
  {


   "kind": "calendar#calendarListEntry",
   "etag": "\"1427472301521000\"",
   "id": "3ra85qrpb12qr7bb62j0lrg@group.calendar.google.com",
   "summary": "bbil",
   "timeZone": "Europe/Paris",
   "colorId": "17",
   "backgroundColor": "#9a9cff",
   "foregroundColor": "#000000",
   "accessRole": "owner",
   "defaultReminders": [
   ]
  },
  {


   "kind": "calendar#calendarListEntry",
   "etag": "\"1427472301952000\"",
   "id": "bbil@gmail.com",
   "summary": "bbil@gmail.com",
   "timeZone": "Europe/Paris",
   "summaryOverride": "bbil@gmail.com",
   "colorId": "17",
   "backgroundColor": "#9a9cff",
   "foregroundColor": "#000000",
   "selected": true,
   "accessRole": "owner",
   "defaultReminders": [
    {
     "method": "popup",
     "minutes": 10
    },
    {
     "method": "email",
     "minutes": 10
    }
   ],
   "notificationSettings": {
    "notifications": [
     {
      "type": "eventCreation",
      "method": "email"
     },
     {
      "type": "eventChange",
      "method": "email"
     },
     {
      "type": "eventCancellation",
      "method": "email"
     },
     {
      "type": "eventResponse",
      "method": "email"
     }
    ]
   },
   "primary": true
  },
  {
  "kind": "calendar#calendarListEntry",
   "etag": "\"1434302100382000\"",
   "id": "#contacts@group.v.calendar.google.com",
   "summary": "Anniversaires",
   "description": "Affiche les anniversaires de vos contacts Google et, si vous le souhaitez, de vos cercles Google+. Affiche également les fêtes et les autres événements de vos contacts Google, le cas échéant.",
   "timeZone": "Europe/Paris",
   "colorId": "13",
   "backgroundColor": "#92e1c0",
   "foregroundColor": "#000000",
   "selected": true,
   "accessRole": "reader",
   "defaultReminders": [
   ]
  },
  {
   "kind": "calendar#calendarListEntry",
   "etag": "\"1434302100204000\"",
   "id": "fr.french#holiday@group.v.calendar.google.com",
   "summary": "Jours fériés en France",
   "description": "Jours fériés et fêtes légales en France",
   "timeZone": "Europe/Paris",
   "colorId": "8",
   "backgroundColor": "#16a765",
   "foregroundColor": "#000000",
   "selected": true,
   "accessRole": "reader",
   "defaultReminders": [
   ]
  }
 ]
}

II-C. API-JSON

II-C-1. Présentation

L'envoi ou la réception de donnée vers les APIs google s'effectue sous le format JSON, pour cela une solution est d'utiliser le module mis à disposition par Tim Hall : JSON Converter for VBA
télécharger le fichier Zip puis importer le module "JsonConverter.bas" dans votre projet Excel VBA.

II-C-2. Creer des données JSON

Pour cela, on va utiliser l'exemple de donnée présent dans l'article Wikipedia :


{
    "menu": {
        "id": "file",
        "value": "File",
        "popup": {
            "menuitem": [
                { "value": "New", "onclick": "CreateNewDoc()" },
                { "value": "Open", "onclick": "OpenDoc()" },
                { "value": "Close", "onclick": "CloseDoc()" }
            ]
        }
    }
}

JsonConverter utilise des combinaison de dictionnaire et de collection pour définir les données, l'on doit créer un dictionary à chaque accolade ouvrante { , et une collection pour les crochets ouvrant [ . Le code à utiliser devient alors :


Private Sub CreerJSON()
 Dim jSon As New Dictionary
 Dim jMenu As New Dictionary
 Dim jPopup As New Dictionary
 Dim jMenuItem As New Collection
 Dim c1 As New Dictionary
 Dim c2 As New Dictionary
 Dim c3 As New Dictionary
 
  jSon.Add "Menu", jMenu
  jMenu.Add "id", "file"
  jMenu.Add "value", "File"
  jMenu.Add "popup", jPopup
  jPopup.Add "menuitem", jMenuItem
  jMenuItem.Add c1
  c1.Add "value", "New"
  c1.Add "onclick", "CreateNewDoc()"
  jMenuItem.Add c2
  c2.Add "value", "Open"
  c2.Add "onclick", "OpenDoc()"
  jMenuItem.Add c3
  c3.Add "value", "Close"
  c3.Add "onclick", "Close()"
  stData = JsonConverter.ConvertToJson(jSon)
  Debug.Print stData
End Sub

Le résultat de l'appel de cette fonction peut-être visualisé dans la fenêtre d'exécution cela donne :


{"Menu":{"id":"File","popup":{"menuitem":[{"value":"New","onclick":"CreateNewDoc()"},{"value":"Open","onclick":"OpenDoc()"},{"value":"Close","onclick":"Close()"}]}}}{"Menu":{"id":"file","value":"File","popup":{"menuitem":[{"value":"New","onclick":"CreateNewDoc()"},{"value":"Open","onclick":"OpenDoc()"},{"value":"Close","onclick":"Close()"}]}}}

qui à l'indentation et au saut de lignes prêt est identique au données JSON vu plus haut.

II-C-3. Lecture (parse) JSON

La lecture (parse) des données Json s'effectue grâce à la fonction ParseJson , exemple de code :


Private Sub AfficheDonneesJSon(stData)
 Dim jSon As Object
 Set jSon = JsonConverter.ParseJson(stData)
   Debug.Print "menu.id                        => " & jSon("menu")("id")
   Debug.Print "menu.value                     => " & jSon("menu")("value")
   Debug.Print "menu.popup.menuitem[1].value   => " & jSon("menu")("popup")("menuitem")(1)("value")
   Debug.Print "menu.popup.menuitem[1].onclick => " & jSon("menu")("popup")("menuitem")(1)("onclick")
   Debug.Print "menu.popup.menuitem[3].value   => " & jSon("menu")("popup")("menuitem")(3)("value")
   Debug.Print "menu.popup.menuitem[3].onclick => " & jSon("menu")("popup")("menuitem")(3)("onclick")
     
End Sub

en rajoutant un appel à cette fonction dans la fonction précédente "CreerJSON"


...
 stData = JsonConverter.ConvertToJson(jSon)
  Debug.Print stData
  AfficheDonneesJSon stData
End Sub

Le résultat dans la fenêtre exécution est alors :


menu.id                        => file
menu.value                     => File
menu.popup.menuitem[1].value   => New
menu.popup.menuitem[1].onclick => CreateNewDoc()
menu.popup.menuitem[3].value   => Close
menu.popup.menuitem[3].onclick => Close()

III. Autentification API Google

III-A. Présentation

Depuis avril 2012, l'authentification "OAuth 1.0" à été remplacé par la version 2 : "OAuth 2.0" ici : Aut 1.0 vers Auth 2.0 le principe de fonctionnement de l'authentification est décrit ici : Using OAuth 2.0 to Access Google APIsUsing OAuth 2.0 to Access Google APIs

En résumer l'on peut dire que l'authentification se déroule en plusieurs phases :

  1. Obtention d'un code d'autorisation , après consentement de l'utilisateur de l'application (mémorisé pour utilisation ultérieure)
  2. Utilisation du code d'autorisation pour obtenir un jeton d'accès (access_tokent) et un jeton de rafraîchissement (refresh_token)
  3. Utilisation de l'access_token" lors de l'appel des API google
  4. Le token ayant une date limité dans le temps, utilisation du refresh_token pour "rafraichir" sa durée de vie si nécessaire.
  5. En cas de nouvelle utilisation utilisation du refresh_token mémorisé (feuille param du fichier excel en exemple) pour "rafraichir" sa durée de vie si nécessaire.

III-B. Implémentation

Dans le classeur téléchargeable en fin d'article, une classe clGooAuth2 et regroupe toutes le fonctions nécessaire à l'authentification et l'appel des APIs google.

III-B-1. Obtention du consentement utilisateur

Lors de la première utilisation de l'application, il convient d'obtenir le consentement de l'utilisateur, pour cela une requête d'authentification est émise sous la forme :


https://accounts.google.com/o/oauth2/v2/auth?
  scope=https://www.googleapis.com/auth/calendar&
  redirect_uri=urn:ietf:wg:oauth:2.0:oob&
  response_type=code&
  client_id=812741506391-h38jh0j4fv0ce1krdkiqmr0hfvt6n5af.apps.googleusercontent.com

(en supprimant les sauts de lignes ..)

Lors de l'appel de cette URL par Internet explorer par exemple une fenêtre apparaît demandant le consentement de l'utilisateur, si aucun compte utilisateur n'est actif la fenêtre de login apparaît :
Image non disponible


Ensuite, la fenêtre d'autorisation apparaît :
Image non disponible

suite à cela un code autorisation est retourné :
Image non disponible
Ce code est aussi visible dans le titre de la fenêtre du navigateur.
La fonction "GetUserConsent" de la classe clGooAuth2 permet de récupérer ce code d'autorisation, en utilisant un appel à internet exploreur, et en surveillant les changements d'état :


'==================================================================================================================
'   Utilisation d'internet Explorer pour récupérer autorisation lors de la premiére connection
'===================================================================================================================
'
' Récupére autorisation de l'utilisateur lors de la premiére utilisation
'
Private Function GetUserConsent(scope As tyGooScope, stClient As String, stClientSecret As String) As Boolean
   Dim stUrlConnect As String
   Dim stScope As String
   Dim bFinChargement As Boolean
   If Not getStScope(scCalendar, stScope) Then
        GetUserConsent = False
        oErreur "GetUserConsent Erreur : Scope inconnu"
        Exit Function
     End If
   ooAutorisation = ChargePageAutorisation
   stUrlConnect = "https://accounts.google.com/o/oauth2/v2/auth?scope=" & stScope & "&redirect_uri=urn:ietf:wg:oauth:2.0:oob&response_type=code&client_id=" & stClient
   oIE.Navigate stUrlConnect
   oIE.Visible = True
   bFinChargement = False
   Do
        DoEvents
        bFinChargement = (oIE.ReadyState = READYSTATE_COMPLETE And Not oIE.Busy)
    Loop Until bFinChargement And (ooAutorisation = AutorisationOK Or ooAutorisation = RefusAutorisation)
    oIE.Visible = False
    
    If ooAutorisation = AutorisationOK Then
        Debug.Print "Retour authentification : " & ooSuccesCode
        stLoginGoogle = RecupereCompteGmail
        GetUserConsent = True
        
    Else
        oErreur "Erreur authentification : " & ooDefautCode
        GetUserConsent = False
    End If
    ooAutorisation = NonInitialise
End Function

'
' Fin chargement page lors d'une récupération autorisation .
'
Private Sub oIE_TitleChange(ByVal text As String)
    Dim stTmp As String
    If stExtraitReponseTitre(text, "Success code=", ooSuccesCode) Then
        ooAutorisation = AutorisationOK
        
        Exit Sub
    End If
    If stExtraitReponseTitre(text, "Denied error=", ooDefautCode) Then
          ooAutorisation = RefusAutorisation
         Exit Sub
    End If
    
    If stExtraitReponseTitre(text, "Demande d'autorisation", stTmp) Then
        ooAutorisation = AttenteAutorisation
       Exit Sub
    End If
    
    Debug.Print "Titre inconnu  : " & text
      
End Sub
' Extraction chaine derriére identifiant
' exple Text = "MonChamp=MaValeur"
' si stID = "MonChamp="
'  stVal retoure = "MaValeur"
Private Function stExtraitReponseTitre(text As String, stID As String, ByRef stVal As String) As Boolean
    If (Left(text, Len(stID)) = stID) Then
         stVal = Mid(text, Len(stID) + 1)
         stExtraitReponseTitre = True
    End If
End Function

Un exemple d'appel à la fonction GetUserConsent :


' Tests divers classe clGooAuth2
Private Sub ObtenirConsentement()
Dim stClientID As String
Dim stClientSecret As String
Dim oGooAuth As New clGooAuth2
stClientSecret = ""
stClientID = "78896414escb-v6rc80407tfnms84irr7sfjbsp9edt4.apps.googleusercontent.com"
 Debug.Print oGooAuth.GetUserConsent(scCalendar, stClientID, stClientSecret)
End Sub
Qui nous lors de l'exécution retourne un code d'authentification :

Retour authentification : 4/YsUpNCQLcHQF4NNW-2FmPKZUSZmqQlD0R6PK-RN8ew8

III-B-2. Obtention des token d'accès et de rafraichissement

Pour obtenir ces deux token une requête HTTP POST est utilisée avec comme paramètre les champs suivants :

ChampDescription
CodeCode d'autorisaiton obtenu lors de la précédente requête
client_idLe "Client_ID" relevé récupéré dans console développeurs
client_secretLe "Client_secret" relevé récupéré dans console développeurs
redirect_uriurl de redirection , : urn:ietf:wg:oauth:2.0:oob
grant_typetexte : authorization_code

La requête HTT POST doit-être transmise à l'url :


https://accounts.google.com/o/oauth2/token

Avec comme entête :


 "Content-Type", "application/x-www-form-urlencoded"

La librairie MSXML2.XMLHTTP est utilisée pour émêtre cette requête, voir code de la fonction ooGetToken de la classe clGooAuth2 en complétant le précendant code de test l'on peu observer le résultat obtenu par la requête :


'-------------------------------------------------
' Tests divers classe clGooAuth2
Private Sub ObtenirConsentement()
Dim stClientID As String
Dim stClientSecret As String
Dim oGooAuth As New clGooAuth2
stClientSecret = "w9Dmg2dByCgpibZT_2F48SU5"
stClientID = "76480088491-cbnf4esv7tm6r7stcs8v4irrjbsp94.apps.googleusercontent.com"
 Debug.Print oGooAuth.GetUserConsent(scCalendar, stClientID, stClientSecret)
Dim oXmlHttp As MSXML2.XMLHTTP
Dim stData As String
Set oXmlHttp = CreateObject("Microsoft.XMLHTTP")

oXmlHttp.Open "POST", "https://accounts.google.com/o/oauth2/token", False
oXmlHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
stData = "code=" & oGooAuth.ooSuccesCode & "&client_id=" & stClientID & "&client_secret=" & stClientSecret & "&redirect_uri=urn:ietf:wg:oauth:2.0:oob&grant_type=authorization_code"

oXmlHttp.send stData
Debug.Print oXmlHttp.responseText

 
End Sub

Le résultat obtenu est alors une chaîne au format JSON du type :


{
  "access_token" : "y2a9.kc6pwIFwtU6oagb8DALygFMvp5xEeOL8VShPhNZZvDkOpQPw3iPtS8a4RR3SHEQnzd",
  "token_type" : "Bearer",
  "expires_in" : 3600,
  "refresh_token" : "1/pFBw_8nPBUdnmZ6YfHSlUYe8LBlVIubaWUaDGSuOZ40MEudVrK5joRSp3cRFq60z"
}

Il suffit ensuite de "PARSER" les données JSON, la fonction GetToken() de la classe clGooAuth2 permet d'effectuer ces opérations :


Function ooGetToken() As Boolean
Dim oXmlHttp As MSXML2.XMLHTTP
Dim stData As String
Set oXmlHttp = CreateObject("Microsoft.XMLHTTP")

oXmlHttp.Open "POST", "https://accounts.google.com/o/oauth2/token", False
oXmlHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
stData = "code=" & ooSuccesCode & "&client_id=" & ooClient_ID & "&client_secret=" & ooClient_Secret & "&redirect_uri=urn:ietf:wg:oauth:2.0:oob&grant_type=authorization_code"
If ooRefresh_token <> "" Then
    stData = "refresh_token=" & ooRefresh_token & "&client_id=" & ooClient_ID & "&client_secret=" & ooClient_Secret & "&grant_type=refresh_token"
End If
oXmlHttp.send stData
Dim response As String
response = oXmlHttp.getAllResponseHeaders()
Debug.Print response
If oXmlHttp.Status Then
Dim st As String
Dim jSon As Dictionary
st = oXmlHttp.responseText

Set jSon = ParseJson(st)

If jSon.Exists("access_token") Then
    ooAccess_token = jSon("access_token")
End If
If jSon.Exists("token_type") Then
    ooToken_Type = jSon("token_type")
End If
If jSon.Exists("refresh_token") Then
    ooRefresh_token = jSon("refresh_token")
End If
If jSon.Exists("expires_in") Then
    oodExpire = DateAdd("s", jSon("expires_in") - 30, Now)
End If

    ooGetToken = True
End If
Set oXmlHttp = Nothing
End Function

On récupère en particulier les token "acces_token" et "refresh_token" pour une utilisation ultérieure.

III-B-3. Rafraichissement du token

La même requête HTTP post est utilisée pour rafraichir le "token" seules les données changent :

Champ Description
refresh_token Token de rafraichissement obtenu précédament.
client_id Le "Client_ID" relevé récupéré dans console développeurs
client_secret Le "Client_secret" relevé récupéré dans console développeurs
grant_type texte : refresh_token

L'on termine la fonction de test précédente :


(...)
Debug.Print oXmlHttp.responseText


' récupére le token_Refresh :
ooRefresh_token = ParseJson(oXmlHttp.responseText)("refresh_token")

Stop 'Actionner F5 pour continuer
 '/// ---- pour rafraichir la reqête
 
 stData = "refresh_token=" & ooRefresh_token & "&client_id=" & stClientID & "&client_secret=" & stClientSecret & "&grant_type=refresh_token"
 oXmlHttp.Open "POST", "https://accounts.google.com/o/oauth2/token", False
 oXmlHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
 oXmlHttp.send stData
 Debug.Print oXmlHttp.responseText
End Sub

Les données obtenues sont alors similaires à la première requête :


{
  "access_token" : "y2a9.kwL2I7Q9OTXQ0xUdjVNA2PZL1-PkKDCAjWQzWjPzoiSsU3WA0PwZg32fFdB9xiKV3w",
  "token_type" : "Bearer",
  "expires_in" : 3600
}

Il manque seulement le refresh_token, que l'on auras pris soin de mémoriser pour des utilisations future.

III-B-4. Fonctionnement général classe clAuth2

La fonction GooConnect() de la classe clAuth2, permet de gérer l'authentification elle utilise la feuille shParam du classeur Excel pour stocker ces paramétres et ainsi déterminer s'il s'agit d'une premiére authentification ou d'un rafraichissement de jetons.

IV. Utilisation de l'API Calendar

IV-A. Généralitées

Dans un premier temps de type de requête sont utilisées : GET et POST, on utilise la librairie MSXML2.XMLHTTP , les données retournées ou envoyées étant "codées" en JSON.., pour chaucne des requête l'on rajoute en entête un paramétre "Content-Type" égal à "application/json" et un paramétre "Authorization" , composée de avec la concaténation de deux information obtenue précédamment Token_type et Access_token. Une fonction de la classe clGooAuth2 permet d'emmètre ces requêtes :


'
' Envoi requête Http
'
Public Function gooHTTP(stType As String, stUrl As String, Optional stData = "") As Boolean
  If oXMLHttp Is Nothing Then
    Set oXMLHttp = New MSXML2.XMLHTTP60
   End If
    oXMLHttp.abort
    oXMLHttp.Open stType, stUrl, False
    oXMLHttp.setRequestHeader "Content-Type", "application/json"
    oXMLHttp.setRequestHeader "Authorization", ooToken_Type & " " & ooAccess_token
    oXMLHttp.send stData
    gooHTTP = (oXMLHttp.Status = 200)
End Function

IV-B. Liste des calendriers

Pour obtenir la liste des calendriers une requête de type GET doit être effectuée vers voir : https://developers.google.com/google-apps/calendar/v3/reference/calendarList/get
la requête GET doit-être du style :


				GET https://www.googleapis.com/calendar/v3/users/me/calendarList

Suite à l'exécution de la requête des données aux format JSON sont retournées avec un enregistrement par calendriers :

Image non disponible

Dans le module GooCalendar du classeur exemple, la fonction GooCalListeCalendrier permet d'obtenir cette liste :


'
' récupére liste calendrier
'
Function GooCalListeCalendrier(oLstCal As Object) As Boolean
    If Not InitGooAuth Then
        Debug.Print "Erreur initialisation connection"
        Exit Function
    End If
    ' voir : https://developers.google.com/google-apps/calendar/v3/reference/calendarList/list
    
    If Not oGoo.gooHTTP("GET", "https://www.googleapis.com/calendar/v3/users/me/calendarList") Then
        MsgBox "Erreur récupération liste calendrier " & oGoo.oXMLHttp.responseText
    Else
       Debug.Print oGoo.oXMLHttp.responseText
      Dim jSon As Object
      Set jSon = JsonConverter.ParseJson(oGoo.oXMLHttp.responseText)
      Set oLstCal = jSon("items")
      GooCalListeCalendrier = True
      
    End If
    
    
End Function

La procédure TestFonctionCalListeCalendrier en est un exemple d'utilisation :


'
'  Exemple de boucle d'appel Liste calendrier..
'
Private Sub TestFonctionCalListeCalendrier()
    Dim oLstCal As Object
    If GooCalListeCalendrier(oLstCal) Then
            Debug.Print oLstCal.Count
            Dim c
            For Each c In oLstCal
                Debug.Print c("id") & " " & c("summary") & "  " & c("description")
            Next
    End If
End Sub

IV-C. Liste des événements

Une requête GET permet de récupérer la liste des événements d'un calendrier, pour cela, elle est appliquée à l'URL :


https://www.googleapis.com/calendar/v3/calendars/{IdCalendar}/events

En remplaçant {idCalendar} par l'ID du calendrier récupéré par exemple lors de l'utilisation de la fonction précédente liste des calendriers, où en utilisant la chaîne "primary" pour le calendrier principal. En retour, la requête renvoi des données JSON :


{
 "kind": "calendar#events",
 "etag": "\"1455657932674000\"",
 "summary": "Jours fériés en France",
 "updated": "2016-02-16T21:25:32.674Z",
 "timeZone": "Europe/Paris",
 "accessRole": "reader",
 "defaultReminders": [],
 "nextSyncToken": "CNCn96-c_coCEPjYpIC7l8sCGAE=",
 "items": [
  {
   "kind": "calendar#event",
   "etag": "\"2778456944000000\"",
   "id": "20150101_60o30d1hcco30c1g60o30dr4co",
   "status": "confirmed",
   "htmlLink": "https://www.google.com/calendar/event?eid=MjAxNTAxMDFfNjBvMzBkMWhjY28zMGMxZzYwbzMwZHI0Y28gZnIuZnJlbmNoI2hvbGlkYXlAdg",
   "created": "2014-01-09T00:47:52.000Z",
   "updated": "2014-01-09T00:47:52.000Z",
   "summary": "Le Jour de l'An",
   "creator": {
    "email": "fr.french#holiday@group.v.calendar.google.com",
    "displayName": "Jours fériés en France",
    "self": true
   },
   "organizer": {
    "email": "fr.french#holiday@group.v.calendar.google.com",
    "displayName": "Jours fériés en France",
    "self": true
   },
   "start": {
    "date": "2015-01-01"
   },
   "end": {
    "date": "2015-01-02"
   },
   "transparency": "transparent",
   "visibility": "public",
   "iCalUID": "20150101_60o30d1hcco30c1g60o30dr4co@google.com",
   "sequence": 0
  },
(...)

La fonction GooCallListeEvent de GooCalendar permet d'extraire une liste d'événements qu'elle retourne dans un objet dictionnary issu des données JSON... :


'
' récupére liste événements d'un calendrier
'
Function GooCalListeEvents(oLstEv As Object, Optional stIdCalendar As String = "primary") As Boolean
    If Not InitGooAuth Then
        Debug.Print "Erreur initialisation connection"
        Exit Function
    End If

    
    If Not oGoo.gooHTTP("GET", "https://www.googleapis.com/calendar/v3/calendars/" & stIdCalendar & "/events") Then
        MsgBox "Erreur récupération liste calendrier " & oGoo.oXMLHttp.responseText
    Else
       Debug.Print oGoo.oXMLHttp.responseText
      Dim jSon As Object
      Set jSon = JsonConverter.ParseJson(oGoo.oXMLHttp.responseText)
      Set oLstEv = jSon("items")
      GooCalListeEvents = True
    End If
End Function

Un exemple d'appel de cette fonction est donné avec la fonction TestFonctionCalListeEvents


'
'  Exemple de boucle d'appel Liste événements..
'
Private Sub TestFonctionCalListeEvents()
    Dim oLstEvt As Object
    Dim dDateDeb As Date
    Dim dDateFin As Date
    If GooCalListeEvents(oLstEvt, "fr.french#holiday@group.v.calendar.google.com") Then
            Debug.Print oLstEvt.Count
            Dim c
            For Each c In oLstEvt
               dDateDeb = ExtactDateEvent(c("start"))
               dDateFin = ExtactDateEvent(c("end"))
               Debug.Print " du " & dDateDeb & " au " & dDateFin & " " & c("summary") & "  "      ' & c("description")
          
            Next
    End If
End Sub

Suivant les événements les dates de début et fin sont stockées dans le paramètre date au format "yyyy-mm-dd" pour les événements d'une journée entière, ou dans le champ dateTime dans un format Iso du genre : "2012-02-01T09:00:00+01:00" la fonction ExtractDateEvent permet d'effectuer cette conversion en utilisant les fonctions ConvertUtc et ParseIso de JsonConverter lorsque le champ dateTime existe où la fonction DateSerial de VB dans le cas contraire ( champ date) .


'
' Extraction date d'un événement
'
Function ExtactDateEvent(e) As Date
 Dim stDT As String
 Dim stDTUtc As String
          On Error Resume Next
          stDT = e("dateTime")
          On Error GoTo 0
         If stDT <> "" Then
                  stDTUtc = JsonConverter.ConvertToUtc(JsonConverter.ParseIso(stDT))
                If stDTUtc <> "" Then
                        ExtactDateEvent = stDTUtc
                  End If
        Else 'si dateTime ="" on utilise date
            On Error Resume Next
            stDT = e("date") 'date sous la forme yyyy-mm-yy
             On Error GoTo 0
            If Len(stDT) = 10 Then
                ExtactDateEvent = DateSerial(Mid(stDT, 1, 4), Mid(stDT, 6, 2), Mid(stDT, 9, 2))
            End If
        End If
End Function

Le résultat d'un appel à la fonction "TestFonctionCallListeEvent" ce retrouve dans la fenêtre d'exécution :


 du 31/12/2015 au 01/01/2016 la Saint-Sylvestre  
 du 16/05/2016 au 17/05/2016 Le lundi de Pentecôte  
 du 19/06/2016 au 20/06/2016 Fête des Pères  
 du 15/08/2016 au 16/08/2016 L'Assomption  
 du 24/12/2016 au 25/12/2016 La veille de Noël  
 du 25/12/2016 au 26/12/2016 Noël  

IV-D. Ajout d'un événement

L'ajout d'un événement est effectué grâce à une requête ¨POST à l'url


https://www.googleapis.com/calendar/v3/calendars/{ID-Calendar}/events

avec des données JSON de la forme :


{
	"end":
		{
			"dateTime":"2016-02-29T10:37:42.000Z"
			},
	"start":
		{
			"dateTime":"2016-02-28T10:37:42.000Z"
		},
	"summary":"Nouvel \u00E9v\u00E9nement du 27/02/2016 11:37:42"
}

La fonction GooAjoutEvent de GooCalendar permet d'effectuer un ajout d'événement :


'
' Ecriture d'un événement
'
' 
'
Function GooAjoutEvent(dDebut As Date, dFin As Date, stTexte As String, Optional stIdCalendar As String = "primary") As Boolean
   Dim stData As String
   Dim stUrl As String
   Dim jSon As New Dictionary
   Dim CEnd As New Dictionary
   Dim CStart As New Dictionary
    If Not InitGooAuth Then
        Debug.Print "Erreur initialisation connection"
        Exit Function
    End If
  stUrl = "https://www.googleapis.com/calendar/v3/calendars/" & stIdCalendar & "/events"
  CEnd.Add "dateTime", JsonConverter.ConvertToIso(dFin)
  jSon.Add "end", CEnd
  CStart.Add "dateTime", JsonConverter.ConvertToIso(dDebut)
  jSon.Add "start", CStart
  jSon.Add "summary", stTexte
  stData = JsonConverter.ConvertToJson(jSon)
 'liberation resources
 Set jSon = Nothing
 Set CEnd = Nothing
 Set CStart = Nothing
 If Not oGoo.gooHTTP("POST", stUrl, stData) Then
     MsgBox "Erreur récupération écriture événement calendrier " & oGoo.oXMLHttp.responseText
 Else
    Debug.Print "Ajout OK : " & stTexte & " début : " & dDebut & " fin : " & dFin
    GooAjoutEvent = True
 End If
End Function
'
' Procédure pour  aJout d'événement
'
Private Sub TestAjoutEvent()
    Debug.Print GooAjoutEvent(DateAdd("d", 1, Now), DateAdd("d", 2, Now), "Nouvel événement du " & Now)
End Sub

V. Conclusion et téléchargement

Il est clair que le code joint ne demande qu'as être amélioré mais j'ai espoir que celui-ci ouvre la voie à vos développements avec API Google Calendar..

Vous pouvez télécharger le classeur Excel ici : https://sites.google.com/site/pageabbil/home/goocalendar/GooCalendarV2.xlsm

N'hésitez pas à utiliser la zone commentaire de cette page pour m'aider à l'améliorer (que ce soit orthographe/grammaire où technique VB..)

Comments