迭代Google电子表格自定义函数中的单元格

时间:2015-07-03 19:56:04

标签: google-apps-script google-docs

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

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

enter image description here

在单元格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. 如何实际获取放置函数本身的列中下一个单元格的值?

  3. 对这两个人真的很失落,并希望得到任何建议。谢谢!

1 个答案:

答案 0 :(得分: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;
    }
  }
}
相关问题