范围宽度不正确 - Google Apps脚本

时间:2016-08-16 18:31:41

标签: google-apps-script

我需要将一个22列300行的范围复制到另一个相同大小的范围内,这个范围将添加到另一个现有工作表中。

当我尝试这样做时,我收到错误,“不正确的范围宽度,是22但应该是44”。我没有成功使范围匹配。

  var sourceRange = ss1.getRange(1, 1, 300, 22);
  var sourceValues = sourceRange.getValues();
  var archiveRange = ss3.getRange(1, ss3.getLastColumn()+1,300,ss3.getLastColumn()+22);
  archiveRange.setValues(sourceValues);

2 个答案:

答案 0 :(得分:1)

方法.getLastColumn()返回工作表当前具有的最后一列的整数。如果您的工作表有10列,.getLastColumn()将返回10。

您有一些潜在的选择要求。第一个,如下所示,如果您要在工作表的右端添加新范围。定义变量并以最基本的形式调用它们而不是在其他方法中定义它们也是明智的想法。这种做法可以减少错误并澄清您的代码。

var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sourceRange = ss1.getRange(1, 1, 300, 22);
var sourceValues = sourceRange.getValues();
var ss3 = spreadsheet.getSheetByName("ss3");
var lastColumn = ss3.getLastColumn();
var archiveRange = ss3.getRange(1, lastColumn + 1, 300, 22); //Start at first row, the next column after the last one, for 300 rows and 22 columns.
archiveRange.setValues(sourceValues);

上面的代码将在工作表的右侧添加22列和300行。无论您何时运行此工作表,您的工作表都将保留300行,但您的列将会进一步延伸。

或者,如果您希望使用相同的22列(延伸长度, NOT 宽度)在工作表底部附加300行,请使用以下代码:

var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sourceRange = ss1.getRange(1, 1, 300, 22);
var sourceValues = sourceRange.getValues();
var ss3 = spreadsheet.getSheetByName("ss3");
var lastColumn = ss3.getLastColumn();
var lastRow = ss3.getLastRow();
var archiveRange = ss3.getRange(lastRow + 1, 1, 300, 22); //Start at the next row after the last, the first column, for 300 rows and 22 columns.
archiveRange.setValues(sourceValues);

这会使你的宽度保持22行,并将你的长度延长300行。

如果您要完全覆盖以前的数据以便只存在1个存档,请使用:

var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sourceRange = ss1.getRange(1, 1, 300, 22);
var sourceValues = sourceRange.getValues();
var ss3 = spreadsheet.getSheetByName("ss3");
var archiveRange = ss3.getRange(1, 1, 300, 22);
archiveRange.setValues(sourceValues);

你可以猜到,这样可以保持300行,22列的范围。您的数据将被覆盖而不会增加长度或宽度。

您可能需要测试可能尚不存在的GAS .getRange()的有效性和准确性。如果您在添加行/列时看到错误,那么在之前使用类似于.insertColumnsAfter().insertRowsAfter() 的方法,将值写入新的范围。有关工作表方法的文档可以找到here

答案 1 :(得分:0)

您使用的公式是.getRange(row, column, numRows, numColumns) 所以你不必写:

var archiveRange = ss3.getRange(1, ss3.getLastColumn()+1,300,ss3.getLastColumn()+22);
  archiveRange.setValues(sourceValues);

但是:

var archiveRange = ss3.getRange(1, ss3.getLastColumn()+1,300,22);
  archiveRange.setValues(sourceValues);