批量更新细胞,50k限制?

时间:2014-06-13 02:40:44

标签: python google-sheets gspread

我一直使用gspread没问题。我最近在更新到Google表格时检查了50000个单元格。我得到了一个

File "build\bdist.win32\egg\gspread\httpsession.py", line 81, in request raise HTTPError(response) HTTPError

更新连接超时需要这么长时间吗?

我要更新的小区范围是A1:CL560。我将输出切片到50000单元格下,代码工作正常。

我正在使用的代码就是github上引用的代码:

cell_list = worksheet.range('A1:C7')

for cell in cell_list:
    cell.value = 'O_o'

# Update in batch
worksheet.update_cells(cell_list)

50000单元格下,一切似乎都很好。不知道该怎么做。

这是错误:error: [Errno 10054] An existing connection was forcibly closed by the remote host

我试图保持连接活着,仍然无效。

3 个答案:

答案 0 :(得分:1)

我使用GScript而不是Python,但我希望我仍然可以提供帮助:

" cell.value =' O_o'"实际上发出了对API的调用,并且在50k调用之后会出现错误。最后省略update_cells命令。如果我是对的,你仍会得到错误。

有几种方法可以避免这种情况: 该范围内置了setValue(Object)函数,因此该行应该可以满足您的所有需求:

worksheet.range('A1:C7').setValue('O_o');

或者,如果每个字段需要不同的值,则可以先构建具有相同大小的2D数组,然后将其传递给setValues(而不是setValue!)函数。

答案 1 :(得分:1)

有点晚了,但我遇到了这个问题,我通过在块中进行setvalues来解决它,请参阅下面的使用GoogleScript的解决方案。这有点令人费解,但是当我走的时候我正在弄清楚它:)

 function importtxt(url) {   
  var parameters = {method : "get", payload : "", muteHttpExceptions: true, validateHttpsCertificates: false};
  var result = UrlFetchApp.fetch(url, parameters);
  var responseCode = result.getResponseCode();

  var contents = result.getContentText().toString().replace("^[^<]*", "");
  var line = contents.split("\n");

  var j = 0;
  var start = 1;
  var chunk = new Array();
  var chunksize = 5000;
  var rows = contents.length;

  var ImportData = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("ImportData");
  var range = ImportData.getRange("B2:B").clearContent();

  for (var i = 0; i < rows; i++) {
    if ( line[i]) {
      chunk.push([line[i]]);
      j++;
      if ( j > chunksize || i == contents.length ) {
        j += start - 1;
        var end = j;
        Logger.log("writing chunk to " + start + " : " + j + " : " + chunk.length);
        // write chunk to sheet, i will denote the start
        var range = ImportData.getRange("A" + start + ":A" + j);
        range.setValues(chunk);
        // set variables for next run
        start = end + 1;
        var chunk = new Array();
        j = 0;
      }
    }
  }
  Logger.log("finished - last row was " + end + " but last row should have been " + contents.length);
  if ( j < i ) {
    j += start - 1;
    var end = j;
    Logger.log("writing end chunk to " + start + " : " + j + " : " + chunk.length);
    // write chunk to sheet, i will denote the start
    var range = ImportData.getRange("A" + start + ":A" + j);
    range.setValues(chunk);
  }
  return;
}

答案 2 :(得分:0)

Google电子表格具有复杂性限制。每次更新单元格时,都会重新计算引用它的任何单元格。如果公式变得太复杂或计算时间太长,电子表格将在计算期间超时。 为了阅读超过50000,您可以降低电子表格的复杂性。敬请期待 here