javascript - 如何在App Script中正确使用setFormula

标签 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

最佳答案

正如评论中指出的,最简单的“修复”是将您的 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 ,你算一下HE 领先 3 列和I 4. 而且都在同一行,所以行差为零。最后,要编写相对引用,请将数字包装在 [] 中。 。因此=H7 * I7E7变成=R[0]C[3] * R[0]C[4] .

关于javascript - 如何在App Script中正确使用setFormula,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52316999/

相关文章:

javascript - 同时运行两个函数不起作用(Google Sheets 脚本)

javascript - 如何转换 Google map 中的自定义叠加层以考虑投影?

javascript - 需要使用CSS从 child 到 parent 的路径

javascript - 1个数字和3个大写字母的正则表达式

javascript - 如何向 PDF.js 查看器添加 UI 和工具栏?

google-apps-script - 如何知道点击了哪个菜单项?

Paypal rest api 和 Apps 脚本

javascript - 谷歌应用程序脚本将值!=0复制到新列中

google-apps-script - 通过 Google App Script 获取总空间和可用空间

javascript - 从对象数组动态构建二维数组