1

J'ai été frappé ma tête sur un mur de briques avec le casse-tête belle suivante:Charger une feuille de calcul Excel pour Google Sheets

Le point est d'obtenir des données à partir d'Excel à Google Sheets sans téléchargement de fichiers, mais en passant par le URL. Ce qui suit explique comment haut la main toute cette affaire transpire:

https://www.youtube.com/watch?v=mX2_XNYPGiI http://ramblings.mcpher.com/Home/excelquirks/exceldocsintegration/excelsheetsv4

J'ai essayé d'adapter le code suivant pour le côté VBA des choses, commun aux deux exemples:

Option Explicit 

Sub GetDataFromGoogle() 

'link to tutorial: https://www.youtube.com/watch?v=mX2_XNYPGiI 

Dim link As String 

link = "https://docs.google.com/spreadsheets/d/e/2PACX-1vSes7Jb06JRy8KSFyNlpUSzNQxSB_HZay4S8AB2IqzpZP0QdwGO5PFSS-6uzd8v_GsjlkXM31pby2jE/pubhtml" 
Sheet4.QueryTables(1).Connection = "URL;" & link 
Sheet4.QueryTables(1).Refresh False 
Sheet4.Columns(1).ColumnWidth = 10 

End Sub 

Sub PushDataToGoogle() 



Dim link As String 

link = "https://docs.google.com/forms/d/e/1FAIpQLSeDHEKJmRDynwOAS4g53T9AVMtpXQkWsRGbAzLpLI7rdsbiFA/formResponse?entry.1155739640=4&fvv=1&draftResponse=%5B%5B%5Bnull%2C1155739640%2C%5B%224%22%5D%0D%0A%2C0%5D%0D%0A%5D%0D%0A%2Cnull%2C%2276341394568976993%22%5D%0D" 
'go to that link, refresh it and ensure that the first column isn't too narrow 

sheets("Sheet4").QueryTables(1).Connection = "URL;" & link 

sheets("Sheet4").QueryTables(1).Refresh True 
sheets("Sheet4").Columns(1).ColumnWidth = 10 

End Sub 

sur Du côté de Google Sheets, j'ai utilisé un formulaire pour créer une feuille de calcul qui est à la fois la source de données pour une importation Excel et la destination pour l'exportation de données. Replacer POST et GET dans le HTML de la page de formulaire est le moyen d'obtenir l'URL de destination. Par la suite, cette URL peut être codée en dur ou éditée avec des variables pour obtenir diverses entrées pour la partie "entrée. ######" de l'URL, puis elle est transmise à la feuille dans la ligne disponible suivante, ce qui convient à mes fins.

J'ai rencontré un problème avec la partie oAuth2 de l'opération. À partir de l'exemple sur le site Desktop Liberation (deuxième lien ci-dessus), les informations d'identification sont créées à partir de Google, puis insérées dans un code qui authentifie la connexion avant de transmettre les données. En tant que tel:

Private Function sheetsOnceOff() 

    getGoogled "sheets", , _ 
    "1023445954023-hq8gkdcmo9sue822d23gy9ak5hmun27.apps.googleusercontent.com", _ 
    "dX7ABCDEGFBETFWtvX5ShmDfrgrQ" 

End Function 

Si cela n'est pas fait, les lignes de code précédentes retourneront simplement la page de connexion Google principale. J'ai fait les informations d'identification, déterminé que la clé de destination pour la feuille de calcul, mais je reçois une erreur dans la routine getGoogled qui dit:

Runtime-error: '-2147024809 (80070057)': The parameter is incorrect."

valeurs des paramètres sont les suivantes: - scope = « feuilles », comme il devrait être - paquet de remplacement = "" - clientID est OK - clientSecret est OK - se plaindre = true - cloneFromScope = "" - apikey = ""

Je pense le paquet de remplacement ne doit pas être vide si la plainte est vraie, mais je sens que je suis hors de ma profondeur ici. Au moins, la logique de ce qui doit se passer est logique pour moi, et j'ai réussi à faire fonctionner le transfert à partir de Google Sheets, mais je ne suis pas sûr de savoir comment gérer l'authentification oAuth2.

Merci à l'avance.

Répondre

0

fin de compte, la solution est beaucoup plus simple, grâce à la bibliothèque sélénium de base, disponible ici, avec beaucoup d'informations utiles sur la façon dont cela fonctionne:

https://codingislove.com/browser-automation-in-excel-selenium/

une note de votre attention: cette téléchargement a besoin de Selenium GoogleChrome version du pilote 2.33, la dernière version actuelle, pour résoudre une erreur avec le démarrage de Chrome correctement - au moins Dans mon cas, j'ai besoin de Chrome et non d'IE.

En tout cas, Selenium est un dieu-envoyer pour ceux dans une situation similaire. Lorsque vous téléchargez et installez Selenium, allez dans Outils -> Références dans l'éditeur VB, et activez la bibliothèque de types Selenium.

Le code suivant fera le travail:

Option Explicit 
Dim myHTML_Element As IHTMLElement 
Dim Driver As New WebDriver 

Sub seleniumtutorial() 

Dim pword As String 
Dim link As String, link2 As String 

pword = ThisWorkbook.sheets("Sheet1").Range("D10") 

Driver.Start "chrome", "https://gmail.com" 
Driver.Get ("https://gmail.com") 
Driver.FindElementById("identifierId").SendKeys "[email protected]" 
Driver.FindElementById("identifierNext").Click 
'Driver.Get ("https://sso.diversey.com/nidp/saml2/sso?id=DIVAuthContract30&sid=0&option=credential&sid=0") 
Driver.FindElementById("uname").SendKeys "Username" 
Driver.FindElementById("pass").SendKeys pword 
Driver.FindElementByName("loginButton2").Click 

link = "https://docs.google.com/forms/d/e/1FAIpQLSeDHEKJmRDyMt7rdsbiFA/formResponse?entry.1155739640=7&fvv=1&draftR=%5B%5B%5Bnull%2C115B%224%22%5D%0D%0A%2C0%5D%%0A%5D%0D%0A%2Cnull%2C%227634134997568976993%22%5D%0D" 
link2 = "https://docs.google.com/spreadsheets/d/1W8A3UuyeEwk6-hqERvuIMT_HInySBOIs/edit#gid=1126962360" 

Driver.Get (link) 
Driver.Get (link2) 

End Sub 
lien

et lien2 sont, respectivement, la page qui confirme une réponse a été présentée et lien2 est le lien vers la feuille de calcul qui a la liste des réponses. Vous pouvez diviser cette routine en deux journaux sous-utilisateur dans l'utilisateur, et l'autre crée un tableau des éléments à alimenter à google, à quels points il actualise juste la même page avec les nouvelles valeurs, car il parcourt la boucle ou tableau.

Un lien plus: Selenium VBA - exit sub without close browser window

Faire les variables Se assure publiques que la fenêtre du navigateur ne se ferme pas à la fin de la session, ou vous pouvez les déclarer à l'intérieur du premier sous si vous voulez fermer. En ce qui concerne les informations d'identification, vous pouvez les coder en dur ou les nourrir à partir de la feuille de calcul, mais c'est une question technique. Au-delà de cela, cela semble être une routine assez simple et cela fait vraiment bien le travail.

La syntaxe de la bibliothèque Selenium est décidément plus moderne que VBA et je dirais un peu plus puissant

0

Ce qui suit n'est en aucun cas une solution complète, mais c'est un début rudimentaire. La condition sur ce qui suit est d'être connecté à Gmail, et il va déplacer un morceau de données dans des feuilles Google avec son horodatage. Il fonctionne en ouvrant directement la page qui apparaît après qu'un utilisateur clique sur Soumettre sur le formulaire, imitant ainsi une soumission. Link2 ouvre la feuille de calcul où la réponse est transmise. L'inconvénient est qu'il nécessite que l'utilisateur soit déjà connecté à Gmail et ouvre un nouvel onglet chaque fois qu'une variable est transmise, évitez donc de le modifier avec des tableaux ou des boucles. Cependant, je vais essayer de mettre sur pied un projet vba gmail antérieur avec ceci pour voir si cela peut fonctionner. Plus sera disponible, mais pour une solution de pansement ensemble piraté, ce sera le cas si quelqu'un en a besoin.

Crédits et informations ici:

[https: // stackoverflow.com/questions/3166265/open-an-html-page-dans-default-browser-with-vba https://stackoverflow.com/questions/5915325/open-google-chrome-from-vba-excel

Sub PushDataToGoogle() 

Dim chromePath As String 

chromePath = """C:\Program Files\Google\Chrome\Application\chrome.exe""" 

Dim link As String, link2 As String 

link = "https://docs.google.com/forms/d/e/1FAIpQLSeDHEKJmRDynwOAS4gtpXQkWsRGbAzLpLI7rdsbiFA/formResponse?entry.1155739640=4&fvv=1&draftResponse=%5B%5B%5Bnull%2C11557396%224%22%5D%0D%0A%2C0%5D%0D%0A%5D%0D%0A%2Cnull%2C%227634134997568976993%22%5D%0D" 
link2 = "https://docs.google.com/spreadsheets/d/1W8A3UuFQTeEwk6-hqERvuIMT_HInySZTNBOIs/edit#gid=11262360" 

Shell (chromePath & link) 

ThisWorkbook.FollowHyperlink link2 

End Sub