Forums des produits Google > Forum Google Agenda > Google Agend

GADENSEB Messages postés 7 Date d'inscription dimanche 4 janvier 2015 Statut Membre Dernière intervention 5 janvier 2015 - 4 janv. 2015 à 16:57
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 5 janv. 2015 à 10:30
Bonsoir le Forum,
J'ai une macro excel qui ne fonctionne plus !!! grrrr

cette macro me permettait de générer des rdv dans mon GoogleAgenda....

Mais là elle ne veut plus marcher.....

Schéma :
La date est passée au format GoogleAgenda puis création du rdv puis flag.

La modif de la date et le flag marche nikel, mais de création de rdv dans GoogleAgenda


Si qqn à une idée, je suis preneur !!

Bonne soirée
Seb


Dim i, j As Integer

Sub GoogleAgenda()


With Worksheets("RDV")




On Error Resume Next
j = .Range("A2").End(xlDown).Row
For i = 2 To j


'Convertit la DATERELANCE en Format de DATE pour GOOGLEAGENDA
.Cells(i, "D") = "'" & Format(.Cells(i, "C"), "yyyy-mm-dd")



If .Cells(i, 5) <> "ok" And .Cells(i, 4) <> "" Then

'================================== PARAMETRES GOOGLE AGENDA ==================================
Email = "XXXXXXXXXXXXXXXXXXXXXXX"
Passwd = "XXXXXXXXXXXXXXXXXXXX"
authUrl = "https://www.google.com/accounts/ClientLogin"
CALENDARURL = "http://www.google.com/calendar/feeds/default/private/full"
MAILINVITE = "XXXXXXXXXXXXXXXXXXXXX"
LIEU = "XXXXXXXXXXXXXXXXXXXXX"


sujet = Range("C" & i).Value & " - " & Range("AF" & i).Value
DESCRIPTIONRDV = Range("AF" & i).Value
NOMINVITE = "Agenda Emploi"
DATEDEBUT = Range("AP" & i).Value & "T14:00:00.000Z"
DATEFIN = Range("AP" & i).Value & "T15:15:00.000Z"



'================================== CREATION D'UN EVENEMENT ==================================
calendarEntry = "<?xml version='1.0' ?><entry xmlns='http://www.w3.org/2005/Atom' " _
& "xmlns:gd='http://schemas.google.com/g/2005'>" _
& "<category scheme='http://schemas.google.com/g/2005#kind' " _
& "term='http://schemas.google.com/g/2005#event'></category>" _
& "<title type='text'>" & sujet & "</title>" _
& "<content type='text'>" & DESCRIPTIONRDV & "</content>" _
& "<author>" _
& "<name>" & NOMINVITE & "</name>" _
& "<email>" & MAILINVITE & "</email>" _
& "</author>" _
& "<gd:transparency " _
& "value='http://schemas.google.com/g/2005#event.opaque'>" _
& "</gd:transparency>" _
& "<gd:eventStatus " _
& "value='http://schemas.google.com/g/2005#event.confirmed'>" _
& "</gd:eventStatus>" _
& "<gd:where valueString='" & LIEU & "'></gd:where>" _
& "<gd:when startTime='" & DATEDEBUT & "' " _
& "endTime='" & DATEFIN & "'></gd:when>" _
& "</entry>"

'================================== AUTHENTIFICATION ==================================
Set objHTTP = CreateObject("Microsoft.XMLHTTP")
objHTTP.Open "POST", authUrl, False
objHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
objHTTP.send "Email=" + Email + "&Passwd=" + Passwd + "&service=cl&source=Gulp-CalGulp-1.05"
strAuthTokens = objHTTP.responseText
strAuthTokens = Replace(strAuthTokens, vbCr, "")
strAuthTokens = Replace(strAuthTokens, vbLf, "")
strAuthTokens = Replace(strAuthTokens, vbCrLf, "")
strAuthTokens = Replace(strAuthTokens, "SID", "&SID", 1, 1)
strAuthTokens = Replace(strAuthTokens, "LSID", "&LSID")
strAuthTokens = Replace(strAuthTokens, "Auth", "&Auth")
strAuthTokens = Right(strAuthTokens, Len(strAuthTokens) - Len("Auth=") - InStr(strAuthTokens, "Auth=") + 1)
Set objHTTP = Nothing

'================================== REDIRECT ==================================
Set objHTTP = CreateObject("Microsoft.XMLHTTP")
objHTTP.Open "POST", CALENDARURL, False
objHTTP.setRequestHeader "Content-Type", "application/atom+xml"
objHTTP.setRequestHeader "X-If-No-Redirect", "True"
objHTTP.setRequestHeader "Authorization", "GoogleLogin auth=" & strAuthTokens
objHTTP.send calendarEntry
'objHTTP.status should be 412

'================================== POST TO THE NEW URL ==================================
headers = objHTTP.getAllResponseHeaders()
strResponse = objHTTP.responseText
redirectStringPos = InStr(headers, "X-Redirect-Location:")
redirectStringLength = InStr(InStr(headers, "X-Redirect-Location:"), headers, vbCrLf) - InStr(headers, "X-Redirect-Location:")
redirectUrl = Replace(Mid(headers, redirectStringPos, redirectStringLength), "X-Redirect-Location: ", "")

Set objHTTP = CreateObject("Microsoft.XMLHTTP")
objHTTP.Open "POST", redirectUrl, False
objHTTP.setRequestHeader "Authorization", "GoogleLogin auth=" & strAuthTokens
objHTTP.setRequestHeader "Content-Type", "application/atom+xml"
objHTTP.send calendarEntry
'objHTTP.status should be 201


If objHTTP.Status = 201 Then
MsgBox "Event saved"
Else
MsgBox objHTTP.Status



End If
.Cells(i, 5) = "OK"
Next

End With

End Sub

13 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
4 janv. 2015 à 17:28
Et dans la foulée (cela te permettra d'y voir plus clair) :
1) Travaille en Option Explicit (Option Explicit à mettre tout en haut de ton module de code), puis corrige ce qui va être dénoncé (toutes tes variables non déclarées).
2)
Dim i, j As Integer
fait que seul J est typé en integer, i n'étant pas typé (et donc variant)
Corrige cela également
1
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 4/01/2015 à 18:19
Si j'enléve "On Error Resume Next" j'ai une erreur sur la ligne


redirectStringLength = InStr(InStr(headers, "X-Redirect-Location:"), headers, vbCrLf) - InStr(headers, "X-Redirect-Location:")


ce qui veut dire que ta variable headers est vide ou ne contient pas "X-Redirect-Location:"
et que donc
InStr(headers, "X-Redirect-Location:")
est = 0 ==>> erreur alors inévitable !

PS : et de plus : ce n'est pas la première fois que tu rencontres cette erreur, à savoir :
erreur d'exécution '5' : argument ou appel de procédure incorrect

Tu l'avais déjà observée en mai 2014 et tu croyais l'avoir corrigée (je vois mal selon quelle logique) en supprimant les lignes de code relatives à la vérification du status.
Alors ?
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
1
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
4 janv. 2015 à 18:54
Bon...
Une expérience récente m'impose la prudence
Si tu acceptes maintenant que ma réponse soit celle d'une grande franchise (lorsque je suis franc, il arrive que l'on m'accuse d'être "sec", voire "méprisant" et je ne sais quoi d'autre encore...), dis-le clairement, mais attends-toi alors à une véritable petite "avalanche", et je te dis tout ce qu'il y a à dire à ce propos.
Ne le fais donc que si tu as bon caractère.
1
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 4/01/2015 à 20:01
Alors on y va, point par point ===>>
- point 1 : il ne concerne pas, à ce stade, l' "approche" du problème, mais le code lui-même (en soi, donc) :
Je t'en parle avec une certaine liberté, car je sais que tu n'en es pas l'auteur et que tu l'as "glané"...
Il a été écrit par un apprenti-alchimiste et cela se voit à mille et un "détails" assez révélateurs. Le plus grave (mais c'est loin d'être le seul point ) d'entre eux étant de recréer un objet déjà créé. L'auteur de ce code ne semble même pas savoir qu'existent createobject et getobject et comment on les utilise.
- point 2 : ta suppression des lignes de vérification du "status" n'a aucune incidence sur l'erreur résultant de l'absence éventuelle de la chaine "X-Redirect-Location:", ainsi écrite TRES exactement.
Mais je ne vais pas trop m'étendre sur cet aspect et vais passer à l'essentiel ===>>
- point 3, donc : une "approche" de l'espèce est par définition entièrement dépendante de l'analyse et de la construction d'un fichier (XML) qui ne correspond pas forcément à ce qu'en attend l'application Google concernée. Les aleas possibles sont nombreux, parmi lesquels la possibilité de la présence, dans certains cas, d'un caractère NULL de terminaison (chr(0))

La seule approche raisonnable est donc à mon sens celle de l'utilisation des fonctions de l'API de Google, qu'il faut donc "bûcher". Ce n'est certes pas une sinécure, mais ce ne sera qu'ainsi que tu éviteras les aléas les plus inattendus.
Ce que tu cherches à faire, c'est "piloter" une application Google. On ne pilote pas une application en traitant ce qu'elle "semble" attendre, mais en utilisant ses fonctions.

Voilà, ami. Je me suis efforcé d'être le plus "doux" possible.

PS : quant à ton erreur : "erreur exécution 80004005" :
- elle concerne un objet com et peut avoir en effet de nombreuses causes
- je ne serais absolument pas surpris de ce qu'elle résulte d'une "difficulté mémorielle" (excuse l'image) du fait d'essais successifs avec tous ces createobject (voir plus haut). Mais ce n'est qu'une supposition.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
4 janv. 2015 à 21:11
Si tu veux travailler sans failles et aléas et que tu es prêt à y passer du temps, voici ce qu'il va falloir que tu bûches et exploites :
https://developers.google.com/google-apps/calendar/
si tu tiens vraiment à piloter cette appli google depuis Excel
Observons que les données sont en format JSON (JavaScript Object Notation)
Bon courage
1
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
4 janv. 2015 à 17:15
Bonjour,
1) Qu'est-ce qui ne "marche" plus ? Et quels sont les symptômes exacts (et/ou erreurs dénoncées, le cas échéant ... en en montrant la ligne d'erreur).
2) enlève déjà ce On Error Resume Next (qui vient cacher une erreur possible)
3) as-tu au moins vérifié que ta sub GoogleAgenda était lancée ?
Mets donc un
msgbox "bonjour" juste en dessous de GoogleAgenda()
et dis-nous si ce message s'affiche ou non.
0
GADENSEB Messages postés 7 Date d'inscription dimanche 4 janvier 2015 Statut Membre Dernière intervention 5 janvier 2015
4 janv. 2015 à 17:21
ouppps il me manque une partie de mon texte !!!
Bien vu !!!
1 - ce qui ne marche plus : les rdv ne se créent plus sous googleAgenda

2- Si j'enléve "On Error Resume Next" j'ai une erreur sur la ligne

redirectStringLength = InStr(InStr(headers, "X-Redirect-Location:"), headers, vbCrLf) - InStr(headers, "X-Redirect-Location:")


3 - Pour "msgbox "bonjour" " cela marche parfaitement j'ai un pop-up qui aparait
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
4 janv. 2015 à 17:30
" j'ai une erreur sur la ligne "
Quelle erreur ?
0
GADENSEB Messages postés 7 Date d'inscription dimanche 4 janvier 2015 Statut Membre Dernière intervention 5 janvier 2015
4 janv. 2015 à 18:14
re
Bon j'ai bossé mes variables

mais j'ai tjrs un soucis sur
objHTTP.send calendarEntry
-->erreur exécution 80004005
qui, suivant internet peut correspondre à plein de choses .....

Vous auriez une idée ??

Merki

Seb



Option Explicit


Sub GoogleAgenda()

Dim i As Integer
Dim j As Integer
Dim email As String
Dim Passwd As String
Dim authUrl As String
Dim CALENDARURL As String
Dim MAILINVITE As String
Dim lieu As String
Dim sujet As String
Dim DESCRIPTIONRDV As String
Dim NOMINVITE As String
Dim DATEDEBUT As String
Dim DATEFIN As String
Dim calendarEntry As String
Dim objHTTP As Variant
Dim strAuthTokens As Variant
Dim headers As Variant
Dim strResponse As Variant
Dim redirectStringPos As Variant
Dim redirectStringLength As Variant
Dim redirectUrl As Variant


MsgBox "bonjour"
With Worksheets("RDV")




'On Error Resume Next
j = .Range("A2").End(xlDown).Row
For i = 2 To j


'Convertit la DATERELANCE en Format de DATE pour GOOGLEAGENDA
.Cells(i, "D") = "'" & Format(.Cells(i, "C"), "yyyy-mm-dd")



If .Cells(i, 5) <> "ok" And .Cells(i, 4) <> "" Then

'================================== PARAMETRES GOOGLE AGENDA ==================================
email = "xxxxxxxxxxxxxxxxxxxxxxx"
Passwd = "xxxxxxxxxxxxxx"
authUrl = "https://www.google.com/accounts/ClientLogin"
CALENDARURL = "http://www.google.com/calendar/feeds/default/private/full"
MAILINVITE = "xxxxxxxxxxxxxxxxxxxxxxxx"
lieu = "xxxxxxxxxxxxxxxxxxxxxxx"


sujet = Range("C" & i).Value & " - " & Range("AF" & i).Value
DESCRIPTIONRDV = Range("AF" & i).Value
NOMINVITE = "Agenda Emploi"
DATEDEBUT = Range("AP" & i).Value & "T14:00:00.000Z"
DATEFIN = Range("AP" & i).Value & "T15:15:00.000Z"



'================================== CREATION D'UN EVENEMENT ==================================
calendarEntry = "<?xml version='1.0' ?><entry xmlns='http://www.w3.org/2005/Atom' " _
& "xmlns:gd='http://schemas.google.com/g/2005'>" _
& "<category scheme='http://schemas.google.com/g/2005#kind' " _
& "term='http://schemas.google.com/g/2005#event'></category>" _
& "<title type='text'>" & sujet & "</title>" _
& "<content type='text'>" & DESCRIPTIONRDV & "</content>" _
& "<author>" _
& "<name>" & NOMINVITE & "</name>" _
& "<email>" & MAILINVITE & "</email>" _
& "</author>" _
& "<gd:transparency " _
& "value='http://schemas.google.com/g/2005#event.opaque'>" _
& "</gd:transparency>" _
& "<gd:eventStatus " _
& "value='http://schemas.google.com/g/2005#event.confirmed'>" _
& "</gd:eventStatus>" _
& "<gd:where valueString='" & lieu & "'></gd:where>" _
& "<gd:when startTime='" & DATEDEBUT & "' " _
& "endTime='" & DATEFIN & "'></gd:when>" _
& "</entry>"

'================================== AUTHENTIFICATION ==================================
Set objHTTP = CreateObject("Microsoft.XMLHTTP")
objHTTP.Open "POST", authUrl, False
objHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
objHTTP.send "Email=" + email + "&Passwd=" + Passwd + "&service=cl&source=Gulp-CalGulp-1.05"
strAuthTokens = objHTTP.responseText
strAuthTokens = Replace(strAuthTokens, vbCr, "")
strAuthTokens = Replace(strAuthTokens, vbLf, "")
strAuthTokens = Replace(strAuthTokens, vbCrLf, "")
strAuthTokens = Replace(strAuthTokens, "SID", "&SID", 1, 1)
strAuthTokens = Replace(strAuthTokens, "LSID", "&LSID")
strAuthTokens = Replace(strAuthTokens, "Auth", "&Auth")
strAuthTokens = Right(strAuthTokens, Len(strAuthTokens) - Len("Auth=") - InStr(strAuthTokens, "Auth=") + 1)
Set objHTTP = Nothing

'================================== REDIRECT ==================================
Set objHTTP = CreateObject("Microsoft.XMLHTTP")
objHTTP.Open "POST", CALENDARURL, False
objHTTP.setRequestHeader "Content-Type", "application/atom+xml"
objHTTP.setRequestHeader "X-If-No-Redirect", "True"
objHTTP.setRequestHeader "Authorization", "GoogleLogin auth=" & strAuthTokens
objHTTP.send calendarEntry
'objHTTP.status should be 412

'================================== POST TO THE NEW URL ==================================
headers = objHTTP.getAllResponseHeaders()
strResponse = objHTTP.responseText
redirectStringPos = InStr(headers, "X-Redirect-Location:")
redirectStringLength = InStr(InStr(headers, "X-Redirect-Location:"), headers, vbCrLf) - InStr(headers, "X-Redirect-Location:")
redirectUrl = Replace(Mid(headers, redirectStringPos, redirectStringLength), "X-Redirect-Location: ", "")

Set objHTTP = CreateObject("Microsoft.XMLHTTP")
objHTTP.Open "POST", redirectUrl, False
objHTTP.setRequestHeader "Authorization", "GoogleLogin auth=" & strAuthTokens
objHTTP.setRequestHeader "Content-Type", "application/atom+xml"
objHTTP.send calendarEntry
'objHTTP.status should be 201


End If
.Cells(i, 5) = "OK"
Next

End With

End Sub
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
4 janv. 2015 à 18:22
Tiens !
Et l'erreur précédente ? Disparue ?
Lis par ailleurs mon post-scriptum au bas de mon message précédent et viens t'expliquer, s'il te plait.
0
GADENSEB Messages postés 7 Date d'inscription dimanche 4 janvier 2015 Statut Membre Dernière intervention 5 janvier 2015
4 janv. 2015 à 18:41
J'avais pas vu ton post-scriptum

l'erreur était valeur non définie......
oui cette erreur à disparue now .....
0
GADENSEB Messages postés 7 Date d'inscription dimanche 4 janvier 2015 Statut Membre Dernière intervention 5 janvier 2015
4 janv. 2015 à 19:06
;-) Je suis là pour apprendre donc j'accepte toutes critiques, constructives
.....

Fonces !!

Ps : c'est sympa d'avoir prévenu !
0
GADENSEB Messages postés 7 Date d'inscription dimanche 4 janvier 2015 Statut Membre Dernière intervention 5 janvier 2015
5 janv. 2015 à 09:29
Salut à vous !

Déjà, merci pour vos messages.

1- C'est effectivement un code que j'ai trouvé sur un forum et retravaillé selon mes besoins !!
2- C'est effectivement du JSON de l'API Google agenda v2, je viens de trouver que cette version du code à été stoppée par Google pour passer à la V3 mi-novembre donc ce code ne marchera donc plus effectivement, je vais clôturer le sujet
3- Je dois donc bûcher pour passer à GoogleAPI calendar V3

--> Si vous connaissez une bonne méthode (simple et rapide) pour synchroniser mon google agenda avec une feuille excel je suis preneur !!! cela fait un an que je cherche et je ne trouve pas ...

Bonne journée
Seb
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 5/01/2015 à 10:31
Je n'en connais pas. Je n'ai jamais travaillé avec cet outil Google.
J'ignore par ailleurs si tu as un parfait accès à ,la lecture d'un enregistrement.
Si oui : pourquoi ne pas essayer :
1) de créer manuellement un article "pipeau" dont chaque champ serait une chaîne de caractère du genre "@1@", "@2@", "@3@", etc ...
2) à chaque besoin de création nouvelle :
a) lire cet article "pipeau" dans une variable toto
b) "tripoter" cette variable avec Replace("@1@", "ce que tu veux"), etc ...
3) envoyer cette variable toto

Essaye (on ne sait jamais).
Mais si ne marche pas ===>> va falloir recourir aux fonctions de l'API de Google.
Bon courage

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
0
Rejoignez-nous