range.copyTo无法正常工作的Apps脚本

时间:2012-06-15 18:37:24

标签: google-apps-script

当我使用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()方法不会复制数据,也不会抛出错误消息。如果我使用相同的逻辑并使用{​​{1}}和.getValues(),则新行将自动添加到我的destSheet中。

如果需要,我希望.setValues()能够创建其他行。这是不正常的还是这个错误?

1 个答案:

答案 0 :(得分:3)

如果您在newRange语句中添加.setValue(''),您会看到错误消息 AND ,更多行会自动添加到目标表 AND 数据将被复制。 请注意,您不应该定义整个dest.range,只有左上角的单元格与the docs

中所述相关 像这样:

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

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

上提出一个问题

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

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

当然,如果需要多于一行,则需要像本例中那样重复:

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)
}