Google Spreadsheet上的单元格引用超出范围

时间:2014-04-07 22:55:57

标签: google-apps-script google-sheets

我正在尝试使用脚本迭代工作表中的列,将单元格值与其他单元格进行比较,并在它们相等时更改背景颜色。

我是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");
    }
  }
}

2 个答案:

答案 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元素。

祝你好运!