В листах Google можно обернуть стандартную функцию в пользовательскую функцию, чтобы контролировать, когда она запускается? - PullRequest
1 голос
/ 29 апреля 2019

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

https://webapps.stackexchange.com/questions/129068/recalculate-google-sheet-on-demand

Вот мой оригинальный вопрос:

У меня есть следующая формула влист:

=if(E1="HOLD",,query(Cust_Orders!B6:Z5000,"Select Y,G,I,H,K where H>0  "))

Если E1 - это раскрывающийся список со значениями HOLD и FETCH

Пересчет при переходе на FETCH занимает около 13 секунд.

Но когда этов режиме HOLD запрос не выполняется, и все становится пустым.Не то, что я хочу.

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

Все настройки Google Recalc Recalc находятся в состоянии изменения и foo '

Есть ли способ сделать это?

Пользовательские функции обновляются только при изменении одного из их параметров.Так что, если функция зависит только от ячейки HOLD / FETCH, но выполняет формулу, являющуюся ячейкой запроса, я думаю, что я выиграю.

Мое исследование:

Этот ответ google sheet customФункция встроенной функции специально указывает оператору, как делать то, что он хочет, на языке сценариев.Я подозреваю, что переписать запрос в appscript не будет чистой победой.

Эта ссылка Использование связанных сценариев Google для создания объекта запроса

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

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

В этом обсуждении на форумах по продуктам Google: https://support.google.com/docs/forum/AAAABuH1jm01F-8MzzCxbY/?hl=en&gpf=%23!topic%2Fdocs%2F1F-8MzzCxbY говорится, что нельзя вызывать встроенные модули изскрипты.Но этому вопросу почти 4 года.

Я тоже там задавал этот вопрос, но обычно я спрашиваю на форумах по продуктам Google: «Радуйся, Мария».

Жизнеспособное решение:

  • Пример скрипта, вызывающего встроенную функцию.
  • Ссылка на надстройку, позволяющую пересчитывать диапазонбыть включенным / выключенным
  • Более общий метод, чем пользовательские формулы для управления перерасчетом.

Я НЕ хочу сценарий, который эмулирует желаемую встроенную в сценарий.

1 Ответ

1 голос
/ 30 апреля 2019
  • Более общий метод, чем пользовательские формулы для контроля перерасчета.

Что я делаю в проекте для клиента, так это чтобы «дорогие» формулы сохранялись в сценариях как переменные и имели кнопки для замораживания / размораживания определенных диапазонов (тех, которые сильно влияют на время пересчета.

  • Кнопка «Разморозить» добавляет формулы в электронную таблицу
  • Кнопка «заморозить» помещает результаты формул в диапазон, используемый формулами
  • Существует свойство документа, в котором хранится состояние замороженной / незамерзшей электронной таблицы
  • Боковая панель используется для отображения кнопок состояния электронной таблицы.
  • Пример скрипта, вызывающего встроенную функцию.

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


В случае моего клиента у них есть одна формула массива (IMPORTRANGE, QUERY, FILTER, ARRAYFORMULA и т. Д.) По листам, все включенные формулы находятся на A1. Формулы сохраняются в массиве объектов следующей формы

var formulas = [
  {
    name:'Sheet1',
    address:'A1',
    formula:'=IMPORTRANGE(...)'
  }
]

Свойство address включено для будущих улучшений.

Ключевыми строками кода функции «заморозка» являются

var dataRange = sheet.getDataRange();
dataRange.copyTo(dataRange, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);

Обратите внимание, что приведенные выше строки копируют-вставляют-как-значения весь диапазон данных.

Ключевыми строками кода функции "разморозить" являются

formulas.forEach(function(item){
  var sheet = spreadsheet.getSheetByName(item.name);
  sheet.clear();
  sheet.getRange(item.address).setFormula(item.formula);
});

Обратите внимание, что приведенные выше строки очищают весь лист.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...