为了账号安全,请及时绑定邮箱和手机立即绑定

使用谷歌应用程序脚本对列函数中的所有行求和

使用谷歌应用程序脚本对列函数中的所有行求和

牛魔王的故事 2023-06-15 17:23:07
我有一列"Net Sales",我试图在谷歌工作表中总结该列中的所有值,但使用谷歌应用程序脚本。净销售额的数据会发生变化,所以我尽量抽象。这是我到目前为止的功能,总和的输出显示在一个单独的电子表格中。这个函数实际上并没有把所有的销售额加起来,而是把所有的数字放在一起。例如,如果 Net Sales 列中的行是 100、200 和 50,则输出将是 10020050 而不是 350。我如何获得一个函数来实际将这些数字相加?//sum of all net sales (not working)var netSquare = sheet_origin2.getRange(2, 12, sheet_origin2.getLastRow(), 1).getValues();  var sum = 0;  for (var i=0; i<=sheet_origin2.getLastRow(); i++) {    sum += netSquare[i];  }  sheet_destination.getRange(sheet_destination.getLastRow(), 2, 1, 1).setValue(sum);
查看完整描述

3 回答

?
FFIVE

TA贡献1797条经验 获得超6个赞

一种更有效的计算总和的方法是使用reduce,这样你就可以摆脱for循环。

可以仅使用函数计算总和reduce。所有其他函数:flatmap,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);


查看完整回答
反对 回复 2023-06-15
?
长风秋雁

TA贡献1757条经验 获得超7个赞

  1. 最后一行≠行数,尤其是因为您跳过了第一行。

  2. .getValues()返回一个二维数组,所以你需要使用netSquare[i][0]

  3. 您应该在 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);

}


查看完整回答
反对 回复 2023-06-15
?
慕雪6442864

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] 值都是数字时,就不会有问题。

对于可能出现的问题,您可以在类型转换非数字数据时检查可能的结果。


查看完整回答
反对 回复 2023-06-15
  • 3 回答
  • 0 关注
  • 142 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信