- Вы хотите пересчитать пользовательскую функцию
=findRate()
, когда ячейки с именем листа Rates
редактируются.
Если мое понимание верно, как насчет добавления следующего примера сценария? Пожалуйста, подумайте об этом как об одном из нескольких ответов.
Решение:
Чтобы пересчитать пользовательскую функцию, в этом ответе формула =findRate()
перезаписывается скриптом, запущенным с триггером события OnEdit (в данном случае это простой триггер.). Таким образом, пересчет выполняется. Но когда формула напрямую заменяется той же формулой, пересчет не выполняется. Поэтому я использовал следующий поток.
- Извлечь все диапазоны ячеек, имеющих формулу
=findRate()
, из листа «Прогнозируемый доход».
- Очистить формулы диапазонов.
- Поместите формулы в диапазоны.
С помощью этого потока при редактировании ячейки листа «Тарифы» пользовательская функция =findRate()
пересчитывается путем автоматического запуска onEdit()
.
Пример сценария:
Пожалуйста, скопируйте и вставьте следующий скрипт в редактор скриптов. Затем, пожалуйста, отредактируйте ячейки имени листа Rates
. При этом onEdit()
автоматически запускается триггером события OnEdit.
function onEdit(e) {
var range = e.range;
if (range.getSheet().getSheetName() == "Rates" && range.rowStart > 1 && range.columnStart > 1) {
var sheetName = "Projected Revenue"; // If you want to change the sheet name, please modify this.
var formula = "=findRate()";// If you want to change the function name, please modify this.
var sheet = e.source.getSheetByName(sheetName);
var ranges = sheet.createTextFinder(formula).matchFormulaText(true).findAll().map(function(e) {return e.getA1Notation()});
sheet.getRangeList(ranges).clearContent();
SpreadsheetApp.flush();
sheet.getRangeList(ranges).setFormula(formula);
}
}
Примечание:
onEdit(e)
запускается триггером события OnEdit. Поэтому при непосредственном запуске onEdit(e)
возникает ошибка. Пожалуйста, будьте осторожны с этим.
- В этом примере сценария, в качестве примера, даже при редактировании строки 1 и столбца «А» листа «Тарифы» пользовательская функция не пересчитывается. Если вы хотите изменить это и указать ограничение диапазона, который хотите редактировать, измените приведенный выше скрипт.
Ссылки:
Если я неправильно понял ваш вопрос, и это был не тот результат, которого вы хотите, я прошу прощения.
Добавлено:
Предложение от Комментарий TheMaster было отражено в сценарии. Когда можно использовать sheet.createTextFinder(formula).matchFormulaText(true).replaceAllWith(formula)
, я также думаю, что стоимость процесса будет значительно снижена. Но в моей среде казалось, что формулы необходимо очищать один раз, чтобы обновить пользовательскую функцию, даже если используется flush()
. Поэтому я предложил выше поток.
Но теперь я мог заметить обходной путь, используя replaceAllWith()
TextFinder. Поэтому я хотел бы добавить это. Ход этого обходного пути выглядит следующим образом.
- Заменить все значения
=findRate()
значением в листе Projected Revenue
, используя replaceAllWith()
..
- В этом случае в качестве тестового примера формулы заменяются на
sample
.
- Заменить
sample
на =findRate()
, используя replaceAllWith()
.
Этим потоком я могу подтвердить, что =findRate()
пересчитан. А также, похоже, что flush()
не требуется для этой ситуации.
Пример сценария:
Пожалуйста, скопируйте и вставьте следующий скрипт в редактор скриптов. Затем отредактируйте ячейки с именем листа Rates
. При этом onEdit()
автоматически запускается триггером события OnEdit.
function onEdit(e) {
var range = e.range;
if (range.getSheet().getSheetName() == "Rates" && range.rowStart > 1 && range.columnStart > 1) {
var sheetName = "Projected Revenue";
var formula = "=findRate()";
var tempValue = "sample";
var sheet = e.source.getSheetByName(sheetName);
sheet.createTextFinder(formula).matchFormulaText(true).replaceAllWith(tempValue);
sheet.createTextFinder(tempValue).matchFormulaText(true).replaceAllWith(formula);
}
}