4 回答
根据这个读/写方法的比较,使用高级服务来写比 setValues() 更快。
使用原始代码段的以下修改版本适用于您的示例电子表格:
function myFunction() {
var row1 = 1;
var col1 = 1;
var row2 = 1300;
var col2 = 140;
Logger.log({numrows:row2, numcols:col2} );
var rng = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1").getRange(row1,col1,row2,col2);
var values_to_set = rng.getValues();
var rng2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2").getRange(row1,col1,row2,col2);
//rng2.setValues(values_to_set);
// Based on https://developers.google.com/apps-script/advanced/sheets
var request = {
'valueInputOption': 'USER_ENTERED',
'data': [
{
'range': 'Sheet2!' + rng2.getA1Notation(),
'majorDimension': 'ROWS',
'values': values_to_set
}
]
};
Sheets.Spreadsheets.Values.batchUpdate(request, SpreadsheetApp.getActiveSpreadsheet().getId());
Logger.log('done');
}
此问题已在 Issuetracker 中报告给 Google。为问题添加星号(左上角)以请求 Google 开发人员优先处理问题并进行修复。
同时,考虑使用高级 Google 服务,使用google-sheets-api对电子表格进行大量操作。
问题似乎源于set*
方法。在您的特定情况下,另一种选择是使用range.copyTo
(而不是getValues()
and setValues()
),它可以正常工作(最多测试 15 次)
/**@OnlyCurrentDoc*/
function myFunction() {
var row1 = 1;
var col1 = 1;
var row2 = 1300;
var col2 = 140;
console.log({numrows:row2, numcols:col2} );
var rng = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1").getRange(row1,col1,row2,col2);
/*var values_to_set = rng.getValues();*/
var rng2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2").getRange(row1,col1,row2,col2);
/*rng2.setValues(values_to_set);*/
/*Added*/rng.copyTo(rng2, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false)
console.log('done');
}
function test_myFunction(i=15){
while(i--){
myFunction();
}
}
google v8 引擎似乎有问题。我最近遇到了同样的问题。禁用 v8 引擎后,它现在可以正常工作了。
转到工具-> 脚本编辑器。在脚本编辑器窗口中,单击运行,然后禁用 v8 引擎。见附件。
将十几条记录插入到 150k 行的工作表中时,我遇到了同样的问题。它会读取第一个文件,插入,然后在第二个或第三个文件上失败。我在这张表中有几个选项卡,做了一些非常复杂的嵌套查询和 arrayformula vlookups,并将工作表设置设置为每分钟更新一次并随时更新。
我的解决方案——解决了这个问题,是用复杂的查询复制我的原始工作表,并用 importRange 替换源数据选项卡(从原始数据表中提取数据)。然后,我从原始数据表中删除了所有其他选项卡。保持原始数据表与动态计算隔离。简短的回答:删除带有复杂查询、数组公式和 vlookup 的选项卡到另一张表。