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 минуту для ее выполнения, каждую минуту обновляются все функции таблицы.
Я надеюсь, это поможет вам.