我正在使用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)?
感谢任何能够帮助阐明这一点或建议的人。
干杯。俊雅
答案 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())