2015-07-03 49 views
0

我试图在Google Spreadsheet中建立一个自定义函数,基本上这样做: - 称自定义函数func()放在单元格D2中,并调用为= func(B2 ) - 提供了一个特定的单元格引用(比如说B2)作为起点,它将遍历B2之后的所有字段(如B3,B4,B5),而这些字段的值等于特定符号(比如管道|)。 - 对于此条件成功的每个迭代(即B3 =='|'),它可以将它放置的单元格向下累加/聚合值。所以如果单元格B3,B4,B5包含|然后B6不会返回D3 + D4 + D5的值。在Google Spreadsheet中对单元格进行迭代自定义函数

因此,例如,如果在该电子表格:

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

真的很遗憾在这两个,并会感谢任何意见。谢谢!

+0

应该围绕B2引号吗? '= func(“B2”)' –

回答

2

This works。我测试过它:

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; 
    } 
    } 
} 
+0

太棒了,非常感谢你!你知道我怎么能不是从startRange定义的单元格中获取cellValue,而是从公式本身放置的地方立即下来的单元格? –

+1

为了做到这一点,需要像返回它所在单元的单元格引用的函数那样。我在函数文档中没有看到类似的东西。如果有一个函数'= self()'并且它返回了它自己的单元格引用,那么你想要的将是可能的。但是,我没有在文档中看到任何可用的东西。 –

+0

谢谢桑迪! –