How do I add formulas to Google Sheets using Google Apps Script?

后端 未结 4 1071
我寻月下人不归
我寻月下人不归 2020-11-30 02:49

How do I add a formula like:

=SUM(A1:A17)

to a range of fields using the Google Apps Script API for Google Sheets?

相关标签:
4条回答
  • 2020-11-30 03:23

    Here's a more general answer.

    Suppose you want to populate column B with a formula that is the value of column A, plus 1. For example,the formula in cell B1 would be "=A1 + 1".

    Let's stipulate that first row of the range is 1, and the last is 20.

    // create an array the same size as the number of rows.
    var data = [];
    // 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);
    

    Making this work for different numbers of rows, and different starting row, is a matter of using variables instead of the hard-coded 1 and 20 in this example.

    0 讨论(0)
  • 2020-11-30 03:25

    I used the copyTo formula suggested by Frans Van Assche, but used conversions from numeric rows and columns to A1 notation because I didn't have a predefined range. For example, the following code sums each row, not including the header, from column D to however many columns of data were created earlier in the totals column 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
    
    0 讨论(0)
  • 2020-11-30 03:37

    This is done using the setFormula for a selected cell. Below is an example of how to do this.

    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getSheets()[0];
    
    var cell = sheet.getRange("B5");
    cell.setFormula("=SUM(B3:B4)");
    

    You can also use setFormulaR1C1 to create R1C1 notation formulas. Example below.

    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])");
    

    To add several formulas to several fields use setFormulas. Example below

    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);
    
    0 讨论(0)
  • 2020-11-30 03:45

    Set, Copy & Paste in a range

    If you want for example A18 to hold the formula '=SUM(A1:A17)' and the same for columns B to Z you can set the formula in A18 and then copy A18 to B18:Z18. The same thing holds for more complicated ranges. The easiest to get going is to use the macro recorder and then inspect your script.

    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
    
    0 讨论(0)
提交回复
热议问题