【问题标题】:Passing cell references to spreadsheet functions将单元格引用传递给电子表格函数
【发布时间】:2012-08-30 22:20:55
【问题描述】:

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

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

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

非常简单的例子:

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

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

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

有什么想法吗?

【问题讨论】:

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


【解决方案1】:

(来自我在网络应用程序上的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;
}

【讨论】:

    【解决方案2】:

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

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

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

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

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

    = some_new_function('Ref'!C45)
    

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

    【讨论】:

    • 您可以将 cell("address",a1:z500) 传递给自定义函数,然后该函数可以检索 cell 对象读取字符串参数作为单元格地址,不需要额外的表格
    • 我在 OP 中注意到了这一点。当单元格移动时,字符串不会更新。
    • 不确定你的意思。我刚刚实现了一个我这样调用的函数:MyFunc(CELL("address",D17)),当我移动目标单元格时它可以工作......
    • 当我在多单元格数组上使用您的解决方案时,我只得到左上角单元格的地址,这就是为什么我更新了我的答案以包含实际的工作公式。
    【解决方案3】:

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

    编辑:这不正确。

    【讨论】:

    • 如果我从另一个函数调用该函数,那是真的。但是,如果我在电子表格中使用该函数,则 arg 会自动取消引用到单元格的内容中。如果您能给我一个调用自定义函数并可以将该函数传递给 Range 的电子表格公式示例,我将不胜感激。
    • 抱歉,我误解了范围是如何通过的。你是对的,只有值被传递。
    猜你喜欢
    • 2014-01-16
    • 2019-06-13
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多