18

当我调用电子表格函数时,例如int(f2),该函数对单元格中的值进行操作。如果cell("F2")包含 3.14159,结果将是 3。但是当我调用不同类型的函数时——例如:row(f8)——函数获取单元格引用,而不是值,在这种情况下,返回 8。

如何让我的自定义函数与引用而不是值一起使用?

我可以传递一个字符串,然后使用getRange(),但是,如果我移动或更新工作表上的单元格,则字符串不会改变。

非常简单的例子:

function GetFormula(cellname) {
  return SpreadsheetApp.getActiveSheet().getRange(cellname).getFormula();
}

在我的工作表代码中,我可以像这样检索 C4 中的公式:=GetFormula("C4")

但是,这个参数是一个字符串,我宁愿传递一个单元格引用。一个更复杂的问题要求调用单元格在复制和粘贴时进行更新。

有任何想法吗?

4

3 回答 3

9

(来自我对 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;
}
于 2016-06-22T14:12:57.880 回答
2

几个月前我正在研究这个并想出了一个非常简单的组合:创建一个新工作表,其中每个单元格的名称作为其内容:单元格 A1 可能如下所示:

= arrayformula(cell("address",a1:z500))

编辑:以上不再有效。我的“Ref”新公式!A1 是

= ArrayFormula(char(64+column(A1:Z100))&row(A1:Z100))

将工作表命名为“Ref”。然后,当您需要将单元格的引用作为字符串而不是内容时,您可以使用:

= some_new_function('Ref'!C45)

当然,您需要检查函数是否传递了字符串(一个单元格)或一维或二维数组。如果你得到一个数组,它将所有单元格地址作为字符串,但从第一个单元格和宽度和高度,你可以找出你需要什么。

于 2016-06-11T13:52:54.850 回答
-2

当您将范围传递给自定义函数时,参数的类型为Range,然后您可以使用获取值等。

编辑:这是不正确的。

于 2012-09-05T16:56:28.167 回答