【问题标题】:Uploading an Excel spreadsheet to Google Sheets将 Excel 电子表格上传到 Google 表格
【发布时间】:2017-10-14 02:04:06
【问题描述】:

我一直在用以下可爱的难题撞到一堵砖墙上:

重点是无需上传文件,而是通过 URL 将数据从 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 部分遇到了障碍。在 Desktop Liberation 站点(上面的第二个链接)上的示例中,凭据是从 Google 创建的,然后插入到验证连接的代码中,然后再传输数据。因此:

Private Function sheetsOnceOff()

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

End Function

如果不这样做,前面的代码行将只返回主 Google 登录页面。我已经制作了凭据,确定了电子表格的目标键,但我在 getGoogled 例程中收到错误消息:

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

参数值如下: - 范围 = 'sheets',应该是 - 替换包 = "" - clientID 没问题 - clientSecret 没问题 - 抱怨 = 真 - cloneFromScope = "" - apikey=""

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

提前谢谢你。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      事实证明,解决方案要简单得多,这要归功于 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 是指向包含响应列表的电子表格的链接。您可以将此例程分为两个子程序 - 一个登录用户,另一个创建要提供给 google 的项目数组,此时它只是使用新值刷新同一页面,因为它在循环中循环或数组。

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

      将变量公开可确保浏览器窗口不会在会话结束时关闭,或者如果您希望它关闭,您可以在第一个子程序中声明它们。至于凭据,您可以对它们进行硬编码或从电子表格中提供它们,但这是技术性的。除此之外,这似乎是一个非常简单的例程,并且做得非常好。

      Selenium 库的语法显然比 VBA 更现代,而且我会说更强大一些

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-19
        • 1970-01-01
        • 2021-01-23
        • 1970-01-01
        相关资源
        最近更新 更多