【问题标题】:Passing arguments / parameters from a Google sheets custom function to the script function将参数/参数从 Google 表格自定义函数传递到脚本函数
【发布时间】:2016-01-26 18:39:50
【问题描述】:

我被困在一个基本的东西上。如何将参数传递给 Google 表格自定义函数。

我在 Apps 脚本代码编辑器中有一个函数定义为:

function usageByMonth(range,theDate) {
    // do something with the arguments passed
}

在我的 Google 表格中,该函数用作

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

在尝试调试函数时,我发现这两个参数是“未定义的”。我查看了很多帖子,甚至直接从示例中复制了函数,结果相同。

【问题讨论】:

  • 您能否描述一下您是如何确定参数未定义的?
  • 问题可能出在您的 theDate 参数上。删除该参数,并仅使用 range 参数。然后做一些非常简单的事情,比如获取一个超出范围的值,然后返回它。
  • 我在尝试调试函数时通过查看项目确定参数未定义。它们显示为“未定义”。下面的答案描述了原因 - 在编辑器中渲染调试脚本对于这种相当常见的开发场景、确定输入参数以及能够单步执行从工作表传递参数的函数几乎无用。

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


【解决方案1】:

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

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

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

从一个有效的简单自定义函数开始,并以此为基础。

如果你想在自定义函数的代码中传递一个范围,你必须了解什么是二维数组:

二维数组:

[  [inner Array One],  [inner Array Two], [etc]  ]

一个范围内的数据被放入一个二维数组中。有一个外部数组,内部数组。内部数组的元素数与范围内的列数一样多。

[  ['single value from first column', 'single value second column']  ]

上面的二维数组只有1行两列。

所以要创建一个简单的自定义函数作为测试,创建一个函数:

function myCustomFunction(argOne) { 
  return argOne[0][0];
};

如果范围是A1:B5,自定义函数会返回A1中的值;

=myCustomFunction(A1:B5)

确定您的参数是否已传递到 .gs 服务器函数的唯一方法是您是否获得了返回结果。

有些输入是您不能使用的。如果您使用不允许的输入,那么(引用文档):

如果自定义函数尝试基于这些 volatile 内置函数之一返回值,它将无限期地显示 Loading...。

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

【讨论】:

  • 有趣...不是我希望的答案,但这可以解释事情。但是,在这种常见情况下,调试并不是很有帮助
【解决方案2】:

函数参数分隔符取决于电子表格区域设置。如果电子表格语言环境使用逗号作为小数分隔符,则参数分隔符为分号:

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

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

【讨论】:

  • 不需要分号。 Google 表格同时使用分号和逗号作为参数分隔符。
  • 您是否有证明这一点的参考资料,或者这只是一个假设?逗号对我和原始海报都不起作用,可能是因为我们的语言环境设置 - 至少在 Excel 中,分隔符取决于语言环境,而 Google 模仿 Excel 语法。
  • 确实是依赖于语言环境,但例如在en-us 中,参数{A1;B1} 是一个2 行1 列的范围引用数组,而{A1, B1} 是一个1 行2 列范围引用数组。
  • 看看更新的答案-。你觉得好看吗?如果电子表格语言环境使用逗号作为小数分隔符,则参数分隔符为分号,否则无法将小数传递给函数。非常感谢您顺便提出这个问题:)!
  • OP 的问题与这个答案 IMO 并没有真正的关系(他们只是使用编辑器进行测试,无法提供函数参数的值),但是您的编辑改变了我对您的答案的投票
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    请务必使用准确的大小写,因为标识符在 Google Script 中区分大小写。

    即。 theDate 与 thedate 或 TheDate 不同

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

    【讨论】:

    • 我看不出这是如何回答这个问题的。这应该是最好的评论!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 2011-07-05
    相关资源
    最近更新 更多