我一直使用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
我试图保持连接活着,仍然无效。
答案 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