我在应用程序脚本中正确使用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
答案 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
时,您会计算出H
比E
和I
4多3列。它都在同一行上,所以行差异为零。最后,要编写相对引用,请将数字包装在[]
中。因此,=H7 * I7
上的E7
变成了=R[0]C[3] * R[0]C[4]
。