我正在尝试构建一个简单的脚本来使用谷歌电子表格。电子表格从Google表单获取输入,因此电子表格中有一系列值,如下所示:
我的目标是编写一个脚本,从用户指定范围内的每个表单输入中删除数字,然后添加所有数字以提供单个分数。因此,例如,用户可以在单元格中键入=sumColumns(H2:K2)
,它将返回分数的总和(对于我发布的示例屏幕截图,它将返回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更改为
我不擅长自定义函数,因为我从来不使用它们,但似乎值
不是一个真正的数组...
斜体评论:
嗯,不好意思。。。我的第一个想法是它必须是一个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;
}
我还改变了数字提取模式,使其更加普遍。
面向对象-编辑
当您给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