3 回答
TA贡献1797条经验 获得超6个赞
一种更有效的计算总和的方法是使用reduce,这样你就可以摆脱for
循环。
可以仅使用函数计算总和reduce
。所有其他函数:flat
, map
,filter
用于确保数据正确,因为我们不知道您的电子表格文件是如何构建的以及您使用的值是什么。有关每个步骤的详细说明,请参阅代码注释。
解决方案:
const netSquare = sheet_origin2.getRange('L2:L').getValues(). // get column L (12th column)
flat(). // convert the 2D array to 1D array
filter(v=>v!=''). // filter out empty cells
map(v=>parseInt(v)); // convert string numbers to integers
const sum = netSquare.reduce((a,b)=>a+b); // add all numbers together
sheet_destination.getRange(sheet_destination.getLastRow(), 2, 1, 1).setValue(sum);
TA贡献1757条经验 获得超7个赞
最后一行≠行数,尤其是因为您跳过了第一行。
.getValues()
返回一个二维数组,所以你需要使用netSquare[i][0]
您应该在 for 循环中使用要迭代的数组的长度,并确保您的索引不会越界。
function sum() {
// ... define the sheets ...
var lastRow = sheet_origin2.getLastRow();
var numRows = lastRow - 1; // Subtract one since you're skipping the first row
var netSquare = sheet_origin2.getRange(2, 12, numRows, 1).getValues();
var sum = 0;
for (var i=0; i<netSquare.length; i++) {
sum += netSquare[i][0];
}
sheet_destination.getRange(sheet_destination.getLastRow(), 2, 1, 1).setValue(sum);
}
TA贡献1812条经验 获得超5个赞
最短的修复方法是类型转换,因为当您获取数据时它们变成了字符串。
改变你的:
sum += netSquare[i];
到:
sum += parseInt(netSquare[i]); // if whole number sum += parseFloat(netSquare[i]); // if number has decimal
这强制该netSquare[i]
值的类型为整数/浮点数,可以作为数字添加。当我们确定 netSquare[i] 值都是数字时,就不会有问题。
对于可能出现的问题,您可以在类型转换非数字数据时检查可能的结果。
添加回答
举报