18

Google スプレッドシートの単一のワークシートを CSV にエクスポートするには、整数のワークシート インデックス (GID) を渡す必要があります。

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

しかし、それらの情報はどこにありますか? gdata.spreadsheets.client を使用すると、「oc6、ocv、odf」などのワークシートの文字列 ID を見つけることができました。

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

そして、以下のアトム 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>

また、シートパラメータを試してみましたが、「無効なシート」エラーで失敗しました。

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

6 に答える 6

26

同じ問題の解決策を探しているあなたの質問を見つけましたが、それらのワークシート ID が実際に 1:1 で対応していることに驚きました。gids最初は、難読化ではなく、個別に割り当てられていると想定していました。

テーブルからワークシート ID を生成するために使用する数式をリバース エンジニアリングすることで、少しクリーンなソリューションを見つけることができました。

worksheetID = (gid xor 31578) encoded in base 36

したがって、ワークシート ID から に移動する Python の例gid:

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

これはまだ汚れていますが、巨大なテーブルを必要とせずに 99 を超える GID に対して機能します。少なくとも、生成ロジックを変更しない限り (人々が既に使用している既存の ID を壊してしまうため、変更しない可能性があります)。

于 2013-06-24T17:04:28.480 に答える
5

明らかに評判が悪いため、Wasilewski の投稿にコメントを追加することはできません。ここでは、Wasilewski の回答に基づいた Javascript の 2 つの変換関数を示します。

// 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);
}
于 2013-09-12T08:38:43.193 に答える
2

これは、新しい Google スプレッドシートと従来の Google スプレッドシートの両方で動作する、Buho のコードの Java 適応です。

// "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);

}
于 2014-11-12T18:03:11.173 に答える
0

これは、Buho と Julie のコードを Clojure に適応させたもので、新しい Google スプレッドシートと従来の 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))))
于 2015-10-01T17:48:23.207 に答える