Na tej stronie omawiamy różne sprawdzone metody programowania za pomocą skryptów Google Ads.
Selektory
Filtrowanie za pomocą selektorów
Jeśli to możliwe, używaj filtrów, aby żądać tylko tych elementów, których potrzebujesz. Wprowadzanie poprawne filtry mają następujące zalety:
- Kod jest prostszy i łatwiejszy do zrozumienia.
- Skrypt będzie się wykonywał znacznie szybciej.
Porównaj te fragmenty kodu:
Metoda kodowania | Fragment kodu |
---|---|
Filtrowanie za pomocą selektorów (zalecane) |
var keywords = AdsApp.keywords() .withCondition('Clicks > 10') .forDateRange('LAST_MONTH') .get(); while (keywords.hasNext()) { var keyword = keywords.next(); // Do work here. } |
Filtrowanie w kodzie (niezalecane) |
var keywords = AdsApp.keywords().get(); while (keywords.hasNext()) { var keyword = keywords.next(); var stats = keyword.getStatsFor( 'LAST_MONTH'); if (stats.getClicks() > 10) { // Do work here. } } |
Druga metoda nie jest zalecana, ponieważ próbuje pobrać listę wszystkich słów kluczowych na koncie, aby zastosować filtr na liście.
Unikaj przechodzenia przez hierarchię kampanii
Jeśli chcesz pobrać elementy na określonym poziomie, użyj metody kolekcji na tym poziomie zamiast przeszukiwać całą hierarchię kampanii. W jest prostszy, a dodatkowo działa też znacznie lepiej: system nie muszą niepotrzebnie czytać informacji o wszystkich kampaniach i grupach reklam.
Porównaj te fragmenty kodu, które pobierają wszystkie reklamy z Twojego konta:
Metoda kodowania | Fragment kodu |
---|---|
Użyj odpowiedniej metody gromadzenia danych (zalecane) |
var ads = AdsApp.ads(); |
Poruszaj się po hierarchii (niezalecane) |
var campaigns = AdsApp.campaigns().get(); while (campaigns.hasNext()) { var adGroups = campaigns.next(). adGroups().get(); while (adGroups.hasNext()) { var ads = adGroups.next().ads().get(); // Do your work here. } } |
Druga metoda nie jest zalecana, ponieważ próbuje pobrać całe hierarchie obiektów (kampanii, grup reklam), a wymagane są tylko reklamy.
Użyj określonych metod akcesora nadrzędnego
Czasami trzeba uzyskać nadrzędną jednostkę zwróconego obiektu. W takim przypadku zamiast pobierania całych hierarchii powinieneś użyć udostępnionej metody akcesora.
Porównaj te fragmenty kodu, które pobierają grupy reklam zawierające reklamy tekstowe, które w zeszłym miesiącu uzyskały ponad 50 kliknięć:
Metoda kodowania | Fragment kodu |
---|---|
Użyj odpowiedniej metody akcesora nadrzędnego (zalecane) |
var ads = AdsApp.ads() .withCondition('Clicks > 50') .forDateRange('LAST_MONTH') .get(); while (ads.hasNext()) { var ad = ads.next(); var adGroup = ad.getAdGroup(); var campaign = ad.getCampaign(); // Store (campaign, adGroup) to an array. } |
Przeglądanie hierarchii (niezalecane) |
var campaigns = AdsApp.campaigns().get(); while (campaigns.hasNext()) { var adGroups = campaigns.next() .adGroups() .get(); while (adGroups.hasNext()) { var ads = adGroups.ads() .withCondition('Clicks > 50') .forDateRange('LAST_MONTH') .get(); if (ads.totalNumEntities() > 0) { // Store (campaign, adGroup) to an array. } } } |
Druga metoda nie jest zalecana, ponieważ pobiera całą kampanię. i hierarchie grup reklam na koncie, a tylko część kampanie i grupy reklam powiązane z zestawem reklam. Pierwszy ogranicza się do pobierania wyłącznie odpowiednich kolekcji reklam i wykorzystuje odpowiednią metodę dostępu do jej obiektów nadrzędnych.
Korzystanie z określonych filtrów nadrzędnych
Aby uzyskać dostęp do elementów w określonej kampanii lub grupie reklam, użyj konkretnego zamiast pobierać dane i przeglądać hierarchię.
Porównaj te fragmenty kodu, które pobierają listę reklam tekstowych w określonej kampanii i grupie reklam, która w zeszłym miesiącu uzyskała ponad 50 kliknięć.
Metoda kodowania | Fragment kodu |
---|---|
Używanie odpowiednich filtrów na poziomie elementu nadrzędnego (zalecane) |
var ads = AdsApp.ads() .withCondition('CampaignName = "Campaign 1"') .withCondition('AdGroupName = "AdGroup 1"') .withCondition('Clicks > 50') .forDateRange('LAST_MONTH') .get(); while (ads.hasNext()) { var ad = ads.next(); var adGroup = ad.getAdGroup(); var campaign = ad.getCampaign(); // Store (campaign, adGroup, ad) to // an array. } |
Przeglądanie hierarchii (niezalecane) |
var campaigns = AdsApp.campaigns() .withCondition('Name = "Campaign 1"') .get(); while (campaigns.hasNext()) { var adGroups = campaigns.next() .adGroups() .withCondition('Name = "AdGroup 1"') .get(); while (adGroups.hasNext()) { var ads = adGroups.ads() .withCondition('Clicks > 50') .forDateRange('LAST_MONTH') .get(); while (ads.hasNext()) { var ad = ads.next(); // Store (campaign, adGroup, ad) to // an array. } } } |
Drugie podejście nie jest zalecane, ponieważ powtarza hierarchię kampanii i grup reklam na Twoim koncie, podczas gdy potrzebujesz tylko wybranego zestawu reklam oraz ich nadrzędnych kampanii i grup reklam. Pierwsze podejście ogranicza iteracji do listy reklam przez zastosowanie konkretnego filtra dla elementów nadrzędnych. na selektorze.
W miarę możliwości używaj identyfikatorów do filtrowania.
Podczas filtrowania według elementów lepiej jest filtrować według ich identyfikatorów niż według innych pól.
Zapoznaj się z tymi fragmentami kodu, które służą do wybierania kampanii.
Metoda kodowania | Fragment kodu |
---|---|
Filtrowanie według identyfikatora (zalecane) |
var campaign = AdsApp.campaigns() .withIds([12345]) .get() .next(); |
Filtrowanie według nazwy (mniej optymalne) |
var campaign = AdsApp.campaigns() .withCondition('Name="foo"') .get() .next(); |
Drugie podejście jest mniej optymalne, ponieważ filtrujemy według pola, które nie jest identyfikatorem.
Filtrowanie według identyfikatorów rodziców, gdy tylko jest to możliwe
Wybierając element, filtruj według identyfikatorów nadrzędnych, jeśli to możliwe. Dzięki temu zapytania będą szybsze, ponieważ ograniczy to listę elementów pobieranych przez serwery podczas filtrowania wyników.
Rozważ ten fragment kodu, który zwraca element AdGroup według jego identyfikatora. Załóżmy, że identyfikator kampanii nadrzędnej jest znany.
Metoda kodowania | Fragment kodu |
---|---|
Filtrowanie według identyfikatorów kampanii i grup reklam (zalecane) |
var adGroup = AdsApp.adGroups() .withIds([12345]) .withCondition('CampaignId="54678"') .get() .next(); |
Filtrowanie tylko według identyfikatora grupy reklam (mniej optymalne) |
var adGroup = AdsApp.adGroups() .withIds([12345]) .get() .next(); |
Mimo że oba fragmenty kodu dają identyczne wyniki, dodatkowe filtrowanie w fragmentie kodu 1 za pomocą identyfikatora rodzica (CampaignId="54678")
powoduje, że kod staje się bardziej wydajny, ponieważ ogranicza listę elementów, które serwer musi przeszukiwać podczas filtrowania wyników.
Używanie etykiet, gdy jest zbyt wiele warunków filtrowania
W przypadku zbyt wielu warunków filtrowania warto utworzyć dla przetwarzanych encji i używaj jej do filtrowania podmiotów.
Rozważ użycie tego fragmentu kodu, który pobiera listę kampanii według ich nazwy.
Metoda kodowania | Fragment kodu |
---|---|
Używanie etykiety (zalecane) |
var label = AdsApp.labels() .withCondition('Name = "My Label"') .get() .next(); var campaigns = label.campaigns.get(); while (campaigns.hasNext()) { var campaign = campaigns.next(); // Do more work } |
Tworzenie złożonych selektorów (niezalecane) |
var campaignNames = [‘foo’, ‘bar’, ‘baz’]; for (var i = 0; i < campaignNames.length; i++) { campaignNames[i] = '"' + campaignNames[i] + '"'; } var campaigns = AdsApp.campaigns .withCondition('CampaignName in [' + campaignNames.join(',') + ']') .get(); while (campaigns.hasNext()) { var campaign = campaigns.next(); // Do more work. } |
Oba fragmenty kodu zapewniają podobną skuteczność, generują zwykle bardziej złożony kod, ponieważ liczba warunków w argumencie selektor wzrośnie. Łatwiej jest też zastosować etykietę do nowego elementu. niż edytowanie skryptu, tak aby zawierał nowy element.
Ogranicz liczbę warunków w klauzuli IN
Podczas uruchamiania skryptów często korzysta się z raportów dotyczących listy obiektów. Deweloperzy zwykle osiągają to, tworząc bardzo długą kwerendę AWQL, która filtruje według identyfikatorów za pomocą klauzuli IN. To podejście działa dobrze, gdy liczba podmiotów jest ograniczona. Jednak wraz ze zmianą zapytań rośnie, wydajność skryptu pogarsza się z powodu przyczyny:
- Analiza dłuższego zapytania trwa dłużej.
- Każdy identyfikator dodany do klauzuli „IN” to dodatkowy warunek do sprawdzenia, który wymaga więcej czasu.
W takich warunkach lepiej jest zastosować etykietę do elementów, a następnie filtrować według LabelId
.
Metoda kodowania | Fragment kodu |
---|---|
Stosowanie etykiety i filtrowanie według jej identyfikatora (zalecane) |
// The label applied to the entity is "Report Entities" var label = AdsApp.labels() .withCondition('LabelName contains "Report Entities"') .get() .next(); var report = AdsApp.report('SELECT AdGroupId, Id, Clicks, ' + 'Impressions, Cost FROM KEYWORDS_PERFORMANCE_REPORT ' + 'WHERE LabelId = "' + label.getId() + '"'); |
Tworzenie długiego zapytania za pomocą klauzuli IN (niezalecane) |
var report = AdsApp.report('SELECT AdGroupId, Id, Clicks, ' + 'Impressions, Cost FROM KEYWORDS_PERFORMANCE_REPORT WHERE ' + 'AdGroupId IN (123, 456) and Id in (123,345, 456…)'); |
Informacje o koncie
Zmiany zbiorcze
Po wprowadzeniu zmian w elemencie Google Ads skrypty Google Ads nie wykonują kodu natychmiast. Zamiast tego próbuje połączyć wiele zmian w wsadów, dzięki czemu może wysłać jedno żądanie zawierające wiele zmian. Dzięki temu skrypty będą szybsze, a obciążenie serwerów Google Ads będzie mniejsze. Istnieją jednak wzorce kodu, które powodują, że skrypty Google Ads często muszą czyścić swoje zbiory operacji, co spowalnia ich działanie.
Rozważ poniższy skrypt, który aktualizuje stawki na liście słów kluczowych.
Metoda kodowania | Fragment kodu |
---|---|
Śledzenie zaktualizowanych elementów (zalecane) |
var keywords = AdsApp.keywords() .withCondition('Clicks > 50') .withCondition('CampaignName = "Campaign 1"') .withCondition('AdGroupName = "AdGroup 1"') .forDateRange('LAST_MONTH') .get(); var list = []; while (keywords.hasNext()) { var keyword = keywords.next(); keyword.bidding().setCpc(1.5); list.push(keyword); } for (var i = 0; i < list.length; i++) { var keyword = list[i]; Logger.log('%s, %s', keyword.getText(), keyword.bidding().getCpc()); } |
Pobieraj zaktualizowane elementy w ścisłą zapętlenie (niezalecane) |
var keywords = AdsApp.keywords() .withCondition('Clicks > 50') .withCondition('CampaignName = "Campaign 1"') .withCondition('AdGroupName = "AdGroup 1"') .forDateRange('LAST_MONTH') .get(); while (keywords.hasNext()) { var keyword = keywords.next(); keyword.bidding().setCpc(1.5); Logger.log('%s, %s', keyword.getText(), keyword.bidding().getCpc()); } |
Drugie podejście nie jest zalecane, ponieważ wywołanie
keyword.bidding().getCpc()
wymusza czyszczenie przez skrypty Google Ads elementu setCpc()
i wykonuj tylko jedną operację naraz. Pierwsze podejście, choć podobne do drugiego, ma tę dodatkową zaletę, że obsługuje grupowanie, ponieważ wywołanie getCpc()
jest wykonywane w osobnej pętli niż wywołanie setCpc()
.
W miarę możliwości korzystaj z monterów.
Skrypty Google Ads obsługują 2 sposoby tworzenia nowych obiektów: kreatory i tworzenie . Budowniki są bardziej elastyczne niż metody tworzenia, ponieważ dają dostęp do obiektu utworzonego na podstawie wywołania interfejsu API.
Weźmy pod uwagę te fragmenty kodu:
Metoda kodowania | Fragment kodu |
---|---|
Używanie narzędzi do tworzenia (zalecane) |
var operation = adGroup.newKeywordBuilder() .withText('shoes') .build(); var keyword = operation.getResult(); |
Używanie metod tworzenia (niezalecane) |
adGroup.createKeyword('shoes'); var keyword = adGroup.keywords() .withCondition('KeywordText="shoes"') .get() .next(); |
Druga opcja nie jest preferowana ze względu na dodatkową operację wyboru pobierania słowa kluczowego. Dodatkowo metody tworzenia wycofane.
Pamiętaj jednak, że nieprawidłowe użycie kreatorów może uniemożliwić Google Grupowanie skryptów reklam w operacje.
Rozważmy te fragmenty kodu, które tworzą listę słów kluczowych: i wyświetla identyfikatory nowo utworzonych słów kluczowych:
Metoda kodowania | Fragment kodu |
---|---|
Śledzenie zaktualizowanych elementów (zalecane) |
var keywords = [‘foo’, ‘bar’, ‘baz’]; var list = []; for (var i = 0; i < keywords.length; i++) { var operation = adGroup.newKeywordBuilder() .withText(keywords[i]) .build(); list.push(operation); } for (var i = 0; i < list.length; i++) { var operation = list[i]; var result = operation.getResult(); Logger.log('%s %s', result.getId(), result.getText()); } |
Pobieraj zaktualizowane elementy w ścisłą zapętlenie (niezalecane) |
var keywords = [‘foo’, ‘bar’, ‘baz’]; for (var i = 0; i < keywords.length; i++) { var operation = adGroup.newKeywordBuilder() .withText(keywords[i]) .build(); var result = operation.getResult(); Logger.log('%s %s', result.getId(), result.getText()); } |
Drugie podejście nie jest zalecane, ponieważ wywołuje funkcję operation.getResult()
w ramach tej samej pętli, która tworzy operację, co powoduje, że skrypty Google Ads wykonują po jednej operacji naraz. Pierwsza, choć jest podobna, pozwala
wsadowe, ponieważ wywołujemy funkcję Operations.getResult() w innej pętli niż tam,
jego utworzenie.
Rozważ użycie przesyłania zbiorczego w przypadku dużych aktualizacji
Deweloperzy często uruchamiają raporty i aktualizują właściwości entyfikacji (np. stawki za słowo kluczowe) na podstawie bieżących wartości skuteczności. Kiedy
musisz zaktualizować dużą liczbę elementów, przesyłanie zbiorcze zwykle da Ci
jest większa skuteczność. Rozważmy na przykład następujące skrypty, które zwiększają
maks. CPC słów kluczowych, których TopImpressionPercentage > 0.4
w ostatnim miesiącu:
Metoda kodowania | Fragment kodu |
---|---|
Użyj przesyłania zbiorczego (zalecane) |
var report = AdsApp.report( 'SELECT AdGroupId, Id, CpcBid FROM KEYWORDS_PERFORMANCE_REPORT ' + 'WHERE TopImpressionPercentage > 0.4 DURING LAST_MONTH'); var upload = AdsApp.bulkUploads().newCsvUpload([ report.getColumnHeader('AdGroupId').getBulkUploadColumnName(), report.getColumnHeader('Id').getBulkUploadColumnName(), report.getColumnHeader('CpcBid').getBulkUploadColumnName()]); upload.forCampaignManagement(); var reportRows = report.rows(); while (reportRows.hasNext()) { var row = reportRows.next(); row['CpcBid'] = row['CpcBid'] + 0.02; upload.append(row.formatForUpload()); } upload.apply(); |
Wybieranie i aktualizowanie słów kluczowych według identyfikatora (mniej optymalne) |
var reportRows = AdsApp.report('SELECT AdGroupId, Id, CpcBid FROM ' + 'KEYWORDS_PERFORMANCE_REPORT WHERE TopImpressionPercentage > 0.4 ' + ' DURING LAST_MONTH') .rows(); var map = { }; while (reportRows.hasNext()) { var row = reportRows.next(); var adGroupId = row['AdGroupId']; var id = row['Id']; if (map[adGroupId] == null) { map[adGroupId] = []; } map[adGroupId].push([adGroupId, id]); } for (var key in map) { var keywords = AdsApp.keywords() .withCondition('AdGroupId="' + key + '"') .withIds(map[key]) .get(); while (keywords.hasNext()) { var keyword = keywords.next(); keyword.bidding().setCpc(keyword.bidding().getCpc() + 0.02); } } |
Druga metoda zapewnia dobre wyniki, jest preferowane w tym przypadku, ponieważ
Skrypty Google Ads mają ograniczoną liczbę obiektów, które można pobrać lub aktualizowane w jednym uruchomieniu, a operacje wybierania i aktualizowania w aby osiągnąć ten limit.
W przypadku przesyłania zbiorczego obowiązują wyższe limity zarówno pod względem liczby jednostek, które można zaktualizować, jak i ogólnego czasu wykonania.
Grupowanie zbiorczych przesyłań według kampanii
Podczas tworzenia przesyłania zbiorczego staraj się grupować operacje według kampanii nadrzędnej. Zwiększa to wydajność i zmniejsza ryzyko wystąpienia konfliktu zmian lub błędów współbieżności.
Rozważ 2 zadania przesyłania zbiorczego wykonywane równolegle. Wstrzymanie wyświetlania reklam w reklamie group; a drugi dostosowuje stawki za słowa kluczowe. Mimo że operacje nie są powiązane, mogą dotyczyć elementów w ramach tej samej grupy reklam (lub 2 różnych grup reklam w ramach tej samej kampanii). W takim przypadku system zablokuje element nadrzędny (wspólna grupa reklam lub kampania), co spowoduje blokowanie się zadań przesyłania zbiorczego.
Skrypty Google Ads mogą zoptymalizować wykonanie w ramach jednego zadania przesyłania zbiorczego, Najprostsze rozwiązanie to uruchomienie tylko jednego zadania przesyłania zbiorczego na każde konto za jednym razem. Jeśli zdecydujesz się na przeprowadzenie na koncie więcej niż 1 przesyłania zbiorczego, pamiętaj, aby przesyłane zbiorczo kampanie (i ich elementy podrzędne) były ze sobą niepokrywające się, aby zapewnić optymalną skuteczność.
Raportowanie
Pobieranie statystyk za pomocą raportów
Aby pobrać dużą liczbę elementów i ich statystyki, często lepiej korzystać z raportów niż standardowych metod AdsApp. Zastosowanie jest preferowana z następujących powodów:
- Raporty zapewniają lepszą wydajność w przypadku dużych zapytań.
- Raporty nie będą wyczerpywać normalnych limitów pobierania.
Porównaj te fragmenty kodu, które pobierają dane o kliknięciach, wyświetleniach, Koszt i tekst wszystkich słów kluczowych, które w zeszłym miesiącu uzyskały ponad 50 kliknięć:
Metoda kodowania | Fragment kodu |
---|---|
Korzystanie z raportów (zalecane) |
report = AdsApp.search( 'SELECT ' + ' ad_group_criterion.keyword.text, ' + ' metrics.clicks, ' + ' metrics.cost_micros, ' + ' metrics.impressions ' + 'FROM ' + ' keyword_view ' + 'WHERE ' + ' segments.date DURING LAST_MONTH ' + ' AND metrics.clicks > 50'); while (report.hasNext()) { var row = report.next(); Logger.log('Keyword: %s Impressions: %s ' + 'Clicks: %s Cost: %s', row.adGroupCriterion.keyword.text, row.metrics.impressions, row.metrics.clicks, row.metrics.cost); } |
Użyj iteratorów AdsApp (niezalecane) |
var keywords = AdsApp.keywords() .withCondition('metrics.clicks > 50') .forDateRange('LAST_MONTH') .get(); while (keywords.hasNext()) { var keyword = keywords.next(); var stats = keyword.getStatsFor('LAST_MONTH'); Logger.log('Keyword: %s Impressions: %s ' + 'Clicks: %s Cost: %s', keyword.getText(), stats.getImpressions(), stats.getClicks(), stats.getCost()); } |
Druga metoda nie jest preferowana, ponieważ oznacza iterację nad słowami kluczowymi
i pobiera statystyki pojedynczo. Raporty mają większą skuteczność w tej
ponieważ pobiera wszystkie dane w ramach jednego wywołania i przesyła je strumieniowo jako
W drugim podejściu słowa kluczowe pobierane
są wliczane do limitu skryptu dla liczby encji pobieranych za pomocą
połączenie z firmą get()
.
Używanie wyszukiwania zamiast raportu
Metoda raportowania została stworzona dla starej infrastruktury i zwróci wyniki mają prosty format, nawet jeśli używasz GAQL. Oznacza to, że musi przekształcić wyniki zapytania, aby pasowały do starego stylu, który nie jest obsługiwany w przypadku wszystkich pól i zwiększa obciążenie każdego wywołania.
Zalecamy korzystanie z wyszukiwarki, aby korzystać ze wszystkich funkcji nowe raportowanie w interfejsie Google Ads API.
Preferuj GAQL zamiast AWQL
Mimo że zapytania dotyczące raportów i wywołania withCondition
nadal obsługują język AWQL, jest on tłumaczony przez warstwę tłumaczenia, która nie jest w pełni zgodna z prawdziwym językiem AWQL. Aby mieć pełną kontrolę nad zapytaniami, upewnij się, że
przy użyciu GAQL.
Jeśli masz zapytania AWQL, które chcesz przetłumaczyć, możesz skorzystać z zapytania narzędzie do migracji.
Nie wybieraj większej liczby wierszy niż potrzebujesz
Szybkość generowania raportów (i selektorów) zależy od łącznej liczby wierszy zwracanych przez raport, niezależnie od tego, czy je iteracji. Oznacza to, że zawsze należy używać określonych filtrów, aby jak najbardziej ograniczyć zestaw wyników, tak aby pasował do przypadku użycia.
Załóżmy, że chcesz znaleźć grupy reklam ze stawkami spoza określonego zakresu. Szybciej będzie wykonać 2 osobne zapytania, jedno dotyczące stawek poniżej dolnego progu, a drugie powyżej górnego progu, niż pobrać wszystkie grupy reklam i zignorować te, które Cię nie interesują.
Metoda kodowania | Fragment kodu |
---|---|
Użyj 2 zapytań (zalecane) |
var adGroups = [] var report = AdsApp.search( 'SELECT ad_group.name, ad_group.cpc_bid_micros' + ' FROM ad_group WHERE ad_group.cpc_bid_micros < 1000000'); while (report.hasNext()) { var row = report.next(); adGroups.push(row.adGroup); } var report = AdsApp.search( 'SELECT ad_group.name, ad_group.cpc_bid_micros' + ' FROM ad_group WHERE ad_group.cpc_bid_micros > 2000000'); while (report.hasNext()) { var row = report.next(); adGroups.push(row.adGroup); } |
Odfiltruj ogólne zapytanie (niezalecane) |
var adGroups = [] var report = AdsApp.search( 'SELECT ad_group.name, ad_group.cpc_bid_micros' + ' FROM ad_group'); while (report.hasNext()) { var row = report.next(); var cpcBidMicros = row.adGroup.cpcBidMicros; if (cpcBidMicros < 1000000 || cpcBidMicros > 2000000) { adGroups.push(row.adGroup); } } |
Skrypty Ad Managera (MCK)
Preferuj metodę generateInParallel nad wykonywaniem szeregowym
Tworząc skrypty dla kont menedżera, używaj zamiast tego executeInParallel()
uruchomienia szeregowego, jeśli jest to możliwe. executeInParallel()
zapewnia skryptowi więcej czasu na przetwarzanie (do 1 godziny) i do 30 minut na przetwarzanie każdego konta (zamiast 30 minut łącznie w przypadku wykonywania sekwencyjnego). Więcej informacji znajdziesz na stronie z limitami.
Arkusze kalkulacyjne
Używanie operacji zbiorczych podczas aktualizowania arkuszy kalkulacyjnych
Podczas aktualizowania arkuszy kalkulacyjnych staraj się używać metod operacji zbiorczej (np. getRange()
) zamiast metod, które aktualizują po jednej komórce naraz.
Przyjrzyjmy się temu fragmentowi kodu, który generuje wzór ułamkowy w arkusz kalkulacyjny.
Metoda kodowania | Fragment kodu |
---|---|
Zmienianie zakresu komórek w pojedynczym wywołaniu (zalecane) |
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] = getColor_(xcoord, ycoord); xcoord += xincrement; } ycoord -= yincrement; } sheet.getRange(1, 1, 100, 100).setBackgroundColors(colors); |
Aktualizowanie po jednej komórce naraz (niezalecane) |
var cell = sheet.getRange('a1'); for (var y = 0; y < 100; y++) { xcoord = xmin; for (var x = 0; x < 100; x++) { var c = getColor_(xcoord, ycoord); cell.offset(y, x).setBackgroundColor(c); xcoord += xincrement; } ycoord -= yincrement; SpreadsheetApp.flush(); } |
Arkusze kalkulacyjne Google próbują zoptymalizować drugi fragment kodu przez buforowanie nadal daje słabą skuteczność w porównaniu z pierwszym fragmentem, do liczby wywołań interfejsu API.