16

Para exportar la hoja de cálculo única de CSS a CSV, es necesario pasar el índice de hoja de trabajo (GID) entero.¿Cómo convertir el id. De cadena de la hoja de cálculo de la hoja de cálculo de Google a un índice entero (GID)?

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

Pero, ¿dónde están esas informaciones? Con gdata.spreadsheets.client, podría encontrar una identificación de cadena para la hoja de trabajo como "oc6, ocv, odf".

client = gdata.spreadsheets.client.SpreadsheetsClient() 
feed = client.GetWorksheets(spreadsheet, auth_token=auth_token) 

Y regresa por debajo del átomo XML. (parte de ella)

<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> 

También probé con el parámetro de hoja pero falló con el error "Hoja no válida".

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

supongo que debería haber alguna función mágica, pero no pudo encontrarlo. ¿Cómo puedo convertirlos a ID entero? O ¿Puedo exportar la hoja de trabajo con una identificación de cadena?

EDITAR: Acabo de convertir la tabla con python. Sucio pero trabajando :-(

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 
} 
+1

Estoy tratando de hacer más o menos lo mismo. En mi caso, estoy generando hojas de cálculo programáticamente y necesito almacenar los enlaces a hojas de trabajo individuales en una base de datos separada. – Tom

+5

Muy bien, Google. Esto es una broma ¿verdad? Muy divertido. ¿Ahora podemos tener índices de hoja de trabajo correctos en lugar de estas cosas locas? ... –

+0

Si alguien se enfrenta a la misma pregunta, aquí hay una respuesta simple: https://code.google.com/p/gdata-python-client/ problemas/detalles? id = 698 # c6 – Rozkalns

Respuesta

25

encontré su pregunta buscando una solución al mismo problema, y ​​me sorprendió que los identificadores de hoja de cálculo en realidad corresponden 1: 1 de gids - Originalmente asumí que se asignaron de forma independiente, en vez . de ser un ejercicio de ofuscación

yo era capaz de encontrar una solución ligeramente más limpio por la fórmula que utilizan para generar identificadores de la hoja de trabajo desde su mesa de ingeniería inversa:

worksheetID = (gid xor 31578) encoded in base 36 

Así, algunos de Python para ir de un identificador de hoja de cálculo para gid:

def to_gid(worksheet_id): 
    return int(worksheet_id, 36)^31578 

Esto es todavía sucio, pero funcionará para GID superiores a 99 sin necesidad de tablas gigantes. Al menos mientras no cambien la lógica de generación (que probablemente no lo harán, ya que rompería los ID existentes que las personas ya usan).

+2

¿Nos puede guiar a través del proceso de averiguarlo? – letronje

+3

Noté que se repiten patrones. Los primeros cuatro valores terminan en 6,7,4,5 los siguientes cuatro: a (10), b (11), 8,9 - la misma progresión. Me di cuenta de que funcionaría así si sincronizara números consecutivos con algo que termina en '10' en formato binario. Así es como pensé que esas cuerdas eran realmente números. Contenían todas las letras, así que pensé que debía ser base-36. Encontrar el factor XOR fue simple a partir de ahí. –

+0

¿Alguien tiene una conversión para .NET? – maguy

5

No puedo agregar un comentario al post de Wasilewski porque al parecer me falta reputación así que aquí están las dos funciones de conversión en Javascript en base a la respuesta de Wasilewski:

// 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); 
} 
+0

Esto parece no funcionar más para las nuevas Hojas de cálculo de Google. – Mario

9

Este código funciona con los nuevos Hojas de cálculo.

// 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); 
} 
+0

Parece que funciona! Como obtuviste esto? –

+0

¡Esto funciona para mí! – laike9m

2

Ésta es una adaptación de Java de código de Buho que trabaja tanto con las nuevas Hojas de cálculo y con el legado de cálculo de Google.

// "od4" to 2 (legacy style) 
// "ogtw0h0" to 1017661118 (new style) 
public static int widToGid(String worksheetId) { 

    boolean idIsNewStyle = worksheetId.length() > 3; 

    // if the id is in the new style, first strip the first character before converting 
    worksheetId = idIsNewStyle ? worksheetId.substring(1) : worksheetId; 

    // determine the integer to use for bitwise XOR 
    int xorValue = idIsNewStyle ? 474 : 31578; 

    // convert to gid 
    return Integer.parseInt(worksheetId, 36)^xorValue; 

} 

// Convert 2 to "od4" (legacy style) 
// Convert 1017661118 to "ogtw0h0" (new style) 
public static String gidToWid(int gid) { 

    boolean idIsNewStyle = gid > 31578; 

    // determine the integer to use for bitwise XOR 
    int xorValue = idIsNewStyle ? 474 : 31578; 

    // convert to worksheet id, prepending 'o' if it is the new style. 
    return 
     idIsNewStyle ? 
     'o' + Integer.toString((worksheetIndex^xorValue), 36): 
     Integer.toString((worksheetIndex^xorValue), 36); 

} 
+0

impresionante, un par de años tarde noté que tu nuevo soporte de hojas. –

0

Ésta es una adaptación del código de Clojure Julie de Buho y de la que debería funcionar tanto con las nuevas Hojas de cálculo y con el legado de cálculo de Google.

(defn wid->gid [wid] 
    (let [new-wid? (> (.length wid) 3) 
     wid  (if new-wid? (.substring wid 1) wid) 
     xor-val (if new-wid? 474 31578)] 
    (bit-xor (Integer/parseInt wid 36) xor-val))) 

(defn gid->wid [gid] 
    (let [new-gid? (> gid 31578) 
     xor-val (if new-gid? 474 31578) 
     letter (if new-gid? "o" "")] 
    (str letter (Integer/toString (bit-xor gid xor-val) 36)))) 
0

Si está utilizando Python con gspread, esto es lo que hace:

wid = worksheet.id 
widval = wid[1:] if len(wid) > 3 else wid 
xorval = 474 if len(wid) > 3 else 31578 
gid = int(str(widval), 36)^xorval 

probablemente voy a abrir un PR para esto.

Cuestiones relacionadas