【问题标题】:Google Sheets Custom Function for Arrays用于数组的 Google 表格自定义函数
【发布时间】:2021-09-19 07:59:30
【问题描述】:

我正在尝试在 Google 工作表中创建一个自定义函数,该函数在列范围内搜索特定值,如果是则返回 true。我已经测试了这个函数,它在脚本编辑器中运行时运行良好,但是当我尝试在 Google 表格中使用它时它不起作用。

当我定义数组参数时,函数运行良好,但当我尝试将 Google 表格中的范围作为数组传递时,函数总是返回 false。这是我第一次使用 Javascript/Google 表格函数进行编码,所以我知道我一定是做错了什么,但我无法弄清楚到底是什么问题。根据developer page,据我所知,传递一系列单元格应该会自动生成一个数组,所以我不确定我做错了什么。

所以,

=columnMatch(A2; "hello", "hi", "good morning") 将返回 true,但是

=columnMatch(A2; B2:B) 将始终返回 false。

(其中 A2 定义为“hi”,B 列包含我希望测试的值列表)

我的自定义函数代码如下:

**function columnMatch(submittedLocation, locationlist)** 
{
  
  for(var i = 0; i < locationlist.length; i++)
  {
     if(locationlist.includes(submittedLocation)) 
      return true; 
  }

  return false; 
} ```

【问题讨论】:

  • 如果您编写此脚本只是为了学习脚本,请继续。但是,如果您正在编写脚本是因为您需要执行该函数,那么已经有内置函数可以执行此操作,例如 =REGEXMATCH(A2, "hello|hi|good morning")
  • 您也可以使上述公式建议大小写不可知: =REGEXMATCH(LOWER(A2), "hello|hi|good morning") ... 或将其应用于整个范围,例如, =ArrayFormula(IF(A2:A="",,REGEXMATCH(LOWER(A2:A), "hello|hi|good morning"))) ... 或者您可以将匹配词列表放在一个范围内并使用以下版本: =ArrayFormula(IF(A2:A="",,REGEXMATCH(LOWER(A2:A), JOIN("|",TRIM(FILTER(B2:B,B2:B""))) )))
  • @ErikTyler - 我认为你的 cmets 应该是一个答案。
  • 我考虑过,andrewjames;但由于原始帖子专门询问脚本自定义函数,因此我的反馈在技术上并不构成答案。但是,如果 OP 表明这满足了需求,我将发布作为答案。谢谢。

标签: google-apps-script google-sheets


【解决方案1】:

您可以将其简化为单行函数:

function columnMatch(submittedLocation, locationlist) {
  return locationlist.flat().filter(String).includes(submittedLocation);
}

这是如何工作的:

submittedLocation 是单个值。

locationlist 是一个范围 - 一个二维值数组:

[ ["val1"], ["val2"], [...], ... ]

为了处理二维单词列表,我们首先将flatten 转换为一个简单的数组。

然后我们filter out 任何空值以避免一个非常大的数组,其中没有太多实际数据。我们只保留非空字符串。此步骤不是必需的,但建议执行。

最后,我们可以在数组中查看我们的搜索值是否为 included - 并返回该布尔测试的 true/false 结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多