2014-07-30 21 views
5

Tôi cần phải thêm nhiều hàng (vài trăm) vào bảng tính google. Hiện tại tôi đang thực hiện nó trong một vòng lặp:Thêm nhiều hàng vào bảng tính google bằng API

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

cực kỳ chậm, bởi vì các hàng được thêm từng cái một.

Có cách nào để tăng tốc độ này không?

+1

API có "cập nhật hàng loạt", tôi đã sử dụng nó với Java, nhưng không nhìn vào phiên bản python. – eddyparkinson

Trả lời

6

Ok, cuối cùng tôi đã sử dụng yêu cầu hàng loạt. Ý tưởng là gửi nhiều thay đổi trong một yêu cầu API.

Thứ nhất, tôi đã tạo danh sách từ điển, sẽ được sử dụng như rows_map[R][C] để lấy giá trị của ô tại hàng R và cột C.

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

Sau đó, tôi nhận được tất cả các tế bào từ các bảng

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

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

Và tạo yêu cầu hàng loạt thay đổi nhiều ô cùng một lúc.

batch_request = gdata.spreadsheet.SpreadsheetsCellsFeed() 

Sau đó tôi có thể sửa đổi (hoặc trong trường hợp của tôi viết lại tất cả các giá trị) bảng tính.

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) 

Và gửi tất cả những thay đổi trong chỉ có một yêu cầu:

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

GHI CHÚ:

yêu cầu hàng loạt có thể xảy ra chỉ với Queries di động. Không có cơ chế như vậy được sử dụng với các truy vấn danh sách.

query.return_empty = 'true' là bắt buộc. Nếu không, API sẽ chỉ trả lại các ô không trống.

Các vấn đề liên quan