Как правильно использовать setFormula в App Script - PullRequest
0 голосов
/ 13 сентября 2018

У меня проблема с правильным использованием 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 голосов
/ 13 сентября 2018

Самое простое «исправление», как указано в комментарии, состоит в объединении вашей переменной цикла 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].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...