【问题标题】:Range.map no longer working in Google Apps Script for Sheets?Range.map 不再在 Google Apps Script for Sheets 中工作?
【发布时间】:2020-10-31 17:13:38
【问题描述】:

我在 Google 表格中有一个自定义函数,它使用 Range.map 来检查参数是多单元格范围还是单个值(或单个单元格范围)。我在一年前写了它,并且有一段时间没有回到这个功能,但我今天注意到它不起作用。 rangeVariable.map 返回 undefined,rangeVariable.length 也是如此。

如果它们不再工作,或者即使它们被确认不再工作,我找不到关于用什么替换它们的文档

function FormattedEmail(DisplayName, Email, Separator) {
  var sep = Separator == null ? ',' : Separator;
  if (DisplayName.map && Email.map) {     //Both DisplayName and Email are ranges
    if (DisplayName.length != Email.length) {  //DisplayName and Email ranges must match

已更新以包含来自 TheMaster 的信息:

作为参数传递给自定义函数的范围应该作为数组传递,因此任何数组方法都应该有效,包括 .map。然而,变量似乎不是一个数组,而是一个对象。 https://developers.google.com/apps-script/guides/sheets/functions#arguments

【问题讨论】:

  • range 类上没有 .map 函数。从来没有。
  • 检查console.log(typeof value),如果value 是一个范围对象,它将返回range。您能确认您使用的是哪个环境吗?犀牛还是v8?可能是 Rhino 有一些奇怪的声明。
  • 在自定义函数中,范围永远不会被传递。只有范围的值作为数组传递。
  • 无论如何,结束这个讨论。始终建议在任何编程语言中使用官方文档和最佳实践。现在我们试图证明你所说的从未存在过。但相反,您应该寻找一个确实存在的解决方案。
  • 你应该edit你的问题来显示函数是如何被调用的。

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


【解决方案1】:

自定义函数实际上并不需要Range。最好在arguments documentation中解释

如果您调用函数时引用一个单元格区域作为参数(如 =DOUBLE(A1:B10)),则参数将是单元格值的二维数组。例如,在下面的屏幕截图中,=DOUBLE(A1:B2) 中的参数被 Apps 脚本解释为 double([[1,3],[2,4]])。请注意,上面的 DOUBLE 示例代码需要修改以接受数组作为输入。

不太明显的是,传入单个单元格引用不会被解释为数组,而是单个值。试试这个:

// =isArray(B4) == false
// =isArray(B4:B5) == true

function isArray(arg) {
  if (arg.map) {
    return true;
  }
  return false;
}

因此,在您的自定义函数中,如果 DisplayNameEmailnot 数组,您将无法通过第一个 if 语句。这可能是该功能对您不起作用的原因:您的一个或多个输入无效。你应该能够在你的函数中解决这个问题。

我假设通过调用DisplayName.map,您实际上是在尝试检查DisplayName 是否是一个数组。这是有效的,因为在没有该方法的对象(如字符串)上调用map,将返回undefined。但最好更明确地使用Array.isArray()

function FormattedEmail(DisplayName, Email, Separator) {
  var sep = Separator == null ? ',' : Separator;
  if (Array.isArray(DisplayName) && Array.isArray(Email)) {
    if (DisplayName.length != Email.length) {

【讨论】:

  • 我不认为它“不那么明显”,文档中的先前声明正是这样说的:If you call your function with a reference to a single cell as an argument (like =DOUBLE(A1)), the argument will be the value of the cell.
  • @TheMaster 我试图强调它不是一个数组,但你是对的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多