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

时间:2017-10-14 02:04:07

标签: excel excel-vba google-sheets oauth-2.0 google-oauth vba

我一直在砖墙上撞到我的头,带着以下可爱的难题:

关键是要将数据从Excel传输到Google表格而不上传文件,而是浏览网址。以下方便地解释了所有业务的发展方式:

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

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

我在操作的oAuth2部分遇到了障碍。从桌面解放站点(上面的第二个链接)上的示例中,凭据从Google创建,然后插入到在传输数据之前验证连接的代码中。就这样:

Private Function sheetsOnceOff()

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

End Function

如果没有这样做,之前的代码行将只返回主Google登录页面。我已经创建了凭据,确定了电子表格的目标密钥,但是我在getGoogled例程中遇到错误:

  

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

参数值如下:   - scope ='sheets',应该是   - 更换包=“”   - clientID没问题   - clientSecret没问题   - 抱怨=真   - cloneFromScope =“”   - apikey =“”

我认为如果抱怨是真的,替换包不应该是空的,但我觉得我不在这里。至少需要发生的事情的逻辑对我来说是有道理的,而且我已经设法从Google表格转移到工作正常,但我只是不确定如何处理oAuth2身份验证问题。

提前谢谢。

2 个答案:

答案 0 :(得分:0)

以下内容绝不是一个完整的解决方案,但它是一个基本的开始。下面的条件是登录到gmail,它会将一个数据移动到带有时间戳的Google表格中。它通过direclty打开用户单击表单上的提交后出现的页面,从而模仿提交。 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

答案 1 :(得分:0)

事实证明,解决方案相当简单,这要归功于Selenium Basic库,这里有很多关于它如何工作的有用信息:

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

请注意:此下载需要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是具有响应列表的电子表格的链接。您可以将此例程划分为两个子 - 一个用户日志,另一个创建一个要输入谷歌的项目数组,此时它只是用新值刷新同一页面,因为它循环循环或阵列。

还有一个链接: Selenium VBA - exit sub without close browser window

使变量公开可确保浏览器窗口在会话结束时不会关闭,或者如果希望关闭,则可以在第一个子区域内声明它们。至于凭证,您可以对它们进行硬编码或从电子表格中提取,但这是技术性的。除此之外,它似乎是一个非常简单的例程,它确实很好地完成了工作。

Selenium库的语法明显比VBA更现代,我说的更强大