如何将Google电子表格的工作表字符串ID转换为整数索引(GID)?

Ray*_*Yun 17 gdata-api google-sheets gdata-python-client google-spreadsheet-api

要将Google电子表格的单个工作表导出为CSV,需要传递整数工作表索引(GID).

https://spreadsheets.google.com/feeds/download/spreadsheets/Export?key=%s&gid=%d&exportFormat=csv

但是,那些信息在哪里?使用gdata.spreadsheets.client,我可以找到工作表的一些字符串id,如"oc6,ocv,odf".

client = gdata.spreadsheets.client.SpreadsheetsClient()
feed = client.GetWorksheets(spreadsheet, auth_token=auth_token)
Run Code Online (Sandbox Code Playgroud)

它返回原子XML下面.(一部分)

<entry gd:etag="&quot;URJFCB1NQSt7ImBoXhU.&quot;">
    <id>https://spreadsheets.google.com/feeds/worksheets/0AvhN_YU3r5e9dGpTWGx3UVU3MTczaXJuNEFKQjMwN2c/ocw</id>
    <updated>2012-06-21T08:19:46.587Z</updated>
    <app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-21T08:19:46.587Z</app:edited>
    <category scheme="http://schemas.google.com/spreadsheets/2006" term="http://schemas.google.com/spreadsheets/2006#worksheet"/>
    <title>AchievementType</title>
    <content type="application/atom+xml;type=feed" src="https://spreadsheets.google.com/feeds/list/0AvhN_YU3r5e9dGpTWGx3UVU3MTczaXJuNEFKQjMwN2c/ocw/private/full"/>
    <link rel="http://schemas.google.com/spreadsheets/2006#cellsfeed" type="application/atom+xml" href="https://spreadsheets.google.com/feeds/cells/0AvhN_YU3r5e9dGpTWGx3UVU3MTczaXJuNEFKQjMwN2c/ocw/private/full"/>
    <link rel="http://schemas.google.com/visualization/2008#visualizationApi" type="application/atom+xml" href="https://spreadsheets.google.com/tq?key=0AvhN_YU3r5e9dGpTWGx3UVU3MTczaXJuNEFKQjMwN2c&amp;sheet=ocw"/>
    <link rel="self" type="application/atom+xml" href="https://spreadsheets.google.com/feeds/worksheets/0AvhN_YU3r5e9dGpTWGx3UVU3MTczaXJuNEFKQjMwN2c/private/full/ocw"/>
    <link rel="edit" type="application/atom+xml" href="https://spreadsheets.google.com/feeds/worksheets/0AvhN_YU3r5e9dGpTWGx3UVU3MTczaXJuNEFKQjMwN2c/private/full/ocw"/>
    <gs:rowCount>280</gs:rowCount>
    <gs:colCount>28</gs:colCount>
</entry>
Run Code Online (Sandbox Code Playgroud)

我也尝试使用sheet参数但是因"Invalid Sheet"错误而失败.

https://spreadsheets.google.com/feeds/download/spreadsheets/Export?key=%s&sheet=XXX&exportFormat=csv

我想应该有一些神奇的功能,但找不到它.我怎样才能将它们转换为整数id?或者我可以导出带有字符串ID的工作表吗?

编辑:我刚刚用python制作了转换表.很脏但工作:-(

GID_TABLE = {
    'od6': 0, 
    'od7': 1, 
    'od4': 2, 
    'od5': 3, 
    'oda': 4, 
    'odb': 5, 
    'od8': 6, 
    'od9': 7, 
    'ocy': 8, 
    'ocz': 9, 
    'ocw': 10, 
    'ocx': 11, 
    'od2': 12, 
    'od3': 13, 
    'od0': 14, 
    'od1': 15, 
    'ocq': 16, 
    'ocr': 17, 
    'oco': 18, 
    'ocp': 19, 
    'ocu': 20, 
    'ocv': 21, 
    'ocs': 22, 
    'oct': 23, 
    'oci': 24, 
    'ocj': 25, 
    'ocg': 26, 
    'och': 27, 
    'ocm': 28, 
    'ocn': 29, 
    'ock': 30, 
    'ocl': 31, 
    'oe2': 32, 
    'oe3': 33, 
    'oe0': 34, 
    'oe1': 35, 
    'oe6': 36, 
    'oe7': 37, 
    'oe4': 38, 
    'oe5': 39, 
    'odu': 40, 
    'odv': 41, 
    'ods': 42, 
    'odt': 43, 
    'ody': 44, 
    'odz': 45, 
    'odw': 46, 
    'odx': 47, 
    'odm': 48, 
    'odn': 49, 
    'odk': 50, 
    'odl': 51, 
    'odq': 52, 
    'odr': 53, 
    'odo': 54, 
    'odp': 55, 
    'ode': 56, 
    'odf': 57, 
    'odc': 58, 
    'odd': 59, 
    'odi': 60, 
    'odj': 61, 
    'odg': 62, 
    'odh': 63, 
    'obe': 64, 
    'obf': 65, 
    'obc': 66, 
    'obd': 67, 
    'obi': 68, 
    'obj': 69, 
    'obg': 70, 
    'obh': 71, 
    'ob6': 72, 
    'ob7': 73, 
    'ob4': 74, 
    'ob5': 75, 
    'oba': 76, 
    'obb': 77, 
    'ob8': 78, 
    'ob9': 79, 
    'oay': 80, 
    'oaz': 81, 
    'oaw': 82, 
    'oax': 83, 
    'ob2': 84, 
    'ob3': 85, 
    'ob0': 86, 
    'ob1': 87, 
    'oaq': 88, 
    'oar': 89, 
    'oao': 90, 
    'oap': 91, 
    'oau': 92, 
    'oav': 93, 
    'oas': 94, 
    'oat': 95, 
    'oca': 96, 
    'ocb': 97, 
    'oc8': 98, 
    'oc9': 99
}
Run Code Online (Sandbox Code Playgroud)

Jak*_*ski 25

我发现你的问题正在寻找同一问题的解决方案,并且惊讶于那些工作表ID实际上与1:1对应gids- 我最初认为它们是独立分配的,而不是混淆的练习.

我通过对他们用来从表中生成工作表ID的公式进行逆向工程,找到了一个稍微清晰的解决方案:

worksheetID = (gid xor 31578) encoded in base 36
Run Code Online (Sandbox Code Playgroud)

所以,一些Python从工作表ID转到gid:

def to_gid(worksheet_id):
    return int(worksheet_id, 36) ^ 31578
Run Code Online (Sandbox Code Playgroud)

这仍然很脏,但是对于高于99的GID而言不需要巨型表格.至少只要它们不改变生成逻辑(它们可能不会改变它们,因为它会破坏人们已经使用的现有ID).

  • 我注意到重复的模式.前四个值在接下来的四个中以6,7,4,5结束:a(10),b(11),8,9 - 相同的进展.我注意到如果你将连续数字与二进制中以"10"结尾的东西进行异或运算,它会像这样工作.这就是我认为这些字符串实际上是数字的方式.它们包含所有字母,因此我认为它必须是36字符.从那里找到XOR因子很简单. (3认同)
  • 这是我从未听说过的最卑鄙,最笨拙但没有根本的有序批判性行为.我的帽子对你来说是雅各布想出来的.因为对整件事情如此漠不关心. (3认同)
  • 你能指导我们完成这个过程吗? (2认同)

小智 9

此代码适用于新的Google表格.

// Conversion of Worksheet Ids to GIDs and vice versa
// od4 > 2
function wid_to_gid(wid) {
    var widval = wid.length > 3 ? wid.substring(1) : wid;
    var xorval = wid.length > 3 ? 474 : 31578;
    return parseInt(String(widval), 36) ^ xorval;
}
// 2 > od4
function gid_to_wid(gid) {
    var xorval = gid > 31578 ? 474 : 31578;
    var letter = gid > 31578 ? 'o' : '';
    return letter + parseInt((gid ^ xorval)).toString(36);
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*rio 5

我无法在Wasilewski的帖子中添加评论,因为显然我缺乏声誉所以这里是基于Wasilewski答案的Javascript中的两个转换函数:

// Conversion of Worksheet Ids to GIDs and vice versa
// od4 > 2
function wid_to_gid(wid) {
    return parseInt(String(wid),36)^31578
}
// 2> 0d4
function gid_to_wid(gid) {
    // (gid xor 31578) encoded in base 36
    return parseInt((gid^31578)).toString(36);
}
Run Code Online (Sandbox Code Playgroud)