Odśwież dane pobrane przez niestandardową funkcję w arkuszu Google
Napisałem Niestandardowy skrypt Google Apps, który otrzyma {[0] } i pobierze informacje z usługi internetowej (Cena).
Używam tego skryptu w arkuszu kalkulacyjnym i działa dobrze. Mój problem polega na tym, że te Ceny się zmieniają, a mój arkusz kalkulacyjny nie jest aktualizowany.
Jak zmusić go do ponownego uruchomienia skryptu i aktualizacji komórek (bez ręcznego przechodzenia przez każdą komórkę)?
6 answers
Ok, wydaje mi się, że moim problemem było to, że google zachowuje się w dziwny sposób - nie uruchamia ponownie skryptu, o ile parametry skryptu są podobne, używa buforowanych wyników z poprzednich uruchomień. Dlatego nie łączy się ponownie z API i nie pobiera ponownie ceny, po prostu zwraca poprzedni wynik skryptu, który został zbuforowany.
Zobacz więcej informacji tutaj: https://code.google.com/p/google-apps-script-issues/issues/detail?id=888
I tutaj: skrypt podsumowujący dane brak aktualizacji
Moim rozwiązaniem było dodanie kolejnego parametru do skryptu, którego nawet nie używam. Teraz, gdy wywołasz funkcję z parametrem innym niż poprzednie wywołania, będzie ona musiała ponownie uruchomić skrypt, ponieważ wynik dla tych parametrów nie będzie w pamięci podręcznej.
Więc ilekroć wywołuję funkcję, dla dodatkowego parametru przekazuję "$a$1". Utworzyłem również element menu o nazwie refresh, a kiedy go uruchamiam, umieszcza bieżącą datę i godzinę w A1, stąd wszystkie wywołania skryptu z $a$1 jako drugim parametrem będą musiały przeliczać. Oto kod z mojego skryptu:
function onOpen() {
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var entries = [{
name : "Refresh",
functionName : "refreshLastUpdate"
}];
sheet.addMenu("Refresh", entries);
};
function refreshLastUpdate() {
SpreadsheetApp.getActiveSpreadsheet().getRange('A1').setValue(new Date().toTimeString());
}
function getPrice(itemId, datetime) {
var headers =
{
"method" : "get",
"contentType" : "application/json",
headers : {'Cache-Control' : 'max-age=0'}
};
var jsonResponse = UrlFetchApp.fetch("http://someURL?item_id=" + itemId, headers);
var jsonObj = eval( '(' + jsonResponse + ')' );
return jsonObj.Price;
SpreadsheetApp.flush();
}
A gdy chcę umieścić cenę przedmiotu o ID 5 w komórce, używam następującego wzoru:
=getPrice(5, $A$1)
Kiedy chcę odświeżyć ceny, po prostu klikam w menu" Odśwież" - > "odśwież".
Pamiętaj, że musisz przeładować arkusz kalkulacyjny po zmianie skryptu onOpen()
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:44
Wiem, że to trochę stare pytanie. Ale ta metoda nie wymaga żadnych działań użytkownika poza dokonaniem zmiany.
To co zrobiłem było podobne do tbkn23.Funkcja, którą chcę ponownie ocenić, ma dodatkowy nieużywany parametr, $a$1. Więc wywołanie funkcji to
=myFunction(firstParam, $A$1)
Ale w kodzie sygnatura funkcji to
function myFunction(firstParam)
Zamiast funkcji odświeżania użyłem funkcji onEdit (e) takiej jak Ta
function onEdit(e)
{
SpreadsheetApp.getActiveSheet().getRange('A1').setValue(Math.random());
}
Ta funkcja jest wyzwalana, gdy dowolna komórka w arkusz kalkulacyjny jest edytowany. Więc teraz edytujesz komórkę, losowa liczba jest umieszczana w A1, to odświeża listę parametrów, jak sugerował tbkn23, powodując ponowną ocenę funkcji niestandardowej.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-26 11:10:52
Jest bardzo późno i nie wiem, czy to by się przydało, ale w rzeczywistości są tu ustawienia, które możesz wykonać NOW()
automatycznie Uaktualnij
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-15 07:50:23
Jeśli funkcja niestandardowa znajduje się w określonej kolumnie, po prostu zamów arkusz kalkulacyjny według tej kolumny.
Kolejność wymusza odświeżenie danych, które wywołuje funkcję niestandardową dla wszystkich wierszy tej kolumny na raz.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-21 20:06:47
To może być bardzo stary wątek, ale może być przydatny dla kogoś, kto próbuje to zrobić, tak jak ja przed chwilą.
Praca ze skryptem Lexi w takim stanie, w jakim jest, wydaje się, że nie działa już z bieżącymi arkuszami, ale jeśli dodam zmienną fałszywą do mojej funkcji jako parametr (nie trzeba jej używać wewnątrz funkcji), to rzeczywiście zmusi Arkusze google do ponownego odświeżenia strony.
Tak więc, deklaracja w stylu: function mojafunkcja (firstParam,dummy) i wywołanie jej byłoby takie, jak było sugerowane. To mi pomogło.
Ponadto, jeśli jest uciążliwe, aby zmienna losowa pojawiła się na wszystkich edytowanych arkuszach, łatwym rozwiązaniem jest ograniczenie do jednego arkusza:
function onEdit(e)
{
e.source.getSheetByName('THESHEETNAME').getRange('J1').setValue(Math.random());
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-08 06:16:07
Jeśli napisałeś niestandardową funkcję i użyłeś jej w arkuszu kalkulacyjnym jako formuły, to za każdym razem, gdy otworzysz arkusz kalkulacyjny lub dowolna komórka odniesienia jest modyfikowana, formuła jest przeliczana.
Jeśli chcesz po prostu gapić się na arkusz kalkulacyjny i chcesz, aby jego wartości się zmieniły, rozważ dodanie wyzwalacza czasowego, który zaktualizuje komórki. Więcej o wyzwalaczach TUTAJ
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-27 11:31:54