OnEdit-триггер в сочетании с функциями-ячейками

У меня есть onEdit-скрипт, который вычисляет значение ячейки на основе содержимого ряда других ячеек. Мне нужно, чтобы этот скрипт был в триггере onEdit, а не в обычной функции ячейки, потому что я не всегда хочу, чтобы вычисление повторялось при изменении значения в одной из целевых ячеек, но вместо этого он проверяет определенные условия и пересчитывает только тогда, когда они выполнены.

У меня небольшая проблема в том, что одна из ячеек, из которых скрипт onEdit считывает данные, содержит функцию, а не простое число. Это вызывает проблему, потому что иногда, когда я вводю данные в ячейку, это вызывает и эту функцию-ячейку, и сценарий onEdit. И большую часть времени функция oEdit запускается до завершения функции ячейки, поэтому функция onEdit просто берет "Мышление" из этой ячейки и, таким образом, возвращает NaN.

Поэтому я думаю, что удобным решением этой проблемы было бы заставить функцию onEdit ждать, пока "целевые" ячейки завершат свои вычисления, но я не думаю, что есть способ сделать это?

Конечно, я мог бы переместить функцию cell (которая в основном является SUM-функцией с некоторыми дополнительными функциями) в сценарий onEdit, что решило бы проблему.

Но мне кажется не очень приятным иметь всю интерактивность в onEdit-триггере. Или я просто глупый?

Или есть другой подход, который я мог бы использовать как-нибудь?

2 ответа

Решение

Я думаю, что лучшим решением было бы заменить вашу пользовательскую формулу (которая "думает") на обычную формулу электронной таблицы, если это возможно. И это похоже на ваш случай, так как это просто функция SUM с "дополнительной функциональностью". Вероятно, достаточно SUMIF.

Если ваша функция действительно сложна и не может быть записана как обычная формула (в чем я действительно сомневаюсь), лучшим решением было бы действительно перенести вычисление на триггер onEdit.

Независимо от вашей проблемы, я всегда советую не использовать пользовательские формулы, они действительно проблематичны. Например, вы не сталкивались с проблемой кеширования?

Вы можете попробовать: SpreadsheetApp.flush(); в начале вашего сценария onEdit() для принудительного повторного вызова перед продолжением.

http://code.google.com/googleapps/appsscript/class_spreadsheetapp.html

Чтобы onEdit дождался расчетов, вы можете попробовать:

function onEdit(e) {

  // ...some if-condition that makes sure the following sleep is not called whenever any cell in your spreadsheet is edited

  Utilities.sleep(1000); // 1000 is the amount of milliseconds
}

https://developers.google.com/apps-script/reference/utilities/utilities

Хотя использование сна - хрупкое занятие, на случай, если расчеты займут больше или меньше времени, чем вы ожидали. Это может привести к проблемам с синхронизацией, которые трудно отладить.

Так что я думаю, что удобным решением было бы заставить функцию onEdit ждать, пока "целевые" ячейки закончат свои вычисления, но я не думаю, что есть способ сделать это?

Чтобы указанное выше условие if-condition ссылалось на целевые ячейки (определенный диапазон), см. Эти ответы: СЦЕНАРИЙ Google Spreadsheet Проверить, находится ли отредактированная ячейка в определенном диапазоне