2014-07-30 8 views
5

hinzu Ich muss mehrere (einige hundert) Zeilen in Google Tabellenkalkulation hinzufügen. Derzeit mache ich es in einer Schleife:Fügen Sie mehrere Zeilen in Google Tabellenkalkulation mit API

for row in rows 
    _api_client.InsertRow(row, _spreadsheet_key, _worksheet_id) 

die extrem langsam ist, weil Zeilen nacheinander hinzugefügt werden.

Gibt es eine Möglichkeit, dies zu beschleunigen?

+1

Die API hat eine "Batch-Update", ich habe es mit Java verwendet, aber nicht auf die Python-Version. – eddyparkinson

Antwort

6

Ok, habe ich endlich Batch-Anfrage verwendet. Die Idee besteht darin, mehrere Änderungen in einer API-Anfrage zu senden.

Zuerst habe ich eine Liste von Wörterbüchern erstellt, die wie rows_map[R][C] verwendet werden, um den Wert der Zelle in Zeile R und Spalte C zu erhalten.

rows_map = [ 
    { 
     1: row['first_column'] 
     2: row['second'] 
     3: row['and_last'] 
    } 
    for row i rows 
] 

Dann bekomme ich alle Zellen aus dem Arbeitsblatt

query = gdata.spreadsheet.service.CellQuery() 
query.return_empty = 'true' 

cells = _api_client.GetCellsFeed(self._key, wksht_id=self._raw_events_worksheet_id, query=query) 

und Batch-Anfrage erstellen, um mehrere Zellen zu einem Zeitpunkt zu ändern.

Dann kann ich die Tabelle ändern (oder in meinem Fall alle Werte neu schreiben).

for cell_entry in cells.entry: 
    row = int(cell_entry.cell.row) - 2 
    col = int(cell_entry.cell.col) 

    if 0 <= row < len(events_map): 
     cell_entry.cell.inputValue = rows_map[row][col] 
    else: 
     cell_entry.cell.inputValue = '' 

    batch_request.AddUpdate(cell_entry) 

Und nur eine Anfrage in alle Änderungen an:

_api_client.ExecuteBatch(batch_request, cells.GetBatchLink().href) 

NOTES:

Batch Anfrage sind nur mit Handy-Abfragen. Es gibt keinen solchen Mechanismus, der mit Listenabfragen verwendet werden kann.

query.return_empty = 'true' ist obligatorisch. Andernfalls gibt API nur Zellen zurück, die nicht leer sind.