将Excel电子表格上载到Google工作表

将Excel电子表格上载到Google工作表,excel,google-sheets,oauth-2.0,google-oauth,vba,Excel,Google Sheets,Oauth 2.0,Google Oauth,Vba,我的头撞到了砖墙上,遇到了以下可爱的难题: 关键是不需要上传文件,而是通过URL从Excel获取数据到Google工作表。下面简单地解释了所有这些业务是如何发生的: 我尝试将以下代码改编为VBA方面的内容,这两个示例都有: Option Explicit Sub GetDataFromGoogle() 'link to tutorial: https://www.youtube.com/watch?v=mX2_XNYPGiI Dim link As String link = "

我的头撞到了砖墙上,遇到了以下可爱的难题:

关键是不需要上传文件,而是通过URL从Excel获取数据到Google工作表。下面简单地解释了所有这些业务是如何发生的:

我尝试将以下代码改编为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
在GoogleSheets方面,我使用一个表单创建了一个电子表格,它既是Excel导入的数据源,也是数据导出的目的地。在表单页面的HTML中回复POST和GET是获取目标URL的方法。随后,该URL可以是硬编码的,也可以使用变量进行编辑,以获得URL“entry.#######”部分的各种输入,然后将它们传递到下一行的工作表中,这符合我的目的

我在操作的oAuth2部分遇到了障碍。从桌面解放网站(上面的第二个链接)上的示例中,凭据是从Google创建的,然后插入到一个代码中,该代码在传输数据之前对连接进行身份验证。因此:

Private Function sheetsOnceOff()

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

End Function
如果不这样做,前面的代码行将只返回主谷歌登录页面。我已经做了凭证,确定了电子表格的目标键,但是我在getGoogled例程中得到一个错误,它说:

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

参数值如下所示: -范围='sheets',应为 -更换包=“” -clientID还可以 -clientSecret没问题 -抱怨=正确 -cloneFromScope=“” -apikey=“”

如果投诉属实,我认为替换包不应该是空的,但我觉得我在这里有点不知所措。至少需要发生的事情的逻辑对我来说是有意义的,我已经设法让Google Sheets的传输正常工作,但我只是不确定如何处理oAuth2身份验证问题


提前感谢您。

以下内容绝不是一个完整的解决方案,但它只是一个初步的开始。以下内容的条件是登录到gmail,它会将一段带有时间戳的数据移动到Google sheets中。它的工作原理是直接打开用户单击表单上的Submit后显示的页面,从而模仿g a submission.Link2打开传递响应的电子表格

缺点是它要求用户已经登录到Gmail,并且在每次通过变量时都会打开一个新的标签,所以避免用数组或循环来修改它。但是,我会尝试把一个以前的VBA Gmail项目与这个结合起来,看看它是否能工作。如果有人需要我会的

此处的信用和信息:

[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

事实证明,由于这里提供了Selenium Basic库,该解决方案相当简单,并提供了许多关于其工作原理的有用信息:

请注意:此下载需要Selenium GoogleChrome驱动程序版本2.33(当前最新版本),以解决Chrome正常启动时出现的错误-至少在我的情况下,我需要Chrome而不是IE

在任何情况下,Selenium都是类似情况下的天赐良机。下载并安装Selenium时,请进入VB编辑器中的工具-->引用,并启用Selenium类型库

以下代码将完成此工作:

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
link和link2分别是确认已提交响应的页面,link2是指向包含响应列表的电子表格的链接。您可以将此例程分为两个子部分-一个是用户日志,另一个是创建一个项目数组以提供给google,此时它只需使用当循环通过循环或数组时,重新生成新值

还有一个链接:

将变量公开可确保浏览器窗口不会在会话结束时关闭,或者如果希望关闭,可以在第一个子系统中声明它们。至于凭据,可以硬编码它们,也可以从电子表格中输入它们,但这是一个技术问题。除此之外,这似乎是一个非常简单的例程,而且这项工作做得很好

Selenium库的语法显然比VBA更现代,而且我想说它的功能更强大