Вызовите пользовательскую функцию в Google таблицах только один раз и сохраните значение в ячейке

#google-apps-script #google-sheets #custom-function

#google-apps-script #google-sheets #пользовательская функция

Вопрос:

Я написал пользовательскую функцию Google Apps script, которая вызывается с помощью Google sheet. В этой функции вызывается API, и результат этого API возвращается таким образом, чтобы он отображался в вызывающей ячейке таблицы Google.

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

Можно ли сохранить возвращаемое значение в ячейку и не вызывать пользовательскую функцию снова, когда значение было возвращено? Я хочу, чтобы функция вызывалась только один раз для каждой ячейки, даже если я закрою документ и снова открою его. Возвращаемое значение должно быть сохранено до тех пор, пока в ячейку не будет записано что-то еще. Это сделало бы документ my sheets намного более удобным для использования, чем текущее состояние.

Комментарии:

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

2. Можете ли вы показать скрипт, который вы используете? Что вы пытаетесь сделать?

Ответ №1:

Из вопроса

Можно ли сохранить возвращаемое значение в ячейку и не вызывать пользовательскую функцию снова, когда значение было возвращено? Я хочу, чтобы функция вызывалась только один раз для каждой ячейки, даже если я закрою документ и снова открою его. Возвращаемое значение должно быть сохранено до тех пор, пока в ячейку не будет записано что-то еще. Это сделало бы документ my sheets намного более удобным для использования, чем текущее состояние.

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

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

Ответ №2:

Как указано Рубеном, это невозможно с пользовательской функцией.

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

 function freezeValue(e) {
  var rangeEvent = e.range;

  var col = rangeEvent.getColumnIndex();

   if (col === 2) { #Verify column of event
     var value = rangeEvent.getValue();
      
     /*Call your api*/
     result_api = CALL_API(value)

     rangeEvent.setValue(result_api);
    }
}
  

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