如何在App脚本中正确使用setFormula

时间:2018-09-13 15:28:01

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

我在应用程序脚本中正确使用setFormula时遇到问题,我尝试在不确定的范围单元格中使用setFormula,但我不知道如何指定要增加的行范围,而不仅仅是指定范围。我尝试创建的脚本是一种条件,其中如果在一定范围的单元格中有信息,则将公式放在单元格中。

function formulas() {
  var activeSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet 1");
  var rows = activeSheet.getMaxRows();

  for(var  i=7; i <= rows; i++){
    var workingCell = activeSheet.getRange(i, 3).getValue();

     if(workingCell != ""){
       activeSheet.getRange(i, 4).setFormula("=$B$5"); //this is fine
       activeSheet.getRange(i, 5).setFormula("=((100/H7)*I7)/100"); //but this not
  }
 }
}

如果它的第8行是(" = ((100 / H8) * I8) / 100 "),依此类推。

编辑
问题是我尝试将其应用于许多单元格,并且添加的行将根据我放置公式的行而增加...如果在行D9和D10中添加了公式,则范围为H9,I9和H10,I10

1 个答案:

答案 0 :(得分:1)

注释中指出,最简单的“修复”是将i循环变量连接到公式中,如下所示:

function formulas() {
  var activeSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet 1");
  var rows = activeSheet.getLastRow(); //maxRows consider blank rows, you don't need those

  for(var i=7; i <= rows; i++){
    var workingCell = activeSheet.getRange(i, 3).getValue();

     if(workingCell != ""){
       activeSheet.getRange(i, 4).setFormula("=$B$5");
       activeSheet.getRange(i, 5).setFormula("=((100/H" +i+ ")*I" +i+ ")/100");
     }
  }
}

无论如何,此功能对电子表格执行了太多的获取和设置,并且随着工作表的增长,该功能将表现不佳。您应该尝试通过批量发行(即针对更大范围而不是逐个单元地发行)来最小化所有集合和获取。

您的用例对此方法有问题,因为您的范围内有一些空白点(workingCell为空白时)。如果您不希望为这些值设置“空白”公式,则可以使用以下方法极大地加快脚本运行速度:

function formulas() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet 1"); //not necessarily active
  var workingCells = sheet.getSheetValues(7, 3, -1, 1); //-1 == lastRow
  var r1c1formulas = [];
  for (var i=0; i < workingCells.length; i++){
     if (workingCells[i][0] != "") {
       r1c1formulas.push(['=R5C2', '=((100/R[0]C[3])*R[0]C[4])/100']);
     } else
       r1c1formulas.push(['=""','=""']);
  }
  sheet.getRange(7, 4, workingCells.length, 2).setFormulasR1C1(r1c1formulas);
}

第二个“技巧”是使用R1C1表示法的公式,而不是常规的A1样式。在此处查看setFormulaR1C1文档。

R1C1表示法乍一看似乎令人生畏,但相当简单,我想说它比“ A1”表示法更简单。我会在这里总结一下。 R是行号和C列,在字母的前面有行号和列号(而不是字母)。因此=$B$5被写为=R5C2

最后一件事是相对参考。在A1表示法中,您只是没有放置“ $”符号。当您试图一次设置一堆公式时(实际上是用例),这不是很直观,也不是那么灵活。因为在A1上相对公式是不同的公式,所以引用是不同的=B1=C1是不同的(如果在两个参数上设置了同一行和连续列中的单元格)。

无论如何,在R1C1表示法上,相对引用被计为来自作为引用的单元格中的行和列的数量。

因此,当您将公式=H7*I7设置为单元格E7时,您会计算出HEI 4多3列。它都在同一行上,所以行差异为零。最后,要编写相对引用,请将数字包装在[]中。因此,=H7 * I7上的E7变成了=R[0]C[3] * R[0]C[4]