【问题标题】:Cell reference out of range on Google SpreedsheetGoogle 电子表格上的单元格引用超出范围
【发布时间】:2014-04-08 10:13:00
【问题描述】:

我正在尝试编写一个脚本来遍历工作表中的列,将单元格值与另一个单元格进行比较,并在它们相等时更改背景颜色。

我是 JS 和 google 脚本的新手,所以我遇到了 for 循环的问题,因为我总是收到“单元格引用超出范围”错误。到目前为止,这是我的代码:

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

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案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);
    }
    

    【讨论】:

    • 嗯,在getCell() 的上下文中,参数是基于1 的,我认为这是出现错误的地方。所以也许应该使用for (var i = 1; i &lt;= rows; i++)。虽然(我相信 Bryan 会同意),但从更大的角度来看,在循环中执行所有这些操作并不是真正的正确方法。
    • 抱歉,错误出现在 var cell = range.getCell(i, 13); 但我按照 AdamL 的说法做了,将 for 更改为 i = 1 并且成功了,谢谢。至于循环内的gets,你有什么建议吗?
    • 是的,在建议中添加。看看有没有道理。正如亚当所逃避的那样,这种方式当然更有效率。您知道表格中新的内置条件格式现在可以做到这一点,对吧?
    • 我知道,但这是一张旧床单,所以我必须通过脚本来完成
    【解决方案2】:

    我可能是错的,但我敢打赌,问题出在你的循环声明中:

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

    祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 2018-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多