如何将命名范围作为单元格而不是范围传递给自定义函数?

How to pass named range to custom function as cell and not as range?

在 Google 表格“Apps 脚本”中,我定义了一个自定义函数,它接收格式和一些值,然后将值替换为格式的占位符和 return 它。

function PRINT_DETAILS(format, productName, quantity) {
    /* format expects a string with placeholders like: "{productName} {quantity}"
       product: expects a string
       quantity: expects an integer
    */
}

在产品“table”中有以下列:名称、数量、价格等。 每个都有自己的命名范围。

我定义了一个“打印”列,我在其中调用函数如下: = PRINT_DETAILS("{productName} {quantity}"; Products.Name; Products.Quantity)

问题是我的函数正在接收整个命名范围,而不仅仅是同一行的单元格值。 即我收到所有产品名称和所有产品数量...

我以多种方式成功地将命名范围用作单元格值:添加它们、在“IF”条件下、连接运算符“&”等。 即使在标准函数调用中。

这就是为什么我相信会有一种方法可以在自定义函数中做同样的事情。

我不想牺牲像 A1 之类的单元格引用的可读性。

所以我正在寻找一种方法来限制参数,或者以一种不太 hacky 的方式获得我想要的值。 另外,如果我们可以查看 Google 表格源代码,也许这些标准函数也在 JavaScript 中实现,并且他们已经解决了这个问题。

描述

Excel 有一个功能,可以将命名范围的值传递给与公式所在的行对应的自定义公式。不幸的是 Google Sheets 没有这个功能。相反,您需要获取公式的行号。

请注意,这假设命名范围从第 1 行开始,并且公式位于任何 sheet 中的同一行。

感谢 Mike Steelson,我对脚本进行了轻微修改以改进脚本。但不是屏幕截图。

=PRINT_DETAILS("{productName} {quantity}",Products.Name,Products.Quantity)

屏幕截图

脚本

function PRINT_DETAILS(format,productName,quantity) {
  try {
    var row = SpreadsheetApp.getActiveRange().getRow();
    return [productName[row-1],quantity[row-1]];
  }
  catch(err) {
    return err.message;
  }
}

参考