Javascript Google电子表格的自定义函数-处理从电子表格传递的数组
我正在尝试构建一个简单的脚本来使用谷歌电子表格。电子表格从Google表单获取输入,因此电子表格中有一系列值,如下所示: 我的目标是编写一个脚本,从用户指定范围内的每个表单输入中删除数字,然后添加所有数字以提供单个分数。因此,例如,用户可以在单元格中键入Javascript Google电子表格的自定义函数-处理从电子表格传递的数组,javascript,google-apps-script,google-sheets,google-forms,custom-function,Javascript,Google Apps Script,Google Sheets,Google Forms,Custom Function,我正在尝试构建一个简单的脚本来使用谷歌电子表格。电子表格从Google表单获取输入,因此电子表格中有一系列值,如下所示: 我的目标是编写一个脚本,从用户指定范围内的每个表单输入中删除数字,然后添加所有数字以提供单个分数。因此,例如,用户可以在单元格中键入=sumColumns(H2:K2),它将返回分数的总和(对于我发布的示例屏幕截图,它将返回3+3+0+3,9)的结果) 以下是我为此编写的代码: function sumColumns(values) { var sum = 0; f
=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;
}
函数列(值){
var总和=0;
对于(var i=0;i我不擅长使用自定义函数,因为我从未使用过它们,但似乎值
并不是真正的数组
斜体评论:
嗯……我的第一个想法是它必须是一个2D数组,但我在测试中记录了val[0],它返回了一个“undefined”错误……当时我一定输入了错误的内容……无论如何,这就是为什么我想办法将数据作为字符串处理,并使用split和regex。
和往常一样,莫格斯达德的答案你有一个答案和所有的解释;-)而且,和他一样,你也经常得到比我更好的答案。
(但有一个限制(@Mogsdad)您关于非整数值的注释也可以应用于您的代码……您只需使用parseInt()去掉任何十进制值……:-)
这就是说,您的用例描述得很好,在本例的限制下,这两个代码都应该按预期工作,Mogsdad的一个更“学术化”且编程正确
评论结束
使用下面的技巧,它对任何输入范围(1行或更多行和列)都能正常工作:
函数sumCol(val){//返回范围内所有数值的总和
var values=val.toString().split(',');
var总和=0;
for(var n=0;nOops-编辑并保存了问题,写了答案-但忘记保存。我让Serge抢先完成了!而且,像往常一样,Serge的答案很好(使用整数值)。但是您确实询问了问题的工作原理,所以请继续
在本例中,当您为自定义函数指定一个范围作为参数时,H2:K2
,该函数将接收一个二维数组,相当于range.getValues()
的返回值。您可以通过(临时)更改函数以返回参数的JSON表示形式,轻松地测试这一点:
function sumColumns(values) {
return JSON.stringify(values); // For debugging, just return string showing values
...
下面是您将在包含=sumColumns(H2:K2)
的单元格中看到的内容:
这显示了一个由[…]
括起的数组,其中还有一个数组,也由方括号括起,该数组有四个元素。如果我们将范围改为H2:K3
,我们会得到以下结果(为了清晰起见,添加了空格):
既然你知道了这一点,就很容易明白为什么你的函数会给出结果
首先,for(var i=0;i
function sumColumns(values) {
return JSON.stringify(values); // For debugging, just return string showing values
...
[["3 (Rarely)","3 (Frequently)","0 (Never)","3 (Frequently)"]]
[
["3 (Rarely)","3 (Frequently)","0 (Never)","3 (Frequently)"],
["","","",""]
]
for (var i=0; i < values[0].length; i++){ ... }
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;
}