将Excel电子表格上传到Google表格

我一直在砖头墙上打我的头,以下可爱的难题:

重点是从Excel中获取数据到Google表格,无需上传文件,而是通过url。 以下简单解释所有这些业务是如何发生的:

我已经试过适应以下代码的VBA一面的东西,这两个例子是通用的:

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 

在Google表格方面,我使用表单来创build电子表格,该电子表格既是Excel导入的数据源,又是数据导出的目的地。 在表单页面的HTML中重新定位POST和GET是获取目标URL的方式。 随后,可以对该URL进行硬编码或使用variables进行编辑,以便为URL的“entry。######”部分获取各种input,然后将它们传递到下一个可用行中的表单适合我的目的。

我用操作的oAuth2部分碰到了一个障碍。 从Desktop Liberation站点(上面的第二个链接)的示例中,凭据由Google创build,然后插入到传输数据之前validation连接的代码中。 因此:

 Private Function sheetsOnceOff() getGoogled "sheets", , _ "1023445954023-hq8gkdcmo9sue822d23gy9ak5hmun27.apps.googleusercontent.com", _ "dX7ABCDEGFBETFWtvX5ShmDfrgrQ" End Function 

如果没有这样做,以前的代码行将返回主要的Googlelogin页面。 我已经创build了凭据,确定了电子表格的目标键,但是在getGogogled例程中出现错误:

运行时错误:'-2147024809(80070057)':参数不正确。

参数值如下: – scope ='sheets',因为它应该是 – replacement package =“” – clientID是好的 – clientSecret是好的 – complain = true – cloneFromScope =“” – apikey =“”

我认为,如果抱怨是真的,replace包不应该是空的,但我觉得我已经超出了我的深度。 至less需要发生的逻辑对我来说是有意义的,而且我已经设法从Google Sheets转移到正常工作,但是我不确定如何处理oAuth2身份validation问题。

先谢谢你。

以下是不完整的解决scheme,但这是一个基本的开始。 下面的条件将被logging到gmail中,并且它会将一段数据移动到带有时间戳的Google工作表中。 它通过直接打开用户在表单上单击“提交”后出现的页面来工作,从而模仿提交。 Link2将打开传递响应的电子表格。

缺点是它要求用户已经login到gmail,每次传递variables时都会打开一个新的标签,所以不要用数组或循环来修改它。 不过,我会尝试把这个先前的vba gmail项目放在一起看看是否可以工作。 更多的将会是即将到来的,但是对于一个黑手党的解决scheme来说,如果有人需要这个解决scheme的话。

信用和信息在这里:

[https://stackoverflow.com/questions/3166265/open-an-html-page-in-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 

事实certificate,这个解决scheme相当简单,这要归功于这里提供的Selenium Basic库,并提供了许多关于它如何工作的有用信息:

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

请注意:此下载需要Selenium GoogleChrome驱动程序版本2.33(最新版本),以便在Chrome正常启动时解决错误 – 至less在我的情况下,我需要Chrome而不是IE工作。

在任何情况下,selenium是类似情况下的神派。 当您下载并安装Selenium时,请进入VB编辑器中的工具 – >引用,并启用Seleniumtypes库。

以下代码将完成这项工作:

 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 "user@company.com" 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 

链接和链接2分别是确认响应的页面已提交,链接2是具有响应列表的电子表格的链接。 你可以把这个例程分成两个用户下的一个日志,另一个创build一个要input到google的项目的数组,在这些点上它只是用新的值刷新同一个页面,因为它在循环中循环或数组。

多一个链接: Selenium VBA – 退出子而不closures浏览器窗口

公开variables可确保浏览器窗口在会话结束时不会closures,或者如果要closures,可以在第一个子项中声明它们。 至于凭据,您可以硬编码或从电子表格中提供,但这是一个技术问题。 除此之外,它似乎是一个非常简单的例程,它确实做得很好。

Selenium库的语法明显比VBA更现代化,我会说它更强大一些