Sprawdzone metody

W tym dokumencie znajdziesz sprawdzone metody, które pomogą Ci zwiększyć skuteczność skryptów.

Minimalizowanie wywołań innych usług

Używanie operacji JavaScriptu w skrypcie jest szybsze niż wywoływanie innych usług. Wszystko, co robisz w Google Apps Script, jest szybsze niż pobieranie danych z serwerów Google lub serwera zewnętrznego, np. żądania do Arkuszy, Dokumentów, Witryn, Tłumacza i UrlFetch. Skrypty będą działać szybciej, jeśli zminimalizujesz liczbę wywołań usług.

Współpraca na dyskach współdzielonych

Jeśli pracujesz nad projektem skryptu z innymi programistami, współpracuj z nimi za pomocą dysków współdzielonych. Pliki na dysku współdzielonym należą do grupy, a nie do poszczególnych użytkowników, co ułatwia tworzenie projektów i zarządzanie nimi.

Korzystanie z operacji wsadowych

Skrypty zwykle odczytują dane z arkusza kalkulacyjnego, wykonują obliczenia i zapisują wyniki z powrotem. Apps Script korzysta z wbudowanej optymalizacji, takiej jak wyprzedzanie i buforowanie zapisu.

Maksymalizuj wbudowane buforowanie, minimalizując odczyty i zapisy. Naprzemienne polecenia odczytu i zapisu działają wolno. Aby przyspieszyć działanie skryptu, odczytaj wszystkie dane do tablicy za pomocą jednego polecenia, wykonaj operacje na danych tablicy i zapisz dane za pomocą jednego polecenia.

Unikaj naprzemiennego odczytu i zapisu, jak w tym nieefektywnym przykładzie:

// DO NOT USE THIS CODE. It is an example of SLOW, INEFFICIENT code.
// FOR DEMONSTRATION ONLY
var cell = sheet.getRange('a1');
for (var y = 0; y < 100; y++) {
  xcoord = xmin;
  for (var x = 0; x < 100; x++) {
    var c = getColorFromCoordinates(xcoord, ycoord);
    cell.offset(y, x).setBackgroundColor(c);
    xcoord += xincrement;
  }
  ycoord -= yincrement;
  SpreadsheetApp.flush();
}

Skrypt jest nieefektywny,ponieważ wykonuje pętlę po 10 000 komórek z kolejnymi zapisami. Pamięć podręczna zapisu zwrotnego pomaga, ale grupowanie wywołań jest znacznie bardziej wydajne:

// OKAY TO USE THIS EXAMPLE or code based on it.
var cell = sheet.getRange('a1');
var colors = new Array(100);
for (var y = 0; y < 100; y++) {
  xcoord = xmin;
  colors[y] = new Array(100);
  for (var x = 0; x < 100; x++) {
    colors[y][x] = getColorFromCoordinates(xcoord, ycoord);
    xcoord += xincrement;
  }
  ycoord -= yincrement;
}
sheet.getRange(1, 1, 100, 100).setBackgrounds(colors);

Uruchomienie nieefektywnego kodu zajmuje około 70 sekund, a efektywnego – tylko 1 sekundę.

Unikaj bibliotek w skryptach z dużą liczbą elementów interfejsu

Biblioteki są wygodne do ponownego wykorzystywania kodu, ale wydłużają czas uruchamiania skryptu. To opóźnienie jest zauważalne w interfejsach użytkownika usługi HTML po stronie klienta, które wykonują powtarzające się, krótkotrwałe wywołania google.script.run. W dodatkach używaj bibliotek oszczędnie, a w skryptach, które wykonują wiele wywołań google.script.run, unikaj ich.

Korzystanie z usługi pamięci podręcznej

Użyj usługi pamięci podręcznej, aby przechowywać w pamięci podręcznej zasoby między wykonaniami skryptu. Buforowanie zmniejsza częstotliwość pobierania danych. W tym przykładzie pokazujemy, jak za pomocą usługi Cache przyspieszyć dostęp do wolnego kanału RSS.

function getRssFeed() {
  var cache = CacheService.getScriptCache();
  var cached = cache.get("rss-feed-contents");
  if (cached != null) {
    return cached;
  }
  // This fetch takes 20 seconds:
  var result = UrlFetchApp.fetch("http://example.com/my-slow-rss-feed.xml");
  var contents = result.getContentText();
  cache.put("rss-feed-contents", contents, 1500); // cache for 25 minutes
  return contents;
}

Jeśli elementu nie ma w pamięci podręcznej, nadal musisz poczekać 20 sekund, ale kolejne dostępy są szybkie, dopóki element nie wygaśnie.

Duże zbiory danych i złożone obliczenia

Arkusze Google to potężne narzędzie, ale w miarę powiększania się zbiorów danych i zwiększania złożoności obliczeń mogą wystąpić problemy z wydajnością, takie jak opóźnienia w arkuszu kalkulacyjnym, IMPORTRANGE błędy i przekroczenia limitu czasu skryptu.

Kiedy używać bazy danych

Jeśli arkusz kalkulacyjny zbliża się do limitu 10 milionów komórek lub masz wiele połączonych formularzy (np. 10 lub więcej) i złożonych formuł między arkuszami, rozważ użycie specjalnego rozwiązania bazodanowego.

  • Google Cloud SQL: w pełni zarządzana usługa relacyjnej bazy danych dla MySQL, PostgreSQL i SQL Server. Użyj usługi JDBC, aby połączyć się z Cloud SQL lub innymi zewnętrznymi bazami danych, takimi jak Oracle czy MongoDB (za pomocą odpowiednich pomostów).
  • BigQuery bezserwerowa, wysoce skalowalna hurtownia danych. Za pomocą połączonych arkuszy możesz analizować duże zbiory danych BigQuery bezpośrednio w Arkuszach, a za pomocą usługi BigQuery możesz wchodzić w interakcje z danymi z Apps Script.

Optymalizacja wydajności formuł

Intensywne korzystanie z niektórych formuł może spowolnić działanie arkusza kalkulacyjnego:

  • ARRAYFORMULA chociaż jest przydatna, obliczenia na dużą skalę ARRAYFORMULA mogą być kosztowne.
  • WYSZUKAJ.PIONOWO i PRZESUNIĘCIE: te funkcje mogą działać wolno w przypadku dużych zbiorów danych. Rozważ użycie funkcji INDEX i MATCH lub języka Apps Script, aby wydajniej wyszukiwać dane w pamięci.
  • IMPORTRANGE: częste używanie funkcji IMPORTRANGE w wielu arkuszach może prowadzić do „błędów wewnętrznych”, jeśli arkusze źródłowe są duże lub mocno obciążone. Pomocne może być skonsolidowanie danych w centralnym źródle.

Obsługa czasu oczekiwania skryptu

Apps Script ma limity czasu wykonywania (zwykle 6 minut na wykonanie lub 30 minut w przypadku niektórych kont Google Workspace). Jeśli skrypt często ulega awarii z powodu przekroczenia limitu wykonania:

  1. Używaj operacji wsadowych: jak wspomnieliśmy w sekcji Używaj operacji wsadowych, ograniczaj wywołania arkuszy kalkulacyjnych i innych usług.
  2. Podziel zadania: podziel duże zadania na mniejsze części, które można wykonać w określonym czasie.
  3. Używaj wyzwalaczy do kontynuacji: skonfiguruj wyzwalacz czasowy z możliwością zainstalowania, aby wznowić długotrwały proces. Skrypt może przechowywać swój bieżący stan (np. indeks ostatniego przetworzonego wiersza) za pomocą usługi Properties i kontynuować działanie od tego miejsca podczas następnego wykonania.