Har*_*ale 11 google-sheets google-apps-script custom-function
当我调用电子表格函数时int(f2),该函数对单元格中的值进行操作.如果cell("F2")包含3.14159,则结果为3.但是当我调用不同类型的函数时 - 例如:row(f8)- 函数采用单元格引用,而不是值,在这种情况下,返回8.
如何让我的自定义函数使用引用而不是值?
我可以传递一个字符串,并使用getRange(),但是,如果我移动或更新工作表上的单元格,字符串将不会更改.
非常简单的例子:
function GetFormula(cellname) {
return SpreadsheetApp.getActiveSheet().getRange(cellname).getFormula();
}
Run Code Online (Sandbox Code Playgroud)
在我的工作表代码中,我可以像这样检索C4中的公式: =GetFormula("C4")
但是,这个参数是一个字符串,我宁愿传递一个单元格引用.一个更复杂的问题需要在复制和粘贴时更新呼叫单元.
有任何想法吗?
小智 6
(从我对Web Apps的回答中获得。)通过解析活动单元格(包含该公式的单元格)中的公式,可以获取对传递范围的引用。这假设自定义函数是单独使用的,而不是作为更复杂的表达式的一部分使用的:例如=myfunction(A1:C3),not =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;
}
Run Code Online (Sandbox Code Playgroud)
几个月前我正在研究这个问题,并想出了一个非常简单的组合:创建一个新工作表,其中每个单元格的名称作为其内容:单元格 A1 可能如下所示:
= arrayformula(cell("address",a1:z500))
Run Code Online (Sandbox Code Playgroud)
编辑:以上不再有效。我的“Ref”!A1 的新公式是
= ArrayFormula(char(64+column(A1:Z100))&row(A1:Z100))
Run Code Online (Sandbox Code Playgroud)
将工作表命名为“Ref”。然后,当您需要以字符串而不是内容的形式引用单元格时,可以使用:
= some_new_function('Ref'!C45)
Run Code Online (Sandbox Code Playgroud)
当然,您需要检查函数是否传递了字符串(一个单元格)或一维或二维数组。如果你得到一个数组,它会将所有单元格地址作为字符串,但从第一个单元格以及宽度和高度,你可以找出你需要的。
| 归档时间: |
|
| 查看次数: |
11360 次 |
| 最近记录: |