Google apps script 将参数/参数从自定义函数传递到脚本函数

Google apps script 将参数/参数从自定义函数传递到脚本函数,google-apps-script,google-sheets,arguments,custom-function,Google Apps Script,Google Sheets,Arguments,Custom Function,我被困在一个基本的问题上。如何将参数传递给Google Sheets自定义函数 我在应用程序脚本代码编辑器中有一个函数,定义为: function usageByMonth(range,theDate) { // do something with the arguments passed } 在我的Google工作表中,该函数用作 =usageByMonth('Source Meter Readings'!A5:A,B1) 在调试函数时,我发现这两个参数“未定义”。我看过很多文章,

我被困在一个基本的问题上。如何将参数传递给Google Sheets自定义函数

我在应用程序脚本代码编辑器中有一个函数,定义为:

function usageByMonth(range,theDate) {
    // do something with the arguments passed
}
在我的Google工作表中,该函数用作

=usageByMonth('Source Meter Readings'!A5:A,B1)

在调试函数时,我发现这两个参数“未定义”。我看过很多文章,甚至直接从示例中复制了函数,结果都是一样的。

从代码编辑器运行函数不会检索参数。在这种情况下,参数总是未定义的。对于使用
onEdit()
简单触发器等情况也是如此。获取传递给函数的参数的唯一方法是在电子表格单元格中输入有效的自定义函数

如果要从代码编辑器中测试自定义函数的代码,必须“硬编码”参数值

此外,在工作表中计算自定义函数时,
Logger.log()
不会将任何内容记录到日志中

从一个简单的自定义函数开始,并在此基础上进行构建

如果要将范围传递到自定义函数的代码中,则必须了解二维数组是什么:

二维阵列: 来自一个范围的数据被放入一个二维数组中。有一个外部数组和内部数组。内部数组的元素数与该范围内的列数相同

[  ['single value from first column', 'single value second column']  ]
上面的二维数组仅适用于一行两列

因此,要创建一个简单的自定义函数作为测试,请创建一个函数:

function myCustomFunction(argOne) { 
  return argOne[0][0];
};
如果范围为A1:B5,则自定义函数将返回A1中的值

=myCustomFunction(A1:B5)
要确定参数是否已传递到.gs服务器函数中,唯一的方法是返回结果

有些输入无法使用。如果使用了不允许的输入,则(引用文档):

如果自定义函数尝试返回基于这些易失性内置函数之一的值,它将显示加载。。。无限期


例如,您不能使用NOW()或RAND()作为参数。

请确保使用准确的大小写,因为标识符在Google脚本中区分大小写

即。 日期与日期或日期不同


对于那些不习惯区分大小写语言的人来说,这是一个常见的陷阱

函数参数分隔符取决于电子表格区域设置。如果电子表格区域设置使用逗号作为十进制分隔符,则参数分隔符为分号:

=usageByMonth('Source Meter Readings'!A5:A; B1)

否则将无法将小数传递到函数。

可能是
A5:A
范围,请尝试
A5:A1000
A:A
。将单元格地址
A5
与列地址
a
混合使用可能会混淆API。

您能描述一下如何确定参数未定义吗?问题可能是您的
日期
参数。删除该参数,只使用
范围
参数。然后做一些非常简单的事情,比如从范围中获取一个值并返回它。我在调试函数时通过查看这些项来确定参数是未定义的。它们显示为“未定义”。下面的答案描述了为什么-在编辑器中呈现调试脚本对于这个相当常见的开发场景来说几乎是无用的,确定输入参数并能够单步执行从工作表传递参数的函数。有趣的。。。这不是我希望得到的答案,但这可以解释一切。使调试在这个常见场景中没有那么大的帮助,尽管我不知道这是如何回答这个问题的。这应该是一个最好的评论!分号不是必需的。GoogleSheets同时使用分号和逗号作为参数分隔符。您是否有一个引用来证明这一点,或者这只是一个假设?逗号对我和原始海报都不起作用,可能是因为我们的区域设置-至少在Excel中,分隔符是区域设置相关的,Google模仿Excel语法。它确实是区域设置相关的,但例如在
en-us
中,
{A1;B1}
参数是一个2行1列的范围引用数组,
{A1,B1}
是范围引用的1行2列数组。请查看更新的答案-。你觉得这样好吗?如果电子表格区域设置使用逗号作为小数分隔符,则参数分隔符为分号,否则将无法将小数传递给函数。谢谢你顺便提一下:)!OP的问题实际上与IMO的答案无关(他们只是使用编辑器进行测试,无法提供函数参数的值),但您的编辑更改了我对您答案的投票
=usageByMonth('Source Meter Readings'!A5:A; B1)