Sprawdzone metody

Na tej stronie opisujemy różne sprawdzone metody tworzenia skryptów Google Ads.

Selektory

Filtruj z selektorami

W miarę możliwości używaj filtrów, aby wysyłać żądania tylko tych elementów, których potrzebujesz. Stosowanie odpowiednich filtrów przynosi takie korzyści:

  • Kod jest prostszy i łatwiejszy do zrozumienia.
  • Skrypt zostanie wykonany 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.
}
Filtruj 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.
  }
}

Drugie podejście nie jest zalecane, ponieważ powoduje próbę pobrania listy wszystkich słów kluczowych na koncie w celu zastosowania do niej filtru.

Unikaj przemierzania hierarchii kampanii

Jeśli chcesz pobrać elementy na określonym poziomie, zamiast przemierzać całą hierarchię kampanii, użyj metody zbierania danych na tym poziomie. Prostsza obsługa będzie też dużo lepsza: system nie będzie musiał czytać niepotrzebnie we wszystkich kampaniach i grupach reklam.

Porównaj te fragmenty kodu, które pobierają wszystkie reklamy na Twoim koncie:

Metoda kodowania Fragment kodu
Stosuj odpowiednią metodę zbierania danych (zalecane)

var ads = AdsApp.ads();

Przechodzenie między hierarchią (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.
  }
}

Drugi sposób nie jest zalecany, ponieważ próbuje pobrać całe hierarchie obiektów (kampanii, grup reklam), a wymagane są tylko reklamy.

Używanie określonych metod akcesora nadrzędnego

Czasami trzeba uzyskać encję nadrzędną pobranego obiektu. W takim przypadku należy użyć podanej metody akcesora zamiast pobierania całych hierarchii.

Porównaj te fragmenty kodu, które pozyskują grupy reklam zawierające reklamy tekstowe, które w zeszłym miesiącu uzyskały ponad 50 kliknięć:

Metoda kodowania Fragment kodu
Używanie odpowiedniej metody dostępu rodzica (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.
}
Przełączanie się po 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.
    }
  }
}

Drugi sposób nie jest zalecany, ponieważ pobiera całą hierarchię kampanii i grup reklam na koncie, podczas gdy potrzebujesz tylko podzbioru kampanii i grup reklam powiązanych z Twoim zbiorem reklam. Pierwsza metoda ogranicza pobieranie tylko odpowiednich kolekcji reklam i stosuje odpowiednią metodę uzyskiwania dostępu do obiektów nadrzędnych.

Użyj określonych filtrów nadrzędnych

Aby uzyskać dostęp do elementów w ramach konkretnej kampanii lub grupy reklam, użyj określonego filtra w selektorze, zamiast pobierać i poruszać się po hierarchii.

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.
}
Przełączanie się po 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.
    }
  }
}

Drugi sposób nie jest zalecany, ponieważ wykorzystuje hierarchię kampanii i grup reklam na koncie, natomiast potrzebujesz tylko wybranego zestawu reklam oraz ich nadrzędnych kampanii i grup reklam. Pierwsza metoda ogranicza iterację do listy reklam przez zastosowanie określonego filtra dla elementów nadrzędnych w selektorze.

Jeśli to możliwe, używaj identyfikatorów do filtrowania

Podczas filtrowania jednostek lepiej jest filtrować jednostki według ich identyfikatorów zamiast według innych pól.

Rozważ użycie tych fragmentów kodu, aby wybrać kampanię.

Metoda kodowania Fragment kodu
Filtrowanie według identyfikatora (zalecane)
var campaign = AdsApp.campaigns()
    .withIds([12345])
    .get()
    .next();
Filtrowanie według nazwy (mniej optymalnego)
var campaign = AdsApp.campaigns()
    .withCondition('Name="foo"')
    .get()
    .next();

Drugie podejście jest mniej optymalne, ponieważ filtrujemy według pola innego niż identyfikator.

Jeśli to możliwe, filtruj według identyfikatorów rodzicielskich.

Wybierając element, w miarę możliwości odfiltruj według identyfikatorów elementów nadrzędnych. Przyspieszy to wykonywanie zapytań, ponieważ ograniczy listę jednostek pobieranych przez serwery podczas filtrowania wyników.

Rozważmy ten fragment kodu, który pobiera grupę reklam według jej 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 według samego identyfikatora grupy reklam (mniej optymalne)
var adGroup = AdsApp.adGroups()
    .withIds([12345])
    .get()
    .next();

Mimo że oba fragmenty kodu dają identyczne wyniki, dodatkowe filtrowanie we fragmencie kodu 1 z wykorzystaniem identyfikatora nadrzędnego (CampaignId="54678") zwiększa jego efektywność poprzez ograniczenie listy encji, które serwer musi powtarzać podczas filtrowania wyników.

Używaj etykiet, gdy jest zbyt wiele warunków filtrowania

Gdy masz zbyt wiele warunków filtrowania, warto utworzyć etykiety dla przetwarzanych encji i używać jej do filtrowania jednostek.

Przyjrzyjmy się temu fragmentowi kodu, który pobiera listę kampanii według nazwy.

Metoda kodowania Fragment kodu
Użyj 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ść, ale druga metoda generuje bardziej złożony kod w miarę zwiększania liczby warunków w selektorze. Łatwiejsze jest też zastosowanie etykiety do nowego elementu niż edytowanie skryptu w celu dodania nowego elementu.

Ogranicz liczbę warunków w klauzuli IN

Częstym przypadkiem użycia skryptów w przypadku uruchamiania skryptów jest wygenerowanie raportu dla listy elementów. Aby to osiągnąć, programiści zwykle tworzą bardzo długie zapytanie AWQL, które filtruje identyfikatory jednostek za pomocą klauzuli IN. Ta metoda sprawdza się, gdy liczba elementów jest ograniczona. Jednak gdy długość zapytania się wydłuża, wydajność skryptu spada z 2 powodów:

  • Analiza dłuższego zapytania trwa dłużej.
  • Każdy identyfikator dodany do klauzuli IN to dodatkowy warunek do oceny i dlatego trwa to dłużej.

W takich warunkach najlepiej zastosować do elementów etykietę, a potem filtrować dane według parametru LabelId.

Metoda kodowania Fragment kodu
Stosowanie etykiety i filtrowanie według identyfikatora labelID (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 z użyciem 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 uruchamiają ich od razu. Próbuje połączyć wiele zmian w grupy, aby wysłać jedno żądanie zawierające wiele zmian. Takie podejście przyspiesza tworzenie skryptów i zmniejsza obciążenie serwerów Google Ads. Istnieją jednak pewne wzorce kodu, które wymuszają częste opróżnianie grupy operacji przez skrypty Google Ads, co powoduje powolne działanie skryptu.

Rozważmy ten skrypt, który aktualizuje stawki za listę 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());
}
Pobieranie zaktualizowanych elementów w ścisłej pętli (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 na skryptach Google Ads opróżnienie operacji setCpc() i wykonywanie tylko jednej operacji naraz. Pierwsze podejście, podobnie jak drugie, ma dodatkową zaletę w postaci obsługi grupowania, ponieważ wywołanie getCpc() odbywa się w innej pętli niż ta, w której wywoływana jest metoda setCpc().

Gdy to możliwe, używaj konstruktorów

Skrypty Google Ads obsługują 2 sposoby tworzenia nowych obiektów – narzędzia do tworzenia i metody tworzenia. Konstruktorzy są bardziej elastyczne niż metody tworzenia, ponieważ dają dostęp do obiektu tworzonego w wywołaniu interfejsu API.

Weź pod uwagę te fragmenty kodu:

Metoda kodowania Fragment kodu
Używanie kreatorów (zalecane)
var operation = adGroup.newKeywordBuilder()
    .withText('shoes')
    .build();
var keyword = operation.getResult();
Użyj metod tworzenia (niezalecane)
adGroup.createKeyword('shoes');
var keyword = adGroup.keywords()
    .withCondition('KeywordText="shoes"')
    .get()
    .next();

Drugie podejście nie jest preferowane ze względu na dodatkową operację wyboru związaną z pobieraniem słowa kluczowego. Ponadto wycofywane są metody tworzenia.

Pamiętaj jednak, że nieprawidłowo używane kreatory mogą uniemożliwić skryptom Google Ads grupowanie operacji.

Rozważmy podane niżej fragmenty kodu, które tworzą listę słów kluczowych i wyświetlają 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());
}
Pobieranie zaktualizowanych elementów w ścisłej pętli (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 preferowane, ponieważ wywołuje funkcję operation.getResult() w tej samej pętli, która tworzy operację, co wymusza wykonywanie przez skrypty Google Ads tylko jednej operacji naraz. Pierwsza metoda, choć podobna, umożliwia grupowanie, ponieważ wywołuje funkcję Operations.getResult() w innej pętli niż ta, w której została utworzona.

Rozważ użycie przesyłania zbiorczego w przypadku dużych aktualizacji

Deweloperzy często uruchamiają raporty i aktualizują ich właściwości (np. stawki za słowa kluczowe) na podstawie aktualnych wartości skuteczności. Jeśli musisz zaktualizować wiele elementów, przesyłanie zbiorcze zazwyczaj zapewnia Ci większą skuteczność. Przyjrzyjmy się np. poniższym skryptom, które zwiększają maks. CPC słów kluczowych, których wartość w kolumnie „TopImpressionPercentage > 0.4” za ostatni miesiąc wynosiła:

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 całkiem dobrą skuteczność, ale w tym przypadku preferowana jest pierwsza,

  • W skryptach Google Ads obowiązuje limit liczby obiektów, które można pobrać lub zaktualizować podczas jednego uruchomienia, a operacje wyboru i aktualizacji w drugim podejściu wliczają się do tego limitu.

  • Przesyłanie zbiorcze ma wyższe limity, zarówno pod względem liczby elementów, które można aktualizować, jak i ogólnego czasu wykonywania.

Grupowanie plików przesyłania zbiorczego według kampanii

Podczas tworzenia przesyłania zbiorczego spróbuj pogrupować działania według kampanii nadrzędnej. Zwiększa to wydajność oraz zmniejsza ryzyko wystąpienia sprzecznych zmian lub błędów równoczesności.

Rozważ 2 równoległe zadania przesyłania zbiorczego. Jeden wstrzymuje wyświetlanie reklam w grupie reklam, a drugi dostosowuje stawki za słowa kluczowe. Mimo że operacje te są ze sobą niezwiązane, mogą dotyczyć podmiotów w tej samej grupie reklam (lub dwóch różnych grup reklam w tej samej kampanii). W takim przypadku system zablokuje element nadrzędny (udostępnioną grupę reklam lub kampanię), co spowoduje, że zadania przesyłania zbiorczego będą się blokować.

Skrypty Google Ads mogą optymalizować realizację wyświetleń w ramach jednego zadania przesyłania zbiorczego, więc najprostszym sposobem jest uruchomienie w danym momencie tylko jednego takiego zadania na konto. Jeśli zdecydujesz się na korzystanie z więcej niż jednego przesyłania zbiorczego na konto, upewnij się, że działa ono na wzajemnie wykluczających się listach kampanii (i ich elementów podrzędnych), aby zapewnić optymalną skuteczność.

Raportowanie

Używanie raportów do pobierania statystyk

Jeśli chcesz pobrać dużą liczbę elementów i ich statystyk, często lepiej korzystać z raportów niż standardowych metod AdsApp. Zalecamy korzystanie z raportów z tych powodów:

  • Raporty zapewniają lepszą wydajność w przypadku dużych zapytań.
  • Raporty nie osiągną standardowych limitów pobierania.

Porównaj te fragmenty kodu, które pobierają dane o kliknięciach, wyświetleniach, kosztach i tekście 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żywaj iteratorów aplikacji 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());
}

Drugie podejście nie jest preferowane, ponieważ odbywa się to na podstawie słów kluczowych i pobiera statystyki pojedynczo. W tym przypadku raporty działają szybciej, ponieważ pobierają wszystkie dane w ramach jednego wywołania i przesyłają je strumieniowo w razie potrzeby. Dodatkowo słowa kluczowe pobrane za pomocą drugiego sposobu są wliczane do limitu skryptu dla liczby encji pobranych przy użyciu wywołania get().

Użyj wyszukiwarki zamiast raportu

Metoda raportowania została stworzona dla starej infrastruktury i podaje wyniki w płaskim formacie nawet wtedy, gdy korzystasz z GAQL. Oznacza to, że musi ono przekształcić wyniki zapytania, tak aby były zgodne ze starym stylem, który nie jest obsługiwany w przypadku niektórych pól i zwiększa obciążenie każdego wywołania.

Zalecamy, aby zamiast tego korzystać z sieci wyszukiwania, aby korzystać ze wszystkich funkcji nowego interfejsu API Google Ads API.

Preferuj GAQL do AWQL

Chociaż AWQL jest nadal obsługiwany w zapytaniach do raportów i wywołaniach withCondition, jest przetwarzany przez warstwę translacji, która nie jest w pełni zgodna z prawdziwą funkcją AWQL. Aby mieć pełną kontrolę nad zapytaniami, upewnij się, że używasz GAQL.

Jeśli masz zapytania AWQL, które chcesz przetłumaczyć, możesz skorzystać z narzędzia do migracji zapytań.

Nie wybieraj więcej wierszy, niż jest to konieczne

Szybkość generowania raportów (i selektorów) zależy od łącznej liczby wierszy, które zostaną zwrócone przez raport, niezależnie od tego, czy przeglądasz je wielokrotnie. Oznacza to, że należy zawsze używać określonych filtrów, aby maksymalnie ograniczyć zbiór wyników do danego przypadku użycia.

Załóżmy, że chcesz znaleźć grupy reklam ze stawkami wykraczającymi poza określony zakres. Szybciej będzie utworzyć 2 osobne zapytania – jedno do stawek poniżej dolnego progu, a drugie do stawek powyżej najwyższego progu – wtedy, gdy wygenerujesz wszystkie grupy reklam i zignorujesz 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 zapytanie ogólne (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 Menedżera reklam (MCK)

Preferuj wykonywanieInParallel zamiast wykonywania szeregowego

Podczas tworzenia skryptów na kontach menedżera używaj w miarę możliwości polecenia executeInParallel() zamiast wykonywania szeregowego. executeInParallel() wydłuża czas przetwarzania skryptu (do godziny) i do 30 minut na każde przetworzone konto (zamiast 30 minut łącznie w przypadku wykonania kodu szeregowego). Więcej informacji znajdziesz na naszej stronie limitów.

Arkusze kalkulacyjne

Używanie operacji wsadowych podczas aktualizowania arkuszy kalkulacyjnych

Aktualizując arkusze kalkulacyjne, używaj metod operacji zbiorczych (np. getRange()) zamiast metod, które aktualizują po jednej komórce.

Przyjrzyjmy się temu fragmentowi kodu, który generuje wzór fraktalny w arkuszu kalkulacyjnym.

Metoda kodowania Fragment kodu
Aktualizowanie zakresu komórek w jednym 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 pojedynczych komórek (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 starają się zoptymalizować drugi fragment kodu przez zapisywanie wartości w pamięci podręcznej, jednak w porównaniu z pierwszym fragmentem wciąż mają niską wydajność ze względu na liczbę wywołań interfejsu API.