Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Google电子表格的自定义函数-处理从电子表格传递的数组_Javascript_Google Apps Script_Google Sheets_Google Forms_Custom Function - Fatal编程技术网

Javascript 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

我正在尝试构建一个简单的脚本来使用谷歌电子表格。电子表格从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;
}
函数列(值){
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;
}