javascript - Google Spreadsheet 的自定义函数 - 处理从电子表格传递的数组

标签 javascript google-apps-script google-sheets google-forms custom-function

我正在尝试构建一个简单的脚本来使用 Google 电子表格。该电子表格从 Google 表单获取输入,因此电子表格中有一系列值,如下所示:

http://i43.tinypic.com/2losg5.jpg

我的目标是编写一个脚本,从用户指定范围内的每个表单输入中删除数字,然后添加所有数字以提供单个分数。例如,用户可以输入 =sumColumns(H2:K2)在一个单元格中,它将返回分数的总和(对于我发布的示例屏幕截图,它将返回 3+3+0+39 的结果)。

这是我为此编写的代码:

function sumColumns(values) {
  var sum = 0;
  for(var i = 0; i <= values.length; i++){
    var input = values[0][i];
    var x = input.toString();
    var y = x.charAt(0);
    var num = parseInt(y);
    sum += num;
  }
  return sum;
}

问题是它似乎只将两个值加在一起。所以,当我输入 =sumColumns(H2:K2)在电子表格的单元格中,它仅返回 6 。另外,在第 3 行,如果我将其从 i <= values.length 更改为至i < values.length它只添加一个数字,这样我就得到 3因此。我的猜测是我误解了 Google 电子表格值传递给函数的方式,但我完全无法使其工作。我真的很感激任何帮助!

最佳答案

哎呀 - 编辑并保存了问题,写了一个答案 - 却忘了保存。我让 Serge 打败了我!而且,像往常一样,Serge 的答案效果很好(使用整数值)。但您确实询问过事情是如何运作的,所以就开始吧。

当您为自定义函数提供一个范围作为参数时,H2:K2在这种情况下,函数接收一个二维数组,相当于Range.getValues()的返回值。 。您可以通过(暂时)更改函数以返回参数的 JSON 表示形式来轻松测试这一点:

function sumColumns(values) {
  return JSON.stringify(values);   // For debugging, just return string showing values
  ...

以下是您将在包含 =sumColumns(H2:K2) 的单元格中看到的内容:

[["3 (Rarely)","3 (Frequently)","0 (Never)","3 (Frequently)"]]

这显示了一个由 [ .. ] 包围的数组,里面有另一个数组,也用方括号括起来,该数组有四个元素。如果我们将范围更改为 H2:K3相反,我们得到这个(为了清晰起见添加了空格):

[
  ["3 (Rarely)","3 (Frequently)","0 (Never)","3 (Frequently)"],
  ["","","",""]
]

既然您知道了这一点,就很容易明白为什么您的函数会给出它所给出的结果。

首先,for(var i = 0; i <= values.length; i++)使用错误的数组边界进行循环,因为 values.length会告诉我们 values 有多少 。在 H2:K2 ,该长度为 1 。相反,我们需要循环遍历第一行 ( values[0] ) 中的列,其 4细胞。

您想知道 <<=对于这个循环 - 我们确实需要使用 <因为它是一个从 0 开始的索引,并且 .length返回元素的计数。所以我们最终得到:

for (var i=0; i < values[0].length; i++){ ... }

使用parseInt()是一个不错的选择,并且非常适合电子表格中的值。不过,可以通过确保任何字符串值首先删除前导非数字值来改进它 - parseInt()然后可以在字符串中找到一个整数。

function sumColumns(values) {
  return JSON.stringify(values);   // For debugging, just return string showing values
  var sum = 0;
  for(var i = 0; i < values[0].length; i++){
    var input = new String(values[0][i])
                 .replace( /^\D+/g, '');    // Strip any leading non-digits
    sum += parseInt(input);
  }
  return sum;
}

关于javascript - Google Spreadsheet 的自定义函数 - 处理从电子表格传递的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18004140/

相关文章:

javascript - 如何将 javascript 文件转换为 .exe 文件

javascript - onpropertychange 检测用户操作

javascript - 语法错误重复出现的电子邮件时间表

javascript - 是否有可能需要 Vue 组件的许多 Prop 之一?

javascript - Div 占用了它不存在的空间

javascript - Google 脚本 - 发送电子邮件到特定列的最后一行

google-apps-script - 如何从 google apps 脚本中的 urlfetch 获取 Google 搜索结果

google-sheets - 带有 Sumifs 的 Google Sheets ArrayFormula

google-sheets - 如何通过谷歌工作表对 importhtml 的工作表进行排序,正在使用 Unresolved 查询

csv - 如何使用管道分隔符导出到 .csv