我在应用程序脚本中正确使用 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
,你算一下H
比 E
领先 3 列和I
4. 而且都在同一行,所以行差为零。最后,要编写相对引用,请将数字包装在 []
中。 。因此=H7 * I7
上E7
变成=R[0]C[3] * R[0]C[4]
.
关于javascript - 如何在App Script中正确使用setFormula,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52316999/