传递范围不是字符串时,将范围对象作为单元格对象列表

时间:2018-02-09 19:04:58

标签: google-apps-script

我一直在努力创建一个函数,根据每个单元格的背景颜色计算工作表中的点数,只要此单元格中有一个值。

这就是我现有的工作:

function calculatePoints(range) {
  var cellArr = SpreadsheetApp.getActiveSheet().getRange(range);

  var total = 0;

  for(var i=1;i<=cellArr.getNumRows();i++) {
    for(var j=1;j<=cellArr.getNumColumns();j++) {
      if(  cellArr.getCell(i, j).getValue()!="" ) {
        switch( cellArr.getCell(i, j).getBackground() ) {
          case '#c9daf8':
            total+=1;
            break;
          case '#d9ead3':
            total+=2;
            break;
          case '#fff2cc':
            total+=3;
            break;
          case '#fce5cd':
            total+=4;
            break;
          case '#f4cccc':
            total+=5;
            break;
        }
      }
    }
  }

  return total.toFixed(0);
};

但是,这意味着我必须以字符串形式输入范围,这意味着拖动编队不会更新函数中传递的列,从而迫使我手动编写函数。

有没有办法保留此功能而不将范围作为字符串传递?

1 个答案:

答案 0 :(得分:0)

能够通过删除首次进入该功能时需要输入的所有参数并在每次编辑后再次启动该功能来修复它

function calculatePoints(cell) {
  var sheet = SpreadsheetApp.getActiveSheet();

  var givenCell = cell || sheet.getActiveCell();

  var cellArr = sheet.getRange(givenCell.getRow(), givenCell.getColumn(), sheet.getLastRow(), 1);

  var total = 0;

  for(var i=2;i<=cellArr.getNumRows();i++) {
    for(var j=1;j<=cellArr.getNumColumns();j++) {
      if(  cellArr.getCell(i, j).getValue()!="" ) {
        switch( cellArr.getCell(i, j).getBackground() ) {
          case '#c9daf8':
            total+=1;
            break;
          case '#d9ead3':
            total+=2;
            break;
          case '#fff2cc':
            total+=3;
            break;
          case '#fce5cd':
            total+=4;
            break;
          case '#f4cccc':
            total+=5;
            break;
        }
      }
    }
  }

  givenCell.setValue(total.toFixed(0));
};


function onChange(e) {

  var editRange = {
    top : 3,
    bottom : 9999999999,
    left : 2,
    right : 9999999999
  };
  var thisRow = e.range.getRow();
  var thisCol = e.range.getColumn();

  if (thisRow == 2 && thisCol != 1)
    calculatePoints();
  else if ((thisRow > editRange.top && thisRow < editRange.bottom) && (thisCol > editRange.left && thisCol < editRange.right))
    calculatePoints(e.range.offset((1-SpreadsheetApp.getActiveSheet().getActiveCell().getRow())+1, 0));

}