Các phương pháp hay nhất

Trang này trình bày nhiều phương pháp hay nhất để phát triển bằng tập lệnh Google Ads.

Trình chọn (Selector)

Lọc bằng bộ chọn

Khi có thể, hãy sử dụng bộ lọc để chỉ yêu cầu những thực thể bạn cần. Việc áp dụng các bộ lọc thích hợp mang lại những lợi ích sau:

  • Mã đơn giản và dễ hiểu hơn.
  • Tập lệnh sẽ thực thi nhanh hơn nhiều.

So sánh các đoạn mã sau:

Phương pháp lập trình Đoạn mã
Lọc bằng bộ chọn (nên dùng)
var keywords = AdsApp.keywords()
    .withCondition('Clicks > 10')
    .forDateRange('LAST_MONTH')
    .get();
while (keywords.hasNext()) {
  var keyword = keywords.next();
  // Do work here.
}
Lọc trong mã (không nên dùng)
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.
  }
}

Bạn không nên sử dụng phương pháp thứ hai vì phương pháp này cố gắng truy xuất danh sách tất cả từ khoá trong tài khoản của bạn chỉ để áp dụng bộ lọc cho danh sách đó.

Tránh duyệt qua hệ thống phân cấp chiến dịch

Khi bạn muốn truy xuất các thực thể ở một cấp cụ thể, hãy sử dụng phương thức tập hợp ở cấp đó thay vì duyệt qua toàn bộ hệ phân cấp chiến dịch. Ngoài việc đơn giản hơn, cách này cũng sẽ hoạt động hiệu quả hơn nhiều: hệ thống sẽ không phải đọc tất cả chiến dịch và nhóm quảng cáo một cách không cần thiết.

Hãy so sánh các đoạn mã sau đây để truy xuất tất cả quảng cáo trong tài khoản của bạn:

Phương pháp lập trình Đoạn mã
Sử dụng phương thức thu thập phù hợp (Nên dùng)

var ads = AdsApp.ads();

Duyệt qua hệ phân cấp (Không nên dùng)
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.
  }
}

Chúng tôi không khuyến khích phương pháp thứ hai vì phương pháp này cố gắng tìm nạp toàn bộ hệ thống phân cấp của các đối tượng (chiến dịch, nhóm quảng cáo) khi chỉ cần quảng cáo.

Sử dụng các phương thức truy cập cụ thể của thành phần mẹ

Đôi khi, bạn cần lấy thực thể mẹ của một đối tượng được truy xuất. Trong trường hợp này, bạn nên sử dụng một phương thức truy cập được cung cấp thay vì tìm nạp toàn bộ hệ phân cấp.

Hãy so sánh các đoạn mã sau đây để truy xuất những nhóm quảng cáo có quảng cáo dạng văn bản nhận được hơn 50 lượt nhấp trong tháng trước:

Phương pháp lập trình Đoạn mã
Sử dụng phương thức truy cập mẹ thích hợp (nên dùng)
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.
}
Duyệt qua hệ phân cấp (không nên dùng)
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.
    }
  }
}

Bạn không nên sử dụng phương pháp thứ hai vì phương pháp này tìm nạp toàn bộ hệ phân cấp chiến dịch và nhóm quảng cáo trong tài khoản của bạn, trong khi bạn chỉ cần một nhóm nhỏ chiến dịch và nhóm quảng cáo được liên kết với nhóm quảng cáo của mình. Phương pháp đầu tiên chỉ tìm nạp bộ sưu tập quảng cáo phù hợp và sử dụng một phương thức thích hợp để truy cập vào các đối tượng mẹ của bộ sưu tập đó.

Sử dụng bộ lọc cụ thể dành cho cha mẹ

Để truy cập vào các thực thể trong một chiến dịch hoặc nhóm quảng cáo cụ thể, hãy sử dụng một bộ lọc cụ thể trong bộ chọn thay vì tìm nạp rồi đi qua một hệ thống phân cấp.

Hãy so sánh các đoạn mã sau đây để truy xuất danh sách quảng cáo dạng văn bản trong một chiến dịch và nhóm quảng cáo cụ thể có hơn 50 lượt nhấp vào tháng trước.

Phương pháp lập trình Đoạn mã
Sử dụng bộ lọc cấp trên phù hợp (nên dùng)
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.
}
Duyệt qua hệ phân cấp (không nên dùng)
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.
    }
  }
}

Bạn không nên sử dụng phương pháp thứ hai vì phương pháp này lặp lại hệ phân cấp chiến dịch và nhóm quảng cáo trong tài khoản của bạn, trong khi bạn chỉ cần một nhóm quảng cáo đã chọn cũng như các chiến dịch và nhóm quảng cáo gốc của chúng. Phương pháp đầu tiên giới hạn việc lặp lại danh sách quảng cáo bằng cách áp dụng một bộ lọc cụ thể cho các thực thể mẹ trên bộ chọn.

Sử dụng mã nhận dạng để lọc khi có thể

Khi lọc thực thể, bạn nên lọc thực thể theo mã nhận dạng thay vì các trường khác.

Hãy xem xét các đoạn mã sau đây để chọn một chiến dịch.

Phương pháp lập trình Đoạn mã
Lọc theo mã nhận dạng (nên dùng)
var campaign = AdsApp.campaigns()
    .withIds([12345])
    .get()
    .next();
Lọc theo tên (kém tối ưu hơn)
var campaign = AdsApp.campaigns()
    .withCondition('Name="foo"')
    .get()
    .next();

Cách thứ hai kém tối ưu hơn vì chúng ta đang lọc theo một trường không phải là mã nhận dạng.

Lọc theo mã nhận dạng của cha mẹ bất cứ khi nào có thể

Khi chọn một thực thể, hãy lọc theo mã nhận dạng gốc bất cứ khi nào có thể. Thao tác này sẽ giúp truy vấn của bạn nhanh hơn bằng cách giới hạn danh sách thực thể mà máy chủ truy xuất khi lọc kết quả.

Hãy xem xét đoạn mã sau đây để truy xuất một AdGroup theo mã nhận dạng của nhóm quảng cáo đó. Giả sử bạn đã biết mã chiến dịch gốc.

Phương pháp lập trình Đoạn mã
Lọc theo mã chiến dịch và mã nhóm quảng cáo (nên dùng)
var adGroup = AdsApp.adGroups()
    .withIds([12345])
    .withCondition('CampaignId="54678"')
    .get()
    .next();
Chỉ lọc theo mã nhóm quảng cáo (kém tối ưu)
var adGroup = AdsApp.adGroups()
    .withIds([12345])
    .get()
    .next();

Mặc dù cả hai đoạn mã đều cho kết quả giống hệt nhau, nhưng việc lọc bổ sung trong đoạn mã 1 bằng cách sử dụng mã nhận dạng gốc (CampaignId="54678") giúp mã hiệu quả hơn bằng cách hạn chế danh sách các thực thể mà máy chủ phải lặp lại khi lọc kết quả.

Sử dụng nhãn khi có quá nhiều điều kiện lọc

Khi có quá nhiều điều kiện lọc, bạn nên tạo nhãn cho các thực thể mà bạn xử lý và sử dụng nhãn đó để lọc các thực thể.

Hãy xem xét đoạn mã sau đây để truy xuất danh sách chiến dịch theo tên.

Phương pháp lập trình Đoạn mã
Sử dụng nhãn (nên dùng)
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
}
Tạo bộ chọn phức tạp (không nên dùng)
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.
}

Mặc dù cả hai đoạn mã đều mang lại hiệu suất tương tự, nhưng phương pháp thứ hai có xu hướng tạo ra mã phức tạp hơn khi số lượng điều kiện trong bộ chọn tăng lên. Việc áp dụng nhãn cho một thực thể mới cũng dễ dàng hơn so với việc chỉnh sửa tập lệnh để thêm một thực thể mới.

Giới hạn số lượng điều kiện trong mệnh đề IN

Khi chạy tập lệnh, một trường hợp sử dụng phổ biến là chạy báo cáo cho danh sách các thực thể. Nhà phát triển thường thực hiện việc này bằng cách tạo một truy vấn GAQL rất dài để lọc theo mã nhận dạng thực thể bằng mệnh đề IN. Phương pháp này hoạt động tốt khi số lượng thực thể bị giới hạn. Tuy nhiên, khi độ dài của truy vấn tăng lên, hiệu suất tập lệnh của bạn sẽ giảm do 2 lý do:

  • Cụm từ tìm kiếm dài hơn sẽ mất nhiều thời gian hơn để phân tích cú pháp.
  • Mỗi mã nhận dạng mà bạn thêm vào mệnh đề IN là một điều kiện bổ sung cần đánh giá, và do đó sẽ mất nhiều thời gian hơn.

Trong những điều kiện như vậy, bạn nên áp dụng nhãn cho các thực thể, sau đó lọc theo LabelId.

Phương pháp lập trình Đoạn mã
Áp dụng nhãn và lọc theo labelID (nên dùng)
// 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() + '"');
Tạo một truy vấn dài bằng mệnh đề IN (không nên dùng)
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…)');

Thông tin cập nhật về tài khoản

Thay đổi hàng loạt

Khi bạn thực hiện thay đổi đối với một thực thể Google Ads, tập lệnh Google Ads sẽ không thực thi thay đổi đó ngay lập tức. Thay vào đó, nó cố gắng kết hợp nhiều thay đổi thành các lô để có thể đưa ra một yêu cầu duy nhất thực hiện nhiều thay đổi. Phương pháp này giúp tập lệnh của bạn chạy nhanh hơn và giảm tải cho máy chủ Google Ads. Tuy nhiên, có một số mẫu mã buộc tập lệnh Google Ads phải thường xuyên xoá hàng loạt các thao tác, do đó khiến tập lệnh của bạn chạy chậm.

Hãy xem xét tập lệnh sau đây để cập nhật giá thầu của một danh sách từ khoá.

Phương pháp lập trình Đoạn mã
Theo dõi các phần tử được cập nhật (nên dùng)
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());
}
Truy xuất các phần tử đã cập nhật trong một vòng lặp chặt chẽ (không nên dùng)
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());
}

Bạn không nên sử dụng phương pháp thứ hai vì lệnh gọi đến keyword.bidding().getCpc() buộc tập lệnh Google Ads phải xoá thao tác setCpc() và chỉ thực thi một thao tác tại một thời điểm. Mặc dù tương tự như cách tiếp cận thứ hai, nhưng cách tiếp cận đầu tiên có thêm lợi ích là hỗ trợ xử lý hàng loạt vì lệnh gọi getCpc() được thực hiện trong một vòng lặp riêng biệt với vòng lặp mà setCpc() được gọi.

Sử dụng trình tạo khi có thể

Tập lệnh Google Ads hỗ trợ 2 cách để tạo đối tượng mới: trình tạo và phương thức tạo. Trình tạo linh hoạt hơn các phương thức tạo vì chúng cho phép bạn truy cập vào đối tượng được tạo từ lệnh gọi API.

Hãy xem xét các đoạn mã sau:

Phương pháp lập trình Đoạn mã
Sử dụng trình tạo (nên dùng)
var operation = adGroup.newKeywordBuilder()
    .withText('shoes')
    .build();
var keyword = operation.getResult();
Sử dụng phương thức tạo (không nên dùng)
adGroup.createKeyword('shoes');
var keyword = adGroup.keywords()
    .withCondition('KeywordText="shoes"')
    .get()
    .next();

Cách thứ hai không được ưu tiên do thao tác lựa chọn bổ sung liên quan đến việc truy xuất từ khoá. Ngoài ra, các phương thức tạo cũng không còn được dùng nữa.

Tuy nhiên, hãy lưu ý rằng khi được sử dụng không đúng cách, các trình tạo có thể ngăn tập lệnh Google Ads gộp các thao tác của mình.

Hãy xem xét các đoạn mã sau đây để tạo danh sách từ khoá và in mã nhận dạng của các từ khoá mới tạo:

Phương pháp lập trình Đoạn mã
Theo dõi các phần tử được cập nhật (nên dùng)
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());
}
Truy xuất các phần tử đã cập nhật trong một vòng lặp chặt chẽ (không nên dùng)
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());
}

Cách thứ hai không được ưu tiên vì cách này gọi operation.getResult() trong cùng một vòng lặp tạo thao tác, do đó buộc tập lệnh Google Ads phải thực thi từng thao tác một. Cách tiếp cận đầu tiên, tuy tương tự, nhưng cho phép gộp nhóm vì chúng ta gọi operation.getResult() trong một vòng lặp khác với nơi nó được tạo.

Cân nhắc sử dụng tính năng tải lên hàng loạt cho các bản cập nhật lớn

Một công việc phổ biến mà các nhà phát triển thực hiện là chạy báo cáo và cập nhật các thuộc tính của thực thể (ví dụ: giá thầu từ khoá) dựa trên các giá trị hiệu suất hiện tại. Khi bạn phải cập nhật một số lượng lớn thực thể, việc tải lên hàng loạt thường mang lại hiệu suất tốt hơn. Ví dụ: hãy xem xét các tập lệnh sau đây giúp tăng MaxCpc của những từ khoá có TopImpressionPercentage > 0.4 trong tháng trước:

Phương pháp lập trình Đoạn mã
Sử dụng tính năng tải lên hàng loạt (nên dùng)

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();
Chọn và cập nhật từ khoá theo mã nhận dạng (kém tối ưu hơn)
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);
  }
}

Mặc dù phương pháp thứ hai mang lại hiệu suất khá tốt, nhưng phương pháp đầu tiên được ưu tiên trong trường hợp này vì

  • Tập lệnh Google Ads có giới hạn về số lượng đối tượng có thể được truy xuất hoặc cập nhật trong một lần chạy và các thao tác chọn và cập nhật trong phương pháp thứ hai sẽ được tính vào giới hạn đó.

  • Tính năng tải lên hàng loạt có giới hạn cao hơn cả về số lượng thực thể mà tính năng này có thể cập nhật và tổng thời gian thực thi.

Nhóm các tệp tải lên hàng loạt theo chiến dịch

Khi bạn tạo tệp tải lên hàng loạt, hãy cố gắng nhóm các thao tác theo chiến dịch mẹ. Điều này giúp tăng hiệu quả và giảm khả năng xảy ra các thay đổi xung đột / lỗi đồng thời.

Hãy xem xét hai tác vụ tải lên hàng loạt chạy song song. Một là tạm dừng quảng cáo trong một nhóm quảng cáo; hai là điều chỉnh giá thầu từ khoá. Mặc dù các thao tác không liên quan đến nhau, nhưng các thao tác đó có thể áp dụng cho các thực thể trong cùng một nhóm quảng cáo (hoặc hai nhóm quảng cáo khác nhau trong cùng một chiến dịch). Khi điều này xảy ra, hệ thống sẽ khoá thực thể mẹ (nhóm quảng cáo hoặc chiến dịch được chia sẻ), khiến các tác vụ tải lên hàng loạt chặn lẫn nhau.

Tập lệnh Google Ads có thể tối ưu hoá việc thực thi trong một tác vụ tải lên hàng loạt, vì vậy, cách đơn giản nhất là chỉ chạy một tác vụ tải lên hàng loạt cho mỗi tài khoản tại một thời điểm. Nếu bạn quyết định chạy nhiều lần tải lên hàng loạt cho mỗi tài khoản, hãy đảm bảo rằng các lần tải lên hàng loạt hoạt động trên danh sách chiến dịch loại trừ lẫn nhau (và các thực thể con của chúng) để đạt được hiệu suất tối ưu.

Báo cáo

Sử dụng báo cáo để tìm nạp số liệu thống kê

Khi bạn muốn truy xuất một lượng lớn thực thể và số liệu thống kê của các thực thể đó, bạn nên sử dụng báo cáo thay vì các phương thức AdsApp chuẩn. Bạn nên sử dụng báo cáo vì những lý do sau:

  • Báo cáo giúp bạn nâng cao hiệu suất cho các truy vấn lớn.
  • Báo cáo sẽ không đạt đến hạn mức tìm nạp thông thường.

Hãy so sánh các đoạn mã sau đây để tìm nạp Số lượt nhấp, Số lượt hiển thị, Chi phí và Văn bản của tất cả từ khoá đã nhận được hơn 50 lượt nhấp trong tháng trước:

Phương pháp lập trình Đoạn mã
Sử dụng báo cáo (nên dùng)
  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);
  }
Sử dụng trình lặp AdsApp (không nên dùng)
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());
}

Phương pháp thứ hai không được ưu tiên vì phương pháp này lặp lại các từ khoá và truy xuất số liệu thống kê từng thực thể một. Trong trường hợp này, báo cáo hoạt động nhanh hơn vì báo cáo tìm nạp tất cả dữ liệu trong một lệnh gọi duy nhất và truyền trực tuyến dữ liệu đó khi cần. Ngoài ra, các từ khoá được truy xuất trong phương pháp thứ hai sẽ được tính vào hạn mức của tập lệnh về số lượng thực thể được truy xuất bằng lệnh gọi get().

Sử dụng tính năng tìm kiếm thay vì báo cáo

Phương thức báo cáo được xây dựng cho cơ sở hạ tầng cũ và sẽ xuất kết quả ở định dạng phẳng ngay cả khi bạn đang sử dụng GAQL. Điều này có nghĩa là hệ thống phải chuyển đổi kết quả của truy vấn cho phù hợp với kiểu cũ, vốn không được hỗ trợ cho tất cả các trường và làm tăng mức hao tổn cho mỗi lệnh gọi.

Bạn nên sử dụng tính năng tìm kiếm để tận dụng tất cả các tính năng của báo cáo API Google Ads mới.

Ưu tiên GAQL hơn AWQL

Mặc dù AWQL vẫn hoạt động về mặt kỹ thuật cho các truy vấn báo cáo và lệnh gọi withCondition, nhưng bạn không nên sử dụng. Để có toàn quyền kiểm soát các truy vấn của mình, hãy đảm bảo rằng bạn đang sử dụng GAQL.

Đừng chọn nhiều hàng hơn mức cần thiết

Tốc độ thực thi báo cáo (và bộ chọn) dựa trên tổng số hàng mà báo cáo sẽ trả về, bất kể bạn có lặp lại các hàng đó hay không. Điều này có nghĩa là bạn phải luôn sử dụng các bộ lọc cụ thể để giảm thiểu tập hợp kết quả nhiều nhất có thể cho phù hợp với trường hợp sử dụng của bạn.

Ví dụ: giả sử bạn muốn tìm những nhóm quảng cáo có giá thầu nằm ngoài một phạm vi cụ thể. Việc tạo hai truy vấn riêng biệt (một truy vấn cho giá thầu dưới ngưỡng dưới và một truy vấn cho giá thầu trên ngưỡng trên) sẽ nhanh hơn so với việc tìm nạp tất cả nhóm quảng cáo và bỏ qua những nhóm quảng cáo mà bạn không quan tâm.

Phương pháp lập trình Đoạn mã
Sử dụng hai truy vấn (nên dùng)
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);
}
Lọc từ một cụm từ tìm kiếm chung chung (không nên dùng)
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);
  }
}

Tập lệnh Ad Manager (MCC)

Ưu tiên executeInParallel hơn thực thi nối tiếp

Khi viết tập lệnh cho tài khoản người quản lý, hãy sử dụng executeInParallel() thay vì thực thi nối tiếp khi có thể. executeInParallel() giúp tập lệnh của bạn có thêm thời gian xử lý (tối đa 1 giờ) và tối đa 30 phút cho mỗi tài khoản được xử lý (thay vì tổng cộng 30 phút cho việc thực thi tuần tự). Hãy xem trang giới hạn của chúng tôi để biết thêm thông tin chi tiết.

Bảng tính

Sử dụng các thao tác hàng loạt khi cập nhật bảng tính

Khi cập nhật bảng tính, hãy cố gắng sử dụng các phương thức thao tác hàng loạt (ví dụ: getRange()) thay vì các phương thức cập nhật từng ô một.

Hãy xem xét đoạn mã sau đây, đoạn mã này tạo ra một mẫu phân dạng trên một bảng tính.

Phương pháp lập trình Đoạn mã
Cập nhật một dải ô trong một lệnh gọi (nên dùng)
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);
Cập nhật từng ô một (không nên dùng)
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();
}

Mặc dù Google Trang tính cố gắng tối ưu hoá đoạn mã thứ hai bằng cách lưu các giá trị vào bộ nhớ đệm, nhưng đoạn mã này vẫn mang lại hiệu suất kém so với đoạn mã đầu tiên, do số lượng lệnh gọi API được thực hiện.