我正在尝试使用脚本迭代工作表中的列,将单元格值与其他单元格进行比较,并在它们相等时更改背景颜色。
我是JS和google脚本的新手,所以我遇到了for循环的问题,因为我总是得到一个“Cell reference out of range”错误。到目前为止,这是我的代码:
function onOpen()
{
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Exibicao");
var range = sheet.getDataRange();
var rows = range.getNumRows();
for(var i = 0; i <= rows; i++)
{
var cell = range.getCell(i, 13);
var option1 = cell.offset(0, -3);
var option2 = cell.offset(0, -2);
var option3 = cell.offset(0, -1);
if(option1.getValue() == cell.getValue()){
option1.setBackground("#b6d7a8");
}else if(option2.getValue() == cell.getValue()){
option2.setBackground("#b6d7a8");
}else if(option3.getValue() == cell.getValue()){
option3.setBackground("#b6d7a8");
}
}
}
答案 0 :(得分:1)
抛出哪一行错误?在每行之后记录单元格位置可以让您更好地了解它越界的位置。
var cell = range.getCell(i, 13);
Logger.log( cell.getA1Notation() );
var option1 = cell.offset(0, -3);
Logger.log( option1.getA1Notation() );
第二眼看,你觉得你需要这样的东西......
function onOpen()
{
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Exibicao");
var range = sheet.getDataRange();
var rows = range.getNumRows();
// Get values all at once
var values = range.getValues();
var row, len, bgs = [], rowBg = [];
for(row = 0, len = values.length; row < len; row++) {
var cell = values[row][12];
var option1 = values[row][9];
var option2 = values[row][10];
var option3 = values[row][11];
rowBg = ['white', 'white', 'white'];
if( option1 == cell ){
rowBg[0] = "#b6d7a8";
}else if( option2 == cell ){
rowBg[1] = "#b6d7a8";
}else if( option3 == cell ){
rowBg[2] = "#b6d7a8";
}
bgs.push(rowBg);
}
//Logger.log(bgs)
// Set background colors all at once, start at the top left
sheet.getRange(1, 10).offset(0, 0, bgs.length, bgs[0].length).setBackgrounds(bgs);
}
答案 1 :(得分:1)
我可能错了,但我敢打赌,问题出在你的循环声明中:
for(var i = 0; i <= rows; i++)
JavaScript数组是0-based,这意味着长度为2
的数组的第一个元素位于arrayName[0]
,其最后一个元素位于arrayName[length - 1]
。
您的循环以i = 0
开头,以i = range.getNumRows()
结尾。这意味着数组从first
元素开始,最后尝试再获取一行而不是数组。它以arrayName[length]
而不是arrayName[length - 1]
结尾。
试试这个:
for(var i = 0; i < rows; i++)
如果这不起作用,试试这个:
for(var i = 1; i <= rows; i++)
这两个元素都访问getNumRows()
元素,而不是getNumRows() + 1
元素。