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 Проверить, находится ли отредактированная ячейка в определенном диапазоне