将单元格引用传递给电子表格函数

时间:2012-08-30 22:20:56

标签: google-apps-script google-sheets spreadsheet formulas custom-function

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

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

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

非常简单的例子:

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

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

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

有什么想法吗?

3 个答案:

答案 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,然后您可以使用取值等等。

修改:这不正确。