Google лист не обновляет возвращаемое значение пользовательской функции

Я очень новичок в Google Apps Script (а также в JavaScript), но я пытался повозиться с ним ради развлечения.

Я пытался написать скрипт для извлечения данных о ценах API в Google Sheets, но обнаружил, что возвращаемое значение не обновляется при повторной оценке скрипта в той же ячейке.

Ниже приведен скрипт для получения данных о ценах на биткойны из API Coinbase. Сценарий анализирует JSON-ответ на запрос, как описано здесь.

function getBTCPrice() {
  var url = "https://api.coinbase.com/v2/prices/BTC-USD/spot";
  var response = UrlFetchApp.fetch(url);

  var jsonSpotPrice = response.getContentText();
  var parseSpotPrice = JSON.parse(jsonSpotPrice);
  var price = "$" + parseSpotPrice.data.amount;

  return price
}  

Теперь, если я наберу =getBTCPrice() в какой-то камере, а затем пересмотреть несколько мгновений спустя, я получаю ту же цену; однако, если я оцениваю скрипт в другой ячейке, я получаю другой результат.

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

Любая помощь очень ценится!

4 ответа

Решение

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

Используя мой скрипт выше:

function getBTCPrice(url) {
  var response = UrlFetchApp.fetch(url);

  var jsonSpotPrice = response.getContentText();
  var parseSpotPrice = JSON.parse(jsonSpotPrice);
  var price = "$" + parseSpotPrice.data.amount;

  return price; 
}

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

function updatePrice(){
    var a = getBTCPrice("https://api.coinbase.com/v2/prices/BTC-USD/spot");
    SpreadsheetApp.getActiveSpreadsheet().getRange('A1').setValue(a);
}

Затем вы можете перейти к установке соответствующего временного триггера. И это все, что нужно сделать!

В дополнение к ответу Vikramaditya Gaonkar, вы можете использовать устанавливаемый триггер, чтобы получать результат обновления каждую минуту.

function getBTCPrice(input) {  

  url = "https://api.coinbase.com/v2/prices/BTC-USD/spot";
  response = UrlFetchApp.fetch(url);

  var jsonSpotPrice = response.getContentText();
  var parseSpotPrice = JSON.parse(jsonSpotPrice);
  var price = "$" + parseSpotPrice.data.amount;

  return price

} 

function up(){

  SpreadsheetApp.getActiveSheet().getRange('A1').setValue(Math.random());

}

Параметром функции getBTCPrice в моем случае является ячейка A1, которая рандомизируется каждую минуту. Для этого я создаю устанавливаемый триггер на функцию вверх

введите описание изображения здесь

функция, управляемая временем, минутный таймер, каждую минуту

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

Как говорит ответчик, дело в том, чтобы

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

Vik

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

function updateFormulas() {
  range = SpreadsheetApp.getActiveSpreadsheet().getDataRange();
  formulas = range.getFormulas();
  range.clear();
  SpreadsheetApp.flush();
  range.setValues(formulas);
}

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

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

Я надеюсь, это поможет вам.

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