Range.map不再适用于Google Apps for sheets脚本吗?

问题描述

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

如果找不到它们,或者即使确认它们不再起作用,我也找不到有关将其替换为什么的文档

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的信息:

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

解决方法

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

中进行解释

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

enter image description here

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

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

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

因此,在您的自定义函数中,如果DisplayNameEmail都是 not 数组,则不会超出第一个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) {