我正在尝试构建一个简单的脚本来使用 Google 电子表格。该电子表格从 Google 表单获取输入,因此电子表格中有一系列值,如下所示:
我的目标是编写一个脚本,从用户指定范围内的每个表单输入中删除数字,然后添加所有数字以提供单个分数。例如,用户可以输入 =sumColumns(H2:K2)
在一个单元格中,它将返回分数的总和(对于我发布的示例屏幕截图,它将返回 3+3+0+3
、 9
的结果)。
这是我为此编写的代码:
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/