3

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

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

我试图保持连接活跃,仍然无法正常工作。

4

3 回答 3

1

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

"cell.value = 'O_o'" 实际上发出了对 API 的调用,在 50k 次调用后你会得到一个错误。最后省略 update_cells 命令。如果我是对的,您仍然会收到错误消息。

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

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

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

于 2014-06-19T10:03:04.247 回答
1

有点晚了,但我遇到了这个问题,我通过分块设置值来解决它,请参阅下面使用 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;
}
于 2016-06-17T08:02:24.357 回答
0

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

于 2015-10-28T13:09:23.290 回答