0

我有一个包含一些数据的 Goggle 电子表格,我想编写一个自定义函数以在工作表中使用,它接受一系列单元格和一个分隔符,获取每个单元格值,将其按分隔符拆分,并计算总数。

For example
Column A has the following values in rows 1-3: {"Sheep","Sheep,Dog","Cat"}
My function would be called like this: =CountDelimitedValues(A1:A3;",");
It should return the value: 4 (1+2+1)

我遇到的问题是在我的自定义脚本中出现错误,例如

“TypeError:无法从绵羊类型获取函数 GetValues”

这是我当前的脚本:

function CountArrayList(arrayList, delimiter) {
  var count = 0;
  //for (i=0; i<array.length; i++)
  //{
    //count += array[i].split(delimiter).length;
  //}

  var newArray = arrayList.GetValues();
  return newArray.ToString();

  //return count;
}

我知道参数 arraylist 正在从电子表格接收对象数组,但是我不知道如何从这些对象中获取值,或者将它们转换为字符串。

或者我可能会以错误的方式解决这个问题?我有另一个脚本,它从两个字符之间的单元格中提取文本,这对于单个单元格来说很好。一系列不同的细胞是什么?

4

3 回答 3

3

这是您可以在不使用脚本但使用普通旧公式的情况下实现的目标:

=SUM(ARRAYFORMULA(LEN(A1:A3)-LEN(SUBSTITUTE(A1:A3; ","; "")) + 1))

信用在这里:https ://webapps.stackexchange.com/q/37744/29140

于 2013-01-09T22:46:00.207 回答
1

像这样的工作:

function CountArrayList(arrayList) {
return arrayList.toString().split(',').length
}

这还不够吗?

编辑 Oooops,对不起,我忘记了用户定义的分隔符,所以像这样

function CountArrayList(arrayList,del) {
return arrayList.toString().split(del).length
}

用法 :=CountArrayList(A1:C1;",")

注意:在上面的示例中,使用“,”以外的其他分隔符会很危险,因为toString()使用逗号连接数组元素...如果您确实需要这样做,请尝试使用正则表达式将逗号更改为您使用的内容并应用对此的分歧。

试试这样:

function CountArrayList(arrayList,del) {
return arrayList.toString().replace(/,/g,del).split(del).length
}
于 2013-01-09T15:55:41.787 回答
0

我的另一个解决方案是我需要隐式转换数组中的对象作为字符串传递。

例如,此函数接受单元格数组,并将其内容输出为以 del 作为分隔符的字符串(类似于 String.Split() 函数)。请注意 TrimString 函数,它被传递给数组的一个元素。

function ArrayToString(array,del) {
  var string = "";

  for (i=0; i < array.length; i++) {
    if (array[i] != null) {
      var trimmedString = TrimString(array[i]);
      if (trimmedString != "") {
        if (string.length > 0) {
          string += del;
        }

        string += trimmedString;
      }
    }
  }

  return string;
}

下面是 TrimString 函数。

function TrimString(string) {
  var value = "";
  if (string != "" && string != null) {
    var newString = "";
    newString += string;

    var frontStringTrimmed = newString.replace(/^\s*/,"");
    var backStringTrimmed = frontStringTrimmed.replace(/\s*$/,"");
    value = backStringTrimmed;
  }
  return value;
}

我发现这段代码抛出了一个 TypeError ,除非我包含了 newString 变量的声明,并向其中添加了数组元素对象,隐式地将数组元素对象转换为字符串。否则无法调用 replace() 函数。

于 2013-01-10T14:24:44.390 回答