Пользовательские функции и пересчет

У меня есть пользовательская функция, которая принимает три диапазона имен в качестве входных параметров. Когда значения ячеек в этих диапазонах изменяются, выходные данные функции остаются неизменными. Это "особенность" платформы.

Есть ли какой-нибудь правильный способ (на данный момент) динамически пересчитывать пользовательские функции в Google Sheets? Я знаю, что люди пытались добавить now() в качестве параметра, который используется для непрерывного пересчета независимо от необходимости. (Теперь заблокирован в новых листах.) Кто-нибудь нашел удовлетворительное решение?

1 ответ

Решение

Правильный способ сделать эту функцию для пересчета - это изменить ее параметр. Относительно использования NOW() и других подобных встроенных функций в качестве параметров пользовательских функций из пользовательских функций в Google Sheets

Аргументы пользовательских функций должны быть детерминированными. То есть встроенные функции электронных таблиц, которые возвращают разные результаты при каждом вычислении, такие как NOW() или RAND(), не допускаются в качестве аргументов пользовательской функции. Если пользовательская функция пытается вернуть значение, основанное на одной из этих изменчивых встроенных функций, она будет отображать Загрузка... неопределенно долго.

Из комментария Mogsdad к этому ответу:

Фактически вместо "Загрузка..." будет отображаться #ERROR!, эта функция не может ссылаться на ячейку с помощью NOW(), RAND() или RANDBETWEEN()

Эта проблема:-

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

Возможные решения:-

А)

Очевидно, вы можете использовать Now() в любой ячейке, а затем передать эту ячейку в параметр функции. Обязательно меняйте настройки электронной таблицы -> расчет -> менять каждую минуту. (Это будет менять параметр функции каждую минуту и, таким образом, скрипт будет выполнен)

Обновленная электронная таблица, похоже, больше не позволяет передавать Now() или Rand() или подобные функции косвенно / напрямую в пользовательскую функцию.

Б)

Добавьте пункт меню "Обновить" и, возможно, перейдите к своему сценарию и определите функцию, которая изменяет значение ячейки, когда вы щелкаете меню "Обновить". Передайте значение в качестве параметра вашей функции, в которой вы выполняете свой скрипт.

C)

Перейдите к своему сценарию и сделайте функцию. Скажем, updateCellValue(). Теперь определите здесь ту же логику, которая направлена ​​на изменение значения ячейки.

Пример: SpreadsheetApp.getActiveSpreadsheet().getRange('A1').setValue(new Date().toTimeString());

Теперь перейдите в Edit->Current Project's trigger и создайте триггер, который будет запускать вашу функцию (updateCellValue) после каждого заданного пользователем лимита времени. Это будет делать то же самое, что и решение B, но вам не придется нажимать кнопку "Обновить" в меню.

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

Другие вопросы по тегам