0

当我使用range.copyTo() 方法将范围从一个电子表格复制到另一个电子表格时,我通常会sheet.getLastRow()+1在我指定目标范围时使用。例子:

 var oldRange = sheet.getRange(1, 1, 1, sheet.getLastColumn());

 var newRange = destSheet.getRange(destSheet.getLastRow()+1, 1, 1, sheet.getLastColumn());

如果 destSheet 在底部没有任何附加或“空白”行,则该range.copyTo()方法不会复制数据并且不会引发错误消息。如果我使用相同的逻辑并使用.getValues()and .setValues(),新行将自动添加到我的 destSheet 中。

如果需要,我还期望range.copyTo()创建额外的行。这是作为例外还是这是一个错误?

4

1 回答 1

3

如果您将 .setValue('') 添加到 newRange 语句,您将看到一条错误消息,并且 更多行将自动添加到目标工作表中,并且数据将被复制。请注意,您不应该定义整个 dest.range,只有左上角的单元格是相关的,如文档中所述

像这样 :

  var newRange = sh.getRange(ss.getLastRow()+1, 1).setValue('');
  oldRange.copyTo(newRange)

无论如何,这并不是最好的解决方法,因为错误消息(我们很抱歉。服务器遇到错误。请按“确定”刷新工作表。)。我想人们可以合理地认为这是一个错误,你可以在这里提出一个问题

编辑:实际上有一个很好的解决方法,我没有立即想到:你可以insertRowAfter(ss.getLastRow())在 copyTo() 之前使用,一切正常。例子 :

  var oldRange = sh.getRange(1, 1, 1, ss.getLastColumn());
  var newRange = sh.getRange(ss.getLastRow()+1, 1);
  ss.insertRowAfter(ss.getLastRow())
  oldRange.copyTo(newRange)

当然,如果需要多于 1 行,请根据需要重复,如本例所示:

function copyToTest() {
  var oldRange = sh.getRange(1, 1, 5, ss.getLastColumn());// 5 rows in this example
  var newRange = sh.getRange(ss.getLastRow()+1, 1);
  for(n=0;n<oldRange.getLastRow();++n){ss.insertRowAfter(ss.getLastRow())}
  oldRange.copyTo(newRange)
}
于 2012-06-15T19:25:39.777 回答