Самое простое «исправление», как указано в комментарии, состоит в объединении вашей переменной цикла 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);
}
2-й «трюк» заключается в использовании формул в нотации R1C1вместо обычного стиля А1.Обратитесь к документации setFormulaR1C1 здесь.
Поначалу нотация R1C1 может показаться устрашающей, но она довольно проста, я бы сказал, что она проще, чем у 'A1'.Я постараюсь обобщить это здесь.R
- это номер строки, а C
столбец, а перед буквой у вас есть номер строки и столбца (вместо буквы).Так что =$B$5
записывается как =R5C2
.
Последнее, что отличается, - это относительная ссылка.В нотации A1
вы просто не ставите знаки '$'.Что не совсем интуитивно понятно и не настолько гибко, когда вы пытаетесь установить несколько формул одновременно (именно ваш вариант использования).Поскольку в A1 относительная формула является другой формулой, ссылки отличаются =B1
не совпадает с =C1
(что может быть "одинаковым" , если установлено в двух ячейках в одной строкеи последовательные столбцы).
В любом случае в нотации R1C1 относительная ссылка считается числом строк и столбцов в ячейке, являющейся ссылкой.
Итак, когда вы устанавливаете формулу =H7*I7
в ячейку E7
, вы считаете, что H
на 3 столбца впереди E
и I
4. И все это в одной строке, так что нулевая разница строк.И, наконец, чтобы написать относительную ссылку, вы заключаете число в []
.Поэтому =H7 * I7
на E7
становится =R[0]C[3] * R[0]C[4]
.