当我调用电子表格函数时,例如int(f2)
,该函数对单元格中的值进行操作。如果cell("F2")
包含3.14159,则结果为3。
但是当我调用不同类型的函数时 - 例如:row(f8)
- 函数接受单元格引用,而不是值,在这种情况下,返回8。
如何让我的自定义函数使用引用而不是值?
我可以传递一个字符串,然后使用getRange()
,但是,如果我移动或更新工作表上的单元格,字符串就不会改变。
非常简单的例子:
function GetFormula(cellname) {
return SpreadsheetApp.getActiveSheet().getRange(cellname).getFormula();
}
在我的工作表代码中,我可以像这样检索C4中的公式:=GetFormula("C4")
但是,这个参数是一个字符串,我宁愿传递一个单元格引用。一个更复杂的问题需要在复制和粘贴时更新呼叫单元。
有什么想法吗?
答案 0 :(得分:5)
(来自我在Web Apps上的answer。)可以通过解析活动单元格中的公式来获取对传递范围的引用,该公式是包含公式的单元格。这假设自定义函数单独使用,而不是作为更复杂表达式的一部分使用:例如,=myfunction(A1:C3)
,而不是=sqrt(4+myfunction(A1:C3))
。
该方法还支持对其他工作表的引用,例如
=myfunction(Sheet2!A3:B5)
或=myfunction('Another Sheet'!B3:G7)
。
作为演示,此函数返回传递范围的第一列索引。这个位在函数的最后;其中大部分涉及范围提取。
function myfunction(reference) {
var sheet = SpreadsheetApp.getActiveSheet();
var formula = SpreadsheetApp.getActiveRange().getFormula();
var args = formula.match(/=\w+\((.*)\)/i)[1].split('!');
try {
if (args.length == 1) {
var range = sheet.getRange(args[0]);
}
else {
sheet = ss.getSheetByName(args[0].replace(/'/g, ''));
range = sheet.getRange(args[1]);
}
}
catch(e) {
throw new Error(args.join('!') + ' is not a valid range');
}
// everything so far was only range extraction
// the specific logic of the function begins here
var firstColumn = range.getColumn(); // or whatever you want to do with the range
return firstColumn;
}
答案 1 :(得分:1)
几个月前我正在研究这个问题并提出了一个非常简单的方法:创建一个新表格,其中每个单元格的名称为其内容: Cell A1看起来像:
= arrayformula(cell("address",a1:z500))
编辑:以上不再有效。我的新参考' Ref'!A1是
= ArrayFormula(char(64+column(A1:Z100))&row(A1:Z100))
为工作表命名"参考"。 然后,当您需要将单元格引用为字符串而不是内容时,请使用:
= some_new_function('Ref'!C45)
当然,您需要检查函数是否通过字符串(一个单元格)或一维或二维数组。如果你得到一个数组,它将所有的单元格地址都作为字符串,但从第一个单元格和宽度和高度,你可以找出你需要的。
答案 2 :(得分:-1)
将范围传递给自定义函数时,参数的类型为Range,然后您可以使用取值等等。
修改:这不正确。