当前位置: 首页 > 知识库问答 >
问题:

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

赫连坚
2023-03-14

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

我的目标是编写一个脚本,从用户指定范围内的每个表单输入中删除数字,然后添加所有数字以提供单个分数。因此,例如,用户可以在单元格中键入=sumColumns(H2:K2),它将返回分数的总和(对于我发布的示例屏幕截图,它将返回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更改为


共有2个答案

劳和雅
2023-03-14

我不擅长自定义函数,因为我从来不使用它们,但似乎不是一个真正的数组...

斜体评论:

嗯,不好意思。。。我的第一个想法是它必须是一个2D数组,但我在测试中记录了val[0],它返回了一个“undefined”错误。。。我当时一定是打错了什么东西。。。无论如何,这就是为什么我寻找一种将数据作为字符串处理并使用split和regex的方法。像往常一样,对于莫格斯达德的答案,你有一个答案和所有的解释;-)而且,和他一样,你也经常得到比我更好的答案。(但有一个限制(@Mogsdad)关于非整数值的注释也可以应用到代码中。。。您只需使用parseInt()去掉任何十进制值…:-)这就是说,您的用例描述得很好,在本例的限制下,这两个代码都应该按预期工作,Mogsdad的一个更“学术化”且编程正确。

评论结束。

使用下面的技巧,它可以在任何输入范围(1或更多行和列)中正常工作:

function sumCol(val) { // returns the sum of all numeric values in range
  var values = val.toString().split(',');
  var sum = 0;
  for(var n=0;n<values.length;++n){
    sum+=Number(values[n].replace(/[^0-9+.]/ig,''));
  }
  return sum;
}

我还改变了数字提取模式,使其更加普遍。

闽焕
2023-03-14

面向对象-编辑

当您给Custom Function一个范围作为参数时,H2: K2在这种情况下,函数会收到一个二维数组,相当于返回值Range.get值()。您可以通过(暂时)更改函数来返回参数的JSON表示形式,从而轻松地测试这一点:

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

以下是您将在包含=Sum列(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

您想知道

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

使用parseInt()是一个不错的选择,并且对电子表格中的值非常有效。但是,可以通过确保任何String值首先剥离前导非数字值来改进-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;
}

 类似资料:
  • 人若自洁,脱离卑贱的事,就必作贵重的器皿,成为圣洁,合乎主用,预备行各样的善事。你要逃避少年的私欲,同那清心祷告主的人追求公义、信德、仁爱、和平。惟有那愚拙无学问的辩论,总要弃绝,因为知道这等事是起争竞的。(2 TIMOTHY 2:21-23) 电子表格 一提到电子表格,可能立刻想到的是excel。殊不知,电子表格“历史悠久”,比Word要长久多了。根据维基百科的记载整理一个简史: VisiCal

  • 我正在尝试从多个google电子表格中删除一个特定的表格。 我有一个主电子表格,从所有其他电子表格收集数据。从主电子表格中,我可以在其他电子表格中执行不同类型的操作,如添加工作表、重命名工作表、隐藏和锁定工作表。 但无法删除其他电子表格中的表格。查看了其他线程,但找不到任何解决方法。 这就是我到目前为止得到的。它停在这一排: "fname.delete表(本周);}" 我很感谢大家对我的帮助,因为

  • 我很难找到将多张工作表同步到主电子表格的方法。在我的测试中,我有一个大的电子表格,上面有5个城市的地址。我正在尝试为每个城市创建一个电子表格,并能够在任何一个表格中更改数据时同步数据。因此,我将管理总体数据,5张电子表格中的每一张都将分配给其他人。这样,他们就可以在不访问所有数据的情况下更新工作表。使用内置查询或导入功能的问题是,如果用户在“城市”电子表格上进行更改,它将破坏该表格,因为数据被引用

  • 我已经通过谷歌官方文档《开发者指南》API中提到的一个简单Java代码成功地在我的Google Drive帐户的现有电子表格中创建了一个新的工作表,但我想通过Java代码在我的Google Drive帐户中创建一个新的电子表格。在链接中,他们没有提到这方面的任何示例代码。我已经在Spreadservice类中看到了不同的可用方法。 如何使用Google电子表格API实现这一点?

  • Google Drive API和Google电子表格API(v 3.0)都支持获取以下URL对应的[KEY]的方法: https://docs.google.com/spreadsheet/ccc?key=[键] 我正在使用该文件。Google Drive API的getId()方法和电子表格条目。getId或。Google电子表格API的getKey()方法。 Google Drive API

  • 我是一名编码等方面的初学者,但我正在努力理解我在做什么以及代码中发生了什么。 我想在不同的电子表格之间划一行。 我在“核心”电子表格中有一个脚本,它在“主页”和“完成”表格链接之间移动一行到电子表格: 我搜索了如何将位于“已完成”工作表上的数据移动到另一个名为“数据库”的电子表格链接到电子表格: 但我想将数据从表“CORE”/“Finished”传输到表“database”/“DB”,而不重写DB