猿问

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

我有一列"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);


牛魔王的故事
浏览 143回答 3
3回答

FFIVE

一种更有效的计算总和的方法是使用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 integersconst sum = netSquare.reduce((a,b)=>a+b); // add all numbers togethersheet_destination.getRange(sheet_destination.getLastRow(), 2, 1, 1).setValue(sum);

长风秋雁

最后一行≠行数,尤其是因为您跳过了第一行。.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);}

慕雪6442864

最短的修复方法是类型转换,因为当您获取数据时它们变成了字符串。改变你的: sum += netSquare[i];到: sum += parseInt(netSquare[i]); // if whole number  sum += parseFloat(netSquare[i]); // if number has decimal这强制该netSquare[i]值的类型为整数/浮点数,可以作为数字添加。当我们确定 netSquare[i] 值都是数字时,就不会有问题。对于可能出现的问题,您可以在类型转换非数字数据时检查可能的结果。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答