遍历 Google 电子表格自定义函数中的单元格

Iterating over cells in Google Spreadsheet Custom Function

我正在尝试在 Google 电子表格中构建一个自定义函数,基本上可以这样做: - 假设名为 func() 的自定义函数放置在单元格 D2 中并调用为 =func(B2) - 提供一个特定的单元格引用(比如 B2)作为起点,它会遍历 B2 之后的所有字段(所以 B3、B4、B5),而这些字段的值等于一个特定的符号(比如管道 |) . - 对于此条件成功的每次迭代(即 B3 == '|'),它可以从其放置的单元格中添加 up/aggregate 值,向下列。因此,如果单元格 B3、B4、B5 包含 |然后 B6 不会 return D3+D4+D5 的值。

例如,如果在此电子表格中:

在单元格 B10 中,函数应产生值 8 (1+3+4),在单元格 B15 中,函数应产生值 11 (5+6)。

我想到了这样的事情:

function sumByPipe(startRange) {
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getRange(startRange)
  var sum = 0;
  for (var row_num = 1; row_num < 128;  row_num ++) {

    var cell = range.getCell(row_num, 1);
    var cellValue = cell.getValue();

    if (cellValue == '|') {
      sum += 1;
    }

  }
  return sum;
}

确实卡在了两个地方:

  1. 函数似乎在调试器中工作,但是当我从电子表格调用它时,它在 getRange() 函数调用上失败,说不存在这样的范围。如果我用 getRange('A2') 的静态调用替换它,那部分工作但然后它在 getCell() 上失败说索引超出范围。

  2. 我如何实际获取函数本身所在列的下一个单元格的值?

对这两个真的很迷茫,希望得到任何建议。谢谢!

这行得通。我测试了它:

function sumByPipe(startRange) {

  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getRange(startRange)
  var sum = 0;

  var startColumn = range.getColumn();
  var startRow = range.getRow();

  for (var row_num = startRow; row_num < startRow+128;  row_num++) {

    var cellWithPipe = sheet.getRange(row_num, startColumn-1).getValue();
    var cellValue = sheet.getRange(row_num, startColumn).getValue();

    if (cellWithPipe === '|') {
      sum += cellValue;
    } else {
      //If pipe is no longer present, stop and return sum
      return sum;
    }
  }
}