Praktik Terbaik

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

Pemilih

Memfilter dengan pemilih

Jika memungkinkan, gunakan filter untuk hanya meminta entitas yang Anda butuhkan. Menerapkan filter yang tepat akan memberikan manfaat sebagai berikut:

  • Kodenya lebih sederhana dan mudah dipahami.
  • Skrip akan dijalankan dengan 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 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 berupaya mengambil daftar semua kata kunci di akun Anda hanya untuk menerapkan filter ke daftar tersebut.

Jangan menjelajahi hierarki kampanye

Jika Anda ingin mengambil entity di tingkat tertentu, gunakan metode koleksi di tingkat tersebut, bukan menjelajahi seluruh hierarki kampanye. Selain lebih sederhana, performa kampanye ini juga akan 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();

Menjelajah 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 pada bulan lalu:

Pendekatan coding Cuplikan kode
Menggunakan metode pengakses orang tua yang sesuai (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.
}
Menjelajah 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 subkumpulan kampanye dan grup iklan yang terkait dengan kumpulan iklan. Pendekatan pertama membatasi dirinya sendiri untuk hanya mengambil koleksi iklan yang relevan, dan menggunakan metode yang sesuai untuk mengakses objek induknya.

Menggunakan filter induk tertentu

Untuk mengakses entitas dalam kampanye atau grup iklan tertentu, gunakan filter tertentu di pemilih, bukan mengambil lalu lintas 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 lalu.

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.
}
Menjelajah 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, sedangkan Anda hanya memerlukan kumpulan iklan yang dipilih, serta kampanye induk dan grup iklannya. Pendekatan pertama membatasi iterasi pada daftar iklan dengan menerapkan filter khusus untuk parent entity pada pemilih.

Gunakan ID untuk pemfilteran jika memungkinkan

Saat memfilter entity, sebaiknya filter entity berdasarkan ID-nya, bukan kolom lain.

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 entitas, 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 Grup Iklan menurut 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 menurut ID grup iklan saja (kurang optimal)
var adGroup = AdsApp.adGroups()
    .withIds([12345])
    .get()
    .next();

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

Menggunakan label saat 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 Anda.

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
}
Membuat pemilih yang 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 tersebut memberi Anda tingkat performa yang serupa, pendekatan kedua cenderung menghasilkan kode yang lebih kompleks seiring dengan bertambahnya jumlah kondisi dalam pemilih Anda. Selain itu, lebih mudah untuk menerapkan label ke entitas baru daripada mengedit skrip untuk menyertakan entitas baru.

Membatasi jumlah kondisi dalam klausa IN Anda

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 entity menggunakan klausa IN. Pendekatan ini berfungsi dengan baik jika jumlah entity dibatasi. Namun, seiring bertambahnya panjang kueri Anda, performa skrip Anda akan menurun karena dua alasan:

  • Kueri yang lebih panjang membutuhkan waktu lebih lama untuk diurai.
  • Setiap ID yang Anda tambahkan ke klausa IN adalah kondisi tambahan untuk dievaluasi, dan oleh karena itu memerlukan waktu lebih lama.

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

Pendekatan coding Cuplikan kode
Menerapkan label dan filter 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() + '"');
Membuat 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 melakukan perubahan pada entitas Google Ads, skrip Google Ads tidak langsung mengeksekusi perubahan. Sebagai gantinya, metode ini mencoba menggabungkan beberapa perubahan menjadi batch, 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 sering menghapus batch operasinya, sehingga menyebabkan skrip Anda berjalan lambat.

Pertimbangkan skrip berikut yang memperbarui bid daftar kata kunci.

Pendekatan coding Cuplikan kode
Memantau 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 diupdate dalam loop padat (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 yaitu mendukung pengelompokan karena panggilan getCpc() dilakukan di loop yang terpisah dari loop tempat setCpc() dipanggil.

Gunakan builder jika memungkinkan

Skrip Google Ads mendukung dua cara untuk membuat objek baru, yaitu 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 lebih disarankan 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 dengan tidak benar, dapat mencegah skrip Google Ads mengelompokkan operasinya.

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

Pendekatan coding Cuplikan kode
Memantau 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 diupdate dalam loop padat (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 mengeksekusi satu operasi dalam satu waktu. Pendekatan pertama, meskipun serupa, memungkinkan batch karena kita memanggil Operations.getResult() pada loop yang berbeda dengan tempat pembuatannya.

Mempertimbangkan penggunaan 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. Ketika Anda perlu mengupdate banyak entity, upload massal cenderung memberi Anda performa yang lebih baik. Misalnya, pertimbangkan skrip berikut yang meningkatkan MaxCpc kata kunci yang TopImpressionPercentage > 0.4-nya selama sebulan 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 menurut 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 kinerja yang cukup bagus, pendekatan pertama lebih disukai karena

  • Skrip Google Ads memiliki batasan jumlah objek yang dapat diambil atau diperbarui dalam satu pengoperasian, dan operasi pilih dan pembaruan dalam pendekatan kedua akan diperhitungkan dalam batas tersebut.

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

Mengelompokkan upload massal menurut kampanye

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

Pertimbangkan dua tugas upload massal yang berjalan secara paralel. Yang satunya menjeda iklan di grup iklan; yang satunya menyesuaikan bid kata kunci. Meskipun operasi tersebut tidak berkaitan, operasi tersebut mungkin berlaku untuk entitas dalam grup iklan yang sama (atau dua grup iklan yang berbeda dalam kampanye yang sama). Jika hal ini terjadi, sistem akan mengunci entitas 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 termudah untuk dilakukan adalah menjalankan hanya satu tugas upload massal per akun pada satu waktu. Jika Anda memutuskan untuk menjalankan lebih dari satu upload massal per akun, pastikan upload massal beroperasi berdasarkan daftar kampanye yang sama-sama bersifat eksklusif (dan entitas turunannya) untuk performa yang optimal.

Pelaporan

Menggunakan laporan untuk mengambil statistik

Jika Anda ingin mengambil banyak entity dan statistiknya, sebaiknya gunakan laporan daripada metode AdsApp standar. Penggunaan laporan lebih disarankan karena alasan berikut:

  • Laporan memberi Anda 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 pada 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 AdsApp (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 per satu. Dalam kasus ini, laporan berperforma lebih cepat karena mengambil semua data dalam satu panggilan dan mengalirkannya sesuai kebutuhan. Selain itu, kata kunci yang diambil dalam pendekatan kedua akan dihitung dalam kuota skrip Anda untuk jumlah entity yang diambil menggunakan panggilan get().

Gunakan penelusuran, bukan laporan

Metode laporan dibuat untuk infrastruktur lama, dan akan menampilkan hasil dalam format datar meskipun Anda menggunakan GAQL. Artinya, kueri harus mentransformasi hasil kueri agar sesuai 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 daripada 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, pastikan Anda menggunakan GAQL.

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

Jangan memilih baris melebihi yang diperlukan

Kecepatan eksekusi laporan (dan pemilih) didasarkan pada jumlah total baris yang akan ditampilkan oleh laporan, terlepas dari apakah Anda melakukan iterasi atau tidak. Ini berarti Anda harus selalu menggunakan filter spesifik untuk meminimalkan kumpulan hasil sebanyak mungkin agar sesuai dengan kasus penggunaan Anda.

Misalnya, Anda ingin menemukan grup iklan dengan bid di luar beberapa rentang tertentu. Akan lebih cepat membuat dua kueri terpisah, satu untuk bid di bawah nilai minimum bawah dan satu lagi untuk bid di atas nilai minimum atas, 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 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 Ads Manager (MCC)

Pilih executionInParallel 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 waktu hingga 30 menit per akun yang diproses (bukan 30 menit jika digabungkan untuk eksekusi serial). Lihat halaman batas untuk detail selengkapnya.

Spreadsheet

Menggunakan operasi batch saat mengupdate spreadsheet

Saat memperbarui spreadsheet, coba gunakan metode operasi massal (misalnya, getRange()) pada 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);
Memperbarui 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, performa yang dihasilkan masih buruk dibandingkan dengan cuplikan pertama, karena jumlah panggilan API yang dilakukan.