注意:这样做的目的只是尝试了解 forEach 函数的工作原理,以便我可以尝试将其应用到其他地方。
我正在尝试学习如何在应用程序脚本上使用 forEach 函数,但当我尝试使用它时它不起作用。 我想循环遍历 A 列的前 15 个单元格并将背景设置为红色。
我尝试过这个,但是当我运行它时,它显示“单元格超出范围”
function onOpen() {
var range = SpreadsheetApp.getActive().getRange("A1:A15");
var values = range.getValues();
values.forEach(function(row) {
range.getCell(row,1).setBackground('red');
});
}
首先,对于您手头的问题,根本不需要
forEach
。谷歌会为你做到这一点。您可以在范围内使用 setBackground()
来设置所有单元格的背景。
你的程序就这么简单:
function onOpen() {
const range = SpreadsheetApp.getActive().getRange("A1:A15");
range.setBackground("red");
}
请注意:保持变量不可变和本地变量是一个很好的做法(请参阅范围),因此您应该使用
const
而不是var
。
forEach()
,您必须记住,范围或范围的值是二维的,因此如果您想迭代所有单元格,则需要两个 forEach()
循环。
这里有一个关于如何做到这一点的示例:
function onOpen() {
const range = SpreadsheetApp.getActive().getRange("A1:A15");
const values = range.getValues();
values.forEach((row, rowIndex) =>
row.forEach((cell, columnIndex ) => Logger.log(`Content of cell ${rowIndex}/${columnIndex} is '${cell}'`)));
}
重要提示:即使您的范围只有一列,
函数仍然会返回一个二维数组!getRange()
forEach回调函数的参数分别是element、index、array。在您的脚本中,元素(单元格值)用作行号。我认为这就是您当前问题的原因。
如果要用索引作为行号,则需要加1。因为行号的起始位置是1,请注意这一点。
当这些点反映在你的脚本中时,就会变成如下所示。
values.forEach(function(row) {
range.getCell(row,1).setBackground('red');
});
values.forEach(function (element,row) {
range.getCell(row + 1, 1).setBackground('red');
});
如果您想设置单元格“A1:A15”的背景颜色,我认为以下脚本可能有用。但是,从你的问题来看,我认为你这个问题的目标可能是了解
forEach
。所以,我提出了上述修改。
SpreadsheetApp.getActive().getRange("A1:A15").setBackground('red');