8
4

4 回答 4

5

根据这个读/写方法的比较,使用高级服务来写比 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');
}
于 2020-11-27T08:22:46.413 回答
4

此问题已在 Issuetracker 中报告给 Google。为问题添加星号(左上角)以请求 Google 开发人员优先处理问题并进行修复。


同时,考虑使用高级 Google 服务,使用对电子表格进行大量操作。


问题似乎源于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();
  }
}
于 2020-11-27T07:50:09.210 回答
1

google v8 引擎似乎有问题。我最近遇到了同样的问题。禁用 v8 引擎后,它现在可以正常工作了。

转到工具-> 脚本编辑器。在脚本编辑器窗口中,单击运行,然后禁用 v8 引擎。见附件。 禁用 v8 引擎

于 2020-11-27T10:49:14.913 回答
-1

将十几条记录插入到 150k 行的工作表中时,我遇到了同样的问题。它会读取第一个文件,插入,然后在第二个或第三个文件上失败。我在这张表中有几个选项卡,做了一些非常复杂的嵌套查询和 arrayformula vlookups,并将工作表设置设置为每分钟更新一次并随时更新。
我的解决方案——解决了这个问题,是用复杂的查询复制我的原始工作表,并用 importRange 替换源数据选项卡(从原始数据表中提取数据)。然后,我从原始数据表中删除了所有其他选项卡。保持原始数据表与动态计算隔离。简短的回答:删除带有复杂查询、数组公式和 vlookup 的选项卡到另一张表。

于 2021-03-24T06:25:34.943 回答