Google Script电子表格自定义函数处理一系列单元格并获取其值

时间:2013-01-09 14:54:41

标签: google-apps-script spreadsheet

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

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正在从电子表格接收一个对象数组,但是我不知道如何从这些对象中获取值,或者可能将它们转换为字符串。

或者我可能会以错误的方式解决这个问题?我有另一个脚本从两个字符之间的单元格中提取文本,这对单个单元格工作正常。什么是不同的细胞?

3 个答案:

答案 0 :(得分:3)

这是你可以在不使用脚本的情况下实现的,而是使用简单的旧公式:

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

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

答案 1 :(得分:1)

这样的作品:

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

不够吗?

编辑Oooops,抱歉我忘记了用户定义的分隔符,所以就像这样

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

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

注意:在上面的这个例子中,使用另一个分隔符而不是&#34;,&#34;因为toString()用逗号连接数组元素...如果你真的需要这样做,请尝试使用正则表达式将逗号更改为你使用的内容并在其上应用拆分。

尝试这样:

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

答案 2 :(得分: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()函数。