是否可以在 Google Apps Script for Sheets 的 copyTo 命令中使用变量?

Is it possible to use a variable in the copyTo command in Google Apps Script for Sheets?

我有一个电子表格,它根据 Google 表格中的信息生成测试计划。我想做的是制作一个脚本来检查 B 列,如果 B[行号] 中有内容,则将单元格 I3 复制到 I[行号].

这是我正在处理的内容:

var testplan = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("TestPlan");

for (var j = 0; j < 200; j++) {  

var destination = testplan.getRange(3, 9);
var contentCheck = testplan.getRange("B2:B200").getValues();

if (contentCheck != '' && contentCheck != 0) {
  destination.copyTo(testplan.getRange(j, 9));
};

现在,如果我将 copyTo 设置为不是 j 的任何对象,例如 4,它就可以很好地复制到 I4。否则,我会得到错误 "The coordinates or dimensions of the range are invalid."

有没有办法在这里使用我没有看到的变量?还是我哪里出了问题?

几个问题:

  • 您打算将 I3 复制到 I[row],但 contentCheckB2 开始重叠。重叠是导致错误的原因,"The coordinates or dimensions of the range are invalid."
  • 您调用了源单元格 I3、"destination",这令人困惑。我们称它为 source。另外,你知道细胞坐标,为什么不使用它们呢?
  • 您已在循环中声明了该值...但它永远不会更改,因此请在循环之前执行一次。
  • 类似地,contentCheck 可以在循环之前加载一次。它会生成一个二维数组(在本例中,这是一个行数组,每行只有一列)。您需要使用行索引和列索引将其作为一个数组来寻址,否则首先将整个数组展平以创建一个字符串值以与 '' 进行比较,然后解析一个整数以与此处的“0”进行比较:

    if (contentCheck != '' && contentCheck != 0) {
    

    这里很不错,一旦我们索引到单个值,ala contentCheck[j][0]...可以将比较简化为 truthiness:

    的测试
    if (contentCheck[j][0]) {
    

    数组将从 0 开始,而电子表格行和列索引从 1 开始。您需要为此进行调整,特别是因为您的范围从 B2 开始,跳过一行。 (为了避免前面提到的重叠,假设它应该从 B4 开始——您需要整理出您的实际值。)

你应该得到这样的结果:

var testplan = SpreadsheetApp.getActiveSpreadsheet()
                             .getSheetByName("TestPlan");

var source = testplan.getRange("I3");
var contentCheck = testplan.getRange("B4:B200").getValues();

for (var j = 0; j < contentCheck.length; j++) {  

  if (contentCheck[j][0])) {
    // 0-based j plus 1 to be 1-based, plus starting row
    source.copyTo(testplan.getRange(j+1+4, 9));
  };
}