【问题标题】:How do I add formulas to Google Sheets using Google Apps Script?如何使用 Google Apps 脚本将公式添加到 Google 表格?
【发布时间】:2012-08-15 17:28:30
【问题描述】:

如何添加如下公式:

=SUM(A1:A17)

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

【问题讨论】:

  • 您是在单元格区域中寻找相同的公式=SUM(A1:A17),还是要根据您在工作表中的位置更改总和内的范围?

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


【解决方案1】:

setValues() 也可以代替 setFormulas()

  var disht = spss.getSheetByName("DI");
  var divals = disht.getRange("A1:G50").getValues();
  divals[40][5]= "=round(SUM(F10:F39),0)"; //F41 =round(SUM(F10:F39),0)
  divals[42][5]= "=(F42+F41)*(F8/100)";  //F43 =(F42+F41)*(F8/100)
  divals[43][5]= '=if(G8>0,(F41+F42)*(G8/100),"")' ; //F44 =if(G8>0,(F41+F42)*(G8/100),"")
  divals[44][5]= '=if(isblank($G$7),"",sum($F$41:$F$44)*$G$7*0.01)';//F45 =if(isblank($G$7),"",sum($F$41:$F$44)*$G$7*0.01)
  divals[45][5]= '=round(F41,0)+round(F42,0)+round(F43,0)+round(F44,0)+round(F45,0)' ; //F46 =round(F41,0)+round(F42,0)+round(F43,0)+round(F44,0)+round(F45,0)
  divals[47][5]= "=F46-F47"; //F48 =F46-F47
  divals[44][4]= '=if(isblank($G$7),"","TCS")'; //E45  =if(isblank($G$7),"","TCS")
  disht.getRange("A1:G50").setValues(divals);

【讨论】:

    【解决方案2】:

    我使用了 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】:

      在一个范围内设置、复制和粘贴

      例如,如果您希望 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
      

      【讨论】:

      • 三参数copyTo 不是必需的,因为默认值已经是PASTE_NORMALfalse(不要转置)。用单参数短版没什么问题吧?
      • 是的,马丁,你是对的。我现在使示例代码更加简洁,并注释“copyTo”函数还有其他参数可以在需要时使用。
      【解决方案4】:

      这是一个更一般的答案。

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

      我们规定范围的第一行是1,最后一行是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);
      

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

      【讨论】:

        【解决方案5】:

        这是对选定单元格使用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);
        

        【讨论】:

        • 对于信息,这是一个非常糟糕的答案...不知道为什么它已被接受和投票。请参阅文档以了解如何获取范围,setFormula 是一种范围方法(2012 年也是如此:-)
        • @Sergeinsas 请发布您的方法
        • 我认为 setFormula 有效,但我同意应该在答案中更好地描述如何使用它,而不是专注于如何选择单元格。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-25
        • 1970-01-01
        • 2018-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多