如何使用 Google Apps 脚本对长度不同的列求和?

How can I use Google Apps Script to sum a column that will vary in length?

我正在尝试使用 Google Apps scipt 在该列的最底部添加列的求和公式。行数会有所不同,但起始单元格将保持不变。

我想使用公式而不是插入静态总和,以便用户无需 运行 任何脚本即可查看最新总和。

constantslr+savingslr+needslr+wantslr = the number of rows to be summed。它们定义较早。


我试过了,但没有成功。

var sss = SpreadsheetApp.getActiveSpreadsheet();
var ss = sss.getSheetByName('Set Up Data');
ss.getRange(6+constantslr+savingslr+needslr+wantslr,4,1,1).setFormulaR1C1('
=SUM(-['constantslr+savingslr+needslr+wantslr']C[0]:R[-1]C[0])');

这不是应用程序脚本公式,但如果您将要汇总的区域设置为名称范围,并使用:

 =SUM(YourRangeName) 

它将对整个范围求和。

只要在第一行和最后一行之间插入行,命名范围就会包含所有行。

示例:第 2 - 17 行是命名范围 SumThing

中间插入了5行: 命名范围会随着您插入行而扩展。您可以在数据底部和包含求和公式的行之间留一个空行,然后在空行上方插入行以实现相同的目的。

在 App 脚本中也很有用

我一直在我的应用程序脚本中使用命名范围,这样我就不必担心有人向 sheet 添加行或列并破坏脚本范围。要在应用脚本中执行此操作:

function useNamedRange(){
  var ss = SpreadsheetApp.getActive();
  
  // Named ranges belong to the spreadsheet, not an individual sheet
  var range = ss.getRangeByName("SumThing");

  // do something with the named range
}

可以用公式SUM()来完成。但是,如果不想使用范围,只想获得某个单元格上方所有数字的总和,这里是自定义函数:

function SUMCOL() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var cell  = sheet.getActiveCell()
  var col   = cell.getColumn();
  var row   = cell.getRow();
  var range = sheet.getRange(1,col,row-1,1); // from row 1 and down to the cell with the formula
  var data  = range.getValues().flat().filter(Number); // skip empty cells and non-didgits
  var sum   = data.reduce((a,b) => a + b, 0);
  return sum;
}