如何在新的Google电子表格中将gid转换为od *(工作表ID)

时间:2014-05-12 12:56:10

标签: google-sheets google-spreadsheet-api gdata-api

我正在使用Gdata api更新Google电子表格单元格。 现在新的Google电子表格已经发布,看起来gid已超过8位数。

以下是新工作表的示例,sheet2的gid是1794189920。 https://docs.google.com/spreadsheets/d/1S6mvGGoOJa8JF6Qt6GGH5QT-X0HD4EjZhKNbihAwFuE/edit?usp=sharing

我尝试使用以下方法转换它们,但不起作用。

How to convert Google spreadsheet's worksheet string id to integer index (GID)?

感谢任何能够帮助阐明这一点或建议的人。

干杯。俊雅

2 个答案:

答案 0 :(得分:2)

好吧,这是一个贫民窟的答案,因为我对它一点都不满意,因为我真的不明白发生了什么,但也许它会帮助别人,所以这里就是......

我正在使用ruby google_drive gem,只是尝试将我的电子表格中的所有工作表下载为CSV。为了做到这一点,我必须从编码的GID(我看到它被称为'WID')转换为真正的GID。之前,我的wid_to_gid方法看起来像这样(从堆栈溢出的其他答案中记录):

def wid_to_gid(wid)
    wid.to_i(36) ^ 31578
end

为了处理7位数的WID,我将其更改为:

def wid_to_gid(wid)
    wid_val = wid.length > 3 ? wid[1..-1] : wid
    xorval = wid.length > 3 ? 474 : 31578
    wid_val.to_i(36) ^ xorval
end

所以..这里发生了一些事情......我意识到(至少在我的电子表格中),对于7位数的WID,我可以通过删除第一个字符来获得GID,转换为基数为36的数字,然后与474 XORing(不知道为什么这个神奇的数字..对不起)。

如果WID只有3位数,那么旧的转换就可以了(正如堆栈溢出的许多其他答案中详述的那样)。

对于我正在使用的电子表格,它有3个工作表。以下是每个的WID和GID:

GID - WID
0          - od6
2019719111 - oxehkwt
1506531046 - oowy6v0

我真的只是想完成这项工作,所以一旦我开始工作,我就不会花更多的时间来调查。如果其他人可以验证/拒绝这些代码是否正常工作,我将不胜感激......如果它不起作用,也许它至少会给你一些想法!

答案 1 :(得分:1)

通过查看WorksheetFeed类(来自.NET库Google.GData.Spreadsheets.WorksheetFeed),我发现了一种在新工作表上获取gid的方法。基本上设置电子表格服务,应用凭据,创建传递feedUrl的WorksheetQuery,调用服务上的查询并从workheetFeed.Entries返回工作表。然后你可以流式传输工作表的xml,然后从那里搜索xml以获得"?gid ="并解析结果。可能有一种更直接的方式来实现这一点,但我还没有找到它,这在我们的情况下有效。

  Dim worksheetFeed As WorksheetFeed
  Dim query As WorksheetQuery
  Dim worksheet As WorksheetEntry
  Dim output As New MemoryStream
  Dim xml As String
  Dim gid As String = String.Empty

  Try
    _service = New Spreadsheets.SpreadsheetsService("ServiceName")
    _service.setUserCredentials(UserId, Password)
    query = New WorksheetQuery(feedUrl)
    worksheetFeed = _service.Query(query)
    worksheet = worksheetFeed.Entries(0)

    ' Save worksheet feed to memory stream so we can 
    ' get the xml returned from the feed url and look for
    ' the gid.  Gid allows us to download the specific worksheet tab
    Using output
      worksheet.SaveToXml(output)
    End Using

    xml = Encoding.ASCII.GetString(output.ToArray())