我一直在砖墙上撞到我的头,带着以下可爱的难题:
关键是要将数据从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身份验证问题。
提前谢谢。
答案 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更现代,我说的更强大