是否可以在 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]
,但 contentCheck
从 B2
开始重叠。重叠是导致错误的原因,"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));
};
}
我有一个电子表格,它根据 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]
,但contentCheck
从B2
开始重叠。重叠是导致错误的原因,"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));
};
}