Есть ли более быстрый способ обновить все мои пользовательские формулы?

Мне нужно обновить все мои пользовательские формулы с помощью скрипта в Google Таблицах, но, похоже, это займет вечность (например, 30 секунд для 100 ячеек). С моей настраиваемой формулой потенциально будут тысячи ячеек, поэтому я должен придумать лучший способ. У меня есть:

function refresher(){
  var sheet = SpreadsheetApp.getActiveSheet();
  var selection = sheet.getDataRange();
  var columns = selection.getNumColumns();
  var rows = selection.getNumRows();
  for (var column=1; column <= columns; column++){
    for (var row=1; row <= rows; row++){
      var cell=selection.getCell(row,column);
      var formula = cell.getFormula();
      if (formula.startsWith("=myfunc(")){
        cell.setFormula(formula.replace("=myfunc(", "?myfunc("));
      }
    }
  }
  SpreadsheetApp.flush();
  for (var column=1; column <= columns; column++){
    for (var row=1; row <= rows; row++){
      var cell=selection.getCell(row,column);
      var formula = cell.getFormula();
      if (formula.startsWith("=?myfunc(")){
        cell.setFormula(formula.replace("=?myfunc(", "=myfunc("));
      }
    }
  }
}

person user_87625129    schedule 22.05.2020    source источник
comment
Отвечает ли это на ваш вопрос? Пользовательская функция не обновляется при изменении входных данных   -  person TheMaster    schedule 22.05.2020
comment
Связано: stackoverflow.com/questions/56798247   -  person TheMaster    schedule 22.05.2020


Ответы (1)


Как насчет использования TextFinder для достижения своей цели? В этом случае, я думаю, можно было бы снизить стоимость процесса. Из вашего скрипта, когда TextFinder используется для вашей ситуации, это выглядит следующим образом.

Пример сценария:

function refresher() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const formula = "=myfunc";
  const tempFormula = "=sampleFormula";
  sheet.createTextFinder("^\\" + formula).matchFormulaText(true).useRegularExpression(true).replaceAllWith(tempFormula);
  sheet.createTextFinder("^\\" + tempFormula).matchFormulaText(true).useRegularExpression(true).replaceAllWith(formula);
}

Ссылка:

person Tanaike    schedule 22.05.2020
comment
Прохладный. Спасибо! Вы можете объяснить, почему я должен использовать "^\\" так же, как useRegularExpression(true)? - person user_87625129; 23.05.2020
comment
Кажется, что он застревает в состоянии Loading... много раз, когда я пытаюсь обновить формулы - person user_87625129; 23.05.2020
comment
@ user_87625129 Спасибо за ответ. А1. _1 _ ^ \ `используется для = для использования его в качестве регулярного выражения. A2. Loading... означает, что формулы были обновлены. К сожалению, я не могу воспроизвести вашу ситуацию. Прошу прощения за это. Например, когда SpreadsheetApp.flush() помещается в последнюю строку refresher(), какой результат вы получите? - person Tanaike; 23.05.2020
comment
Ничего не делает. Я могу подтвердить, что в любом случае он обращается к нашему API, но просто отображает Загрузка ... Кстати, это в Firefox. - person user_87625129; 23.05.2020
comment
Кажется, нормально работает с SpreadsheetApp.flush() или без него в Chrome, так что это просто ошибка Firefox. Странный. - person user_87625129; 23.05.2020
comment
@ user_87625129 Спасибо за ответ. По поводу «A2», прошу прощения, мой комментарий не был полезен для вашей ситуации. Причина, по которой ваша проблема не может быть решена в ближайшее время, связана с моими плохими навыками. Я должен извиниться за это. Например, когда вместо вашей реальной электронной таблицы используется простая электронная таблица, в которой обновляется простой образец формулы, какой результат вы получите? Если возникнет такая же ситуация, как насчет тестирования, сменив браузер? Я думаю, что если образец скрипта сработал, формулы в реальной таблице необходимо подтвердить. Как насчет этого? - person Tanaike; 23.05.2020