Praktik Terbaik

Halaman ini membahas berbagai praktik terbaik untuk pengembangan dengan skrip Google Ads.

Pemilih

Memfilter dengan pemilih

Jika memungkinkan, gunakan filter untuk hanya meminta entity yang Anda butuhkan. Menerapkan filter yang tepat memiliki manfaat berikut:

  • Kodenya lebih sederhana dan lebih mudah dipahami.
  • Skrip akan dijalankan jauh lebih cepat.

Bandingkan cuplikan kode berikut:

Pendekatan coding Cuplikan kode
Memfilter menggunakan pemilih (direkomendasikan)
var keywords = AdsApp.keywords()
    .withCondition('Clicks > 10')
    .forDateRange('LAST_MONTH')
    .get();
while (keywords.hasNext()) {
  var keyword = keywords.next();
  // Do work here.
}
Memfilter dalam kode (tidak direkomendasikan)
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.
  }
}

Pendekatan kedua tidak direkomendasikan karena mencoba mengambil daftar semua kata kunci di akun Anda hanya untuk menerapkan filter ke daftar.

Menghindari penelusuran hierarki kampanye

Jika Anda ingin mengambil entitas di tingkat tertentu, gunakan metode koleksi di tingkat tersebut, bukan menjelajahi seluruh hierarki kampanye. Selain lebih sederhana, hal ini juga akan berperforma jauh lebih baik: sistem tidak perlu membaca semua kampanye dan grup iklan secara tidak perlu.

Bandingkan cuplikan kode berikut yang mengambil semua iklan di akun Anda:

Pendekatan coding Cuplikan kode
Menggunakan metode pengumpulan yang sesuai (Direkomendasikan)

var ads = AdsApp.ads();

Melintasi hierarki (Tidak direkomendasikan)
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.
  }
}

Pendekatan kedua tidak direkomendasikan karena mencoba mengambil seluruh hierarki objek (kampanye, grup iklan) sedangkan hanya iklan yang diperlukan.

Menggunakan metode pengakses induk tertentu

Terkadang, Anda perlu mendapatkan parent entity objek yang diambil. Dalam hal ini, Anda harus menggunakan metode pengakses yang disediakan, bukan mengambil seluruh hierarki.

Bandingkan cuplikan kode berikut yang mengambil grup iklan yang memiliki iklan teks dengan lebih dari 50 klik bulan lalu:

Pendekatan coding Cuplikan kode
Menggunakan metode pengakses orang tua yang tepat (direkomendasikan)
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.
}
Melintasi hierarki (tidak direkomendasikan)
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.
    }
  }
}

Pendekatan kedua tidak direkomendasikan karena mengambil seluruh hierarki kampanye dan grup iklan di akun Anda, sedangkan Anda hanya memerlukan sebagian kampanye dan grup iklan yang terkait dengan kumpulan iklan Anda. Pendekatan pertama membatasi dirinya untuk hanya mengambil kumpulan iklan yang relevan, dan menggunakan metode yang sesuai untuk mengakses objek induknya.

Menggunakan filter induk tertentu

Untuk mengakses entity dalam kampanye atau grup iklan tertentu, gunakan filter khusus di pemilih, bukan mengambil lalu melintas melalui hierarki.

Bandingkan cuplikan kode berikut yang mengambil daftar iklan teks dalam kampanye dan grup iklan tertentu yang memiliki lebih dari 50 klik pada bulan terakhir.

Pendekatan coding Cuplikan kode
Menggunakan filter tingkat orang tua yang sesuai (direkomendasikan)
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.
}
Melintasi hierarki (tidak direkomendasikan)
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.
    }
  }
}

Pendekatan kedua tidak direkomendasikan karena melakukan iterasi pada hierarki kampanye dan grup iklan di akun Anda, sedangkan Anda hanya memerlukan kumpulan iklan yang dipilih, serta kampanye dan grup iklan induknya. Pendekatan pertama membatasi iterasi ke daftar iklan dengan menerapkan filter tertentu untuk entity induk di pemilih.

Gunakan ID untuk pemfilteran jika memungkinkan

Saat memfilter entitas, sebaiknya filter entitas berdasarkan ID-nya, bukan kolom lainnya.

Pertimbangkan cuplikan kode berikut yang memilih kampanye.

Pendekatan coding Cuplikan kode
Filter menurut ID (direkomendasikan)
var campaign = AdsApp.campaigns()
    .withIds([12345])
    .get()
    .next();
Filter menurut Nama (kurang optimal)
var campaign = AdsApp.campaigns()
    .withCondition('Name="foo"')
    .get()
    .next();

Pendekatan kedua kurang optimal karena kita memfilter berdasarkan kolom non-ID.

Filter menurut ID orang tua jika memungkinkan

Saat memilih entity, filter menurut ID induk jika memungkinkan. Tindakan ini akan mempercepat kueri Anda dengan membatasi daftar entity yang diambil oleh server saat memfilter hasil.

Pertimbangkan cuplikan kode berikut yang mengambil AdGroup berdasarkan ID-nya. Asumsikan bahwa ID kampanye induk diketahui.

Pendekatan coding Cuplikan kode
Memfilter menurut ID kampanye dan grup iklan (direkomendasikan)
var adGroup = AdsApp.adGroups()
    .withIds([12345])
    .withCondition('CampaignId="54678"')
    .get()
    .next();
Memfilter berdasarkan ID grup iklan saja (kurang optimal)
var adGroup = AdsApp.adGroups()
    .withIds([12345])
    .get()
    .next();

Meskipun kedua cuplikan kode memberikan hasil yang sama, pemfilteran tambahan dalam cuplikan kode 1 menggunakan ID induk (CampaignId="54678") membuat kode lebih efisien dengan membatasi daftar entity yang harus di-iterasi server saat memfilter hasil.

Menggunakan label jika ada terlalu banyak kondisi pemfilteran

Jika Anda memiliki terlalu banyak kondisi pemfilteran, sebaiknya buat label untuk entity yang Anda proses, dan gunakan label tersebut untuk memfilter entity.

Pertimbangkan cuplikan kode berikut yang mengambil daftar kampanye berdasarkan namanya.

Pendekatan coding Cuplikan kode
Menggunakan label (direkomendasikan)
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
}
Mem-build pemilih kompleks (tidak direkomendasikan)
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.
}

Meskipun kedua cuplikan kode memberi Anda tingkat performa yang serupa, pendekatan kedua cenderung menghasilkan kode yang lebih kompleks seiring meningkatnya jumlah kondisi dalam pemilih Anda. Menerapkan label ke entitas baru juga lebih mudah daripada mengedit skrip untuk menyertakan entitas baru.

Membatasi jumlah kondisi dalam klausa IN

Saat menjalankan skrip, kasus penggunaan yang umum adalah menjalankan laporan untuk daftar entity. Developer biasanya melakukannya dengan membuat kueri AWQL yang sangat panjang yang memfilter ID entitas menggunakan klausa IN. Pendekatan ini berfungsi dengan baik jika jumlah entitas terbatas. Namun, seiring dengan bertambahnya panjang kueri, performa skrip Anda akan menurun karena dua alasan:

  • Kueri yang lebih panjang memerlukan waktu lebih lama untuk diurai.
  • Setiap ID yang Anda tambahkan ke klausa IN adalah kondisi tambahan yang akan dievaluasi, sehingga memerlukan waktu lebih lama.

Dalam kondisi tersebut, sebaiknya terapkan label ke entity, lalu filter menurut LabelId.

Pendekatan coding Cuplikan kode
Menerapkan label dan memfilter menurut labelID (direkomendasikan)
// 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() + '"');
Buat kueri panjang menggunakan klausa IN (tidak direkomendasikan)
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…)');

Pemberitahuan akun

Perubahan batch

Saat Anda membuat perubahan pada entitas Google Ads, skrip Google Ads tidak langsung mengeksekusi perubahan tersebut. Sebagai gantinya, sistem ini mencoba menggabungkan beberapa perubahan menjadi kumpulan, sehingga dapat mengeluarkan satu permintaan yang melakukan beberapa perubahan. Pendekatan ini membuat skrip Anda lebih cepat dan mengurangi beban pada server Google Ads. Namun, ada beberapa pola kode yang memaksa skrip Google Ads untuk sering membersihkan batch operasinya, sehingga menyebabkan skrip Anda berjalan lambat.

Pertimbangkan skrip berikut yang memperbarui bid daftar kata kunci.

Pendekatan coding Cuplikan kode
Melacak elemen yang diperbarui (direkomendasikan)
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());
}
Mengambil elemen yang diperbarui dalam loop yang ketat (tidak direkomendasikan)
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());
}

Pendekatan kedua tidak direkomendasikan karena panggilan ke keyword.bidding().getCpc() memaksa skrip Google Ads untuk menghapus operasi setCpc() dan hanya menjalankan satu operasi dalam satu waktu. Pendekatan pertama, meskipun mirip dengan pendekatan kedua, memiliki manfaat tambahan untuk mendukung pengelompokan karena panggilan getCpc() dilakukan dalam loop terpisah dari loop tempat setCpc() dipanggil.

Gunakan builder jika memungkinkan

Skrip Google Ads mendukung dua cara untuk membuat objek baru—builder dan metode pembuatan. Builder lebih fleksibel daripada metode pembuatan, karena memberi Anda akses ke objek yang dibuat dari panggilan API.

Pertimbangkan cuplikan kode berikut:

Pendekatan coding Cuplikan kode
Menggunakan builder (direkomendasikan)
var operation = adGroup.newKeywordBuilder()
    .withText('shoes')
    .build();
var keyword = operation.getResult();
Menggunakan metode pembuatan (tidak direkomendasikan)
adGroup.createKeyword('shoes');
var keyword = adGroup.keywords()
    .withCondition('KeywordText="shoes"')
    .get()
    .next();

Pendekatan kedua tidak direkomendasikan karena operasi pemilihan tambahan yang terlibat dalam pengambilan kata kunci. Selain itu, metode pembuatan juga tidak digunakan lagi.

Namun, perlu diingat bahwa builder, jika digunakan secara tidak benar, dapat mencegah skrip Google Ads melakukan pengelompokan operasinya.

Pertimbangkan cuplikan kode berikut yang membuat daftar kata kunci, dan mencetak ID kata kunci yang baru dibuat:

Pendekatan coding Cuplikan kode
Melacak elemen yang diperbarui (direkomendasikan)
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());
}
Mengambil elemen yang diperbarui dalam loop yang ketat (tidak direkomendasikan)
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());
}

Pendekatan kedua tidak direkomendasikan karena memanggil operation.getResult() dalam loop yang sama yang membuat operasi, sehingga memaksa skrip Google Ads untuk menjalankan satu operasi dalam satu waktu. Meskipun serupa, pendekatan pertama memungkinkan pengelompokan karena kita memanggil operation.getResult() dalam loop yang berbeda dengan tempat pembuatannya.

Pertimbangkan untuk menggunakan upload massal untuk update besar

Tugas umum yang dilakukan developer adalah menjalankan laporan dan memperbarui properti entity (misalnya, bid kata kunci) berdasarkan nilai performa saat ini. Jika Anda harus mengupdate sejumlah besar entity, upload massal cenderung memberikan performa yang lebih baik. Misalnya, pertimbangkan skrip berikut yang meningkatkan MaxCpc kata kunci yang TopImpressionPercentage > 0.4-nya untuk bulan terakhir:

Pendekatan coding Cuplikan kode
Menggunakan upload massal (direkomendasikan)

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();
Memilih dan memperbarui kata kunci berdasarkan ID (kurang optimal)
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);
  }
}

Meskipun pendekatan kedua memberi Anda performa yang cukup baik, pendekatan pertama lebih disukai dalam hal ini karena

  • Skrip Google Ads memiliki batas jumlah objek yang dapat diambil atau diperbarui dalam satu proses, dan operasi pemilihan serta update dalam pendekatan kedua diperhitungkan dalam batas tersebut.

  • Upload massal memiliki batas yang lebih tinggi baik dalam hal jumlah entity yang dapat diupdate, maupun waktu eksekusi secara keseluruhan.

Mengelompokkan upload massal menurut kampanye

Saat membuat upload massal, coba kelompokkan operasi menurut kampanye induk. Hal ini meningkatkan efisiensi dan mengurangi kemungkinan perubahan yang bertentangan/error serentak.

Pertimbangkan dua tugas upload massal yang berjalan secara paralel. Satu fitur menjeda iklan dalam grup iklan; fitur lainnya menyesuaikan bid kata kunci. Meskipun operasinya tidak berkaitan, operasi tersebut mungkin berlaku untuk entitas di grup iklan yang sama (atau dua grup iklan berbeda dalam kampanye yang sama). Jika hal ini terjadi, sistem akan mengunci entity induk (grup iklan atau kampanye yang dibagikan), sehingga menyebabkan tugas upload massal saling memblokir.

Skrip Google Ads dapat mengoptimalkan eksekusi dalam satu tugas upload massal sehingga hal paling sederhana untuk dilakukan adalah menjalankan hanya satu tugas upload massal per akun dalam satu waktu. Jika Anda memutuskan untuk menjalankan lebih dari satu upload massal per akun, pastikan upload massal tersebut beroperasi pada daftar kampanye yang saling eksklusif (dan entitas turunannya) untuk performa yang optimal.

Pelaporan

Gunakan laporan untuk mengambil statistik

Jika Anda ingin mengambil entitas dalam jumlah besar beserta statistiknya, sebaiknya gunakan laporan, bukan metode AdsApp standar. Penggunaan laporan lebih direkomendasikan karena alasan berikut:

  • Laporan memberikan performa yang lebih baik untuk kueri besar.
  • Laporan tidak akan mencapai kuota pengambilan normal.

Bandingkan cuplikan kode berikut yang mengambil Klik, Tayangan, Biaya, dan Teks dari semua kata kunci yang menerima lebih dari 50 klik bulan lalu:

Pendekatan coding Cuplikan kode
Menggunakan laporan (direkomendasikan)
  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);
  }
Menggunakan iterator Ads (tidak direkomendasikan)
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());
}

Pendekatan kedua tidak direkomendasikan karena melakukan iterasi pada kata kunci dan mengambil statistik satu entitas pada satu waktu. Dalam hal ini, laporan akan berperforma lebih cepat karena mengambil semua data dalam satu panggilan dan melakukan streaming sesuai kebutuhan. Selain itu, kata kunci yang diambil dalam pendekatan kedua dihitung dalam kuota skrip Anda untuk jumlah entitas yang diambil menggunakan panggilan get().

Menggunakan penelusuran, bukan laporan

Metode laporan dibuat untuk infrastruktur lama, dan akan menampilkan hasil dalam format datar meskipun Anda menggunakan GAQL. Artinya, metode ini harus mengubah hasil kueri agar cocok dengan gaya lama, yang tidak didukung untuk semua kolom dan menambahkan overhead ke setiap panggilan.

Sebaiknya gunakan penelusuran untuk memanfaatkan semua fitur pelaporan Google Ads API yang baru.

Pilih GAQL ke AWQL

Meskipun AWQL masih didukung dalam kueri laporan dan panggilan withCondition, AWQL dijalankan melalui lapisan terjemahan yang tidak memiliki kompatibilitas penuh dengan AWQL sebenarnya. Untuk memiliki kontrol penuh atas kueri Anda, pastikan Anda menggunakan GAQL.

Jika Anda memiliki kueri AWQL yang ingin diterjemahkan, kami memiliki Alat Migrasi Kueri untuk membantu.

Jangan memilih lebih banyak baris daripada yang Anda butuhkan

Kecepatan eksekusi laporan (dan pemilih) didasarkan pada jumlah total baris yang akan ditampilkan oleh laporan, terlepas dari apakah Anda melakukan iterasi melalui baris tersebut. Ini berarti Anda harus selalu menggunakan filter tertentu untuk meminimalkan set hasil sebisa mungkin agar sesuai dengan kasus penggunaan Anda.

Misalnya, Anda ingin menemukan grup iklan dengan bid di luar beberapa rentang tertentu. Membuat dua kueri terpisah, satu untuk bid di bawah nilai minimum dan satu lagi untuk bid di atas nilai maksimum, akan lebih cepat daripada mengambil semua grup iklan dan mengabaikan grup iklan yang tidak Anda minati.

Pendekatan coding Cuplikan kode
Menggunakan dua kueri (direkomendasikan)
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);
}
Memfilter ke bawah dari kueri umum (tidak direkomendasikan)
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);
  }
}

Skrip Pengelola Iklan (MCC)

Memilih executeInParallel daripada eksekusi serial

Saat menulis skrip untuk akun pengelola, gunakan executeInParallel(), bukan eksekusi serial jika memungkinkan. executeInParallel() memberi skrip Anda lebih banyak waktu pemrosesan (hingga satu jam) dan hingga 30 menit per akun yang diproses (bukan 30 menit yang digabungkan untuk eksekusi serial). Lihat halaman batas kami untuk mengetahui detail selengkapnya.

Spreadsheet

Menggunakan operasi batch saat memperbarui {i>spreadsheet<i}

Saat mengupdate spreadsheet, coba gunakan metode operasi massal (misalnya, getRange()) dan bukan metode yang memperbarui sel satu per satu.

Pertimbangkan cuplikan kode berikut yang menghasilkan pola fraktal di spreadsheet.

Pendekatan coding Cuplikan kode
Memperbarui rentang sel dalam satu panggilan (direkomendasikan)
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);
Perbarui sel satu per satu (tidak direkomendasikan)
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();
}

Meskipun Google Spreadsheet mencoba mengoptimalkan cuplikan kode kedua dengan meng-cache nilai, performanya masih buruk dibandingkan dengan cuplikan pertama, karena jumlah panggilan API yang dilakukan.