如何使用Google Apps脚本向Google表格添加公式?

时间:2012-08-20 11:20:14

标签: google-apps-script google-sheets google-docs

如何添加如下公式:

=SUM(A1:A17)

使用适用于Google表格的Google Apps脚本API到一系列字段?

4 个答案:

答案 0 :(得分:33)

使用setFormula对所选单元格进行此操作。以下是如何执行此操作的示例。

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];

var cell = sheet.getRange("B5");
cell.setFormula("=SUM(B3:B4)");

您还可以使用setFormulaR1C1创建R1C1表示法公式。示例如下。

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];

var cell = sheet.getRange("B5");
// This sets the formula to be the sum of the 3 rows above B5
cell.setFormulaR1C1("=SUM(R[-3]C[0]:R[-1]C[0])");

要向多个字段添加多个公式,请使用setFormulas。以下示例

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];

// This sets the formulas to be a row of sums, followed by a row of averages right below.
// The size of the two-dimensional array must match the size of the range.
var formulas = [
  ["=SUM(B2:B4)", "=SUM(C2:C4)", "=SUM(D2:D4)"],
  ["=AVERAGE(B2:B4)", "=AVERAGE(C2:C4)", "=AVERAGE(D2:D4)"]
];

var cell = sheet.getRange("B5:D6");
cell.setFormulas(formulas);

答案 1 :(得分:2)

在范围内设置,复制和粘贴

例如,如果您希望A18保留公式'= SUM(A1:A17)',而B至Z列的公式相同,则可以在A18中设置公式,然后复制 A18至B18 :Z18。同样的情况适用于更复杂的范围。最简单的方法是使用宏记录器,然后检查脚本。

var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
sheet.getRange('A18').setFormula('=SUM(A1:A17)');
sheet.getRange('A18').copyTo(sheet.getRange('B18:Z18'));
//There are other parameters to 'copyTo' that you can use if needed

答案 2 :(得分:1)

我使用了Frans Van Assche建议的copyTo公式,但是由于没有预定义的范围,因此使用了从数字行和列到A1表示法的转换。例如,以下代码对从D列到总计列C中较早创建的许多数据列的每一行(不包括标题)求和。

  const startRow = 2; // first row to sum
  const startCol = 4; // first column to sum
  let endCol = sheet.getLastColumn(); // last column with data
  let endRow = sheet.getLastRow(); // last row with data
  let sumRange = sheet.getRange(startRow, startCol, 1, endCol - startCol + 1); // range for first cell of formula
  let copyRange = sheet.getRange(startRow, startCol - 1, endRow - 1, 1); // range to copy formulas into
  let sumFormula = "=SUM(" + sumRange.getA1Notation() + ")"; // define formula
  let totalsCol = startCol - 1; // this could be whichever column you want the totals to be in, for example, a constant or endCol + 1 if you want the totals at the end
  let startCell = sheet.getRange(startRow, totalsCol); // first cell to copy formula into
  startCell.setFormula(sumFormula); // add formula to first cell
  startCell.copyTo(copyRange); // copy formula from first cell to other range

答案 3 :(得分:0)

这是一个更笼统的答案。

假设您要使用列A的值加1的公式填充B列。例如,单元格B1中的公式为“ = A1 + 1”。

让我们规定范围的第一行是1,最后一行是20。

// create an array the same size as the number of rows.
var data = new Array[20];
// populate the array with the formulas.
for (var i=0; i < 20; i++)
{
  // note that as usual, each element of the array must itself be an array 
  // that has as many elements as columns. (1, in this case.)
    data[i] = ['=A' + i+1.toString() + ' + 1 ' ]
}
// set the column values.
sheet.getRange(1,2,20,1).setFormulas(data)

使这项工作适用于不同数量的行和不同的起始行, 在此示例中,使用变量代替硬编码的1和20是一个问题。