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ę)?

Author: Kos, 2013-06-27

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().

 64
Author: tbkn23,
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.

 28
Author: Lexi Brush,
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

Tutaj wpisz opis obrazka

 6
Author: Thaina,
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.

 3
Author: flu,
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());
}
 -1
Author: AvengingAB,
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

 -2
Author: Srik,
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