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

Trang này trình bày các 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 bộ lọc phù hợp mang lại những lợi ích sau:

  • Mã này đơ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 theo 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 truyền tải hệ 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 thu thập ở cấp đó thay vì truyền tải toàn bộ hệ thống 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 tốt hơn nhiều: hệ thống sẽ không phải đọc một cách không cần thiết trong tất cả các chiến dịch và nhóm quảng cáo.

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 pháp thu thập thích hợp (Nên dùng)

var ads = AdsApp.ads();

Truyền tải hệ phân cấp (Không nên)
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.
  }
}

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 tìm nạp toàn bộ hệ phân cấp đối tượng (chiến dịch, nhóm quảng cáo) trong khi chỉ yêu cầu quảng cáo.

Sử dụng các phương thức cụ thể của trình truy cập dành cho cha mẹ

Đôi khi, bạn cần lấy thực thể mẹ của đối tượng đã 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.

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 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 phù hợp dành cho cha mẹ truy cậ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.
}
Truyền tải 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 sẽ tìm nạp toàn bộ hệ thống 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 tập hợp con các chiến dịch và nhóm quảng cáo được liên kết với tập hợp quảng cáo của mình. Phương pháp đầu tiên tự hạn chế để chỉ tìm nạp tập hợp quảng cáo có liên quan và sử dụng phương thức thích hợp để truy cập vào các đối tượng mẹ của tập hợp đó.

Sử dụng các 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 truyền qua một hệ phân cấp.

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 trong tháng qua.

Phương pháp lập trình Đoạn mã
Sử dụng bộ lọc cấp độ gốc 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.
}
Truyền tải 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ì nó sẽ lặp lại hệ thống 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 với các chiến dịch và nhóm quảng cáo gốc của các quảng cáo đó. Phương pháp đầu tiên giới hạn việc lặp lại đối vớ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 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 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 (ít tối ưu hơn)
var campaign = AdsApp.campaigns()
    .withCondition('Name="foo"')
    .get()
    .next();

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

Lọc theo mã nhận dạng gốc 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ể. Điều này sẽ giúp các truy vấn của bạn nhanh hơn bằng cách giới hạn danh sách các 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 Nhóm quảng cáo theo ID của Nhóm quảng cáo. Giả sử đã 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 (ít tối ưu hơn)
var adGroup = AdsApp.adGroups()
    .withIds([12345])
    .get()
    .next();

Mặc dù cả hai đoạn mã đều cho kết quả giống nhau, nhưng hoạt động lọc bổ sung trong đoạn mã 1 sử dụng mã nhận dạng mẹ (CampaignId="54678") sẽ giúp mã này 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ình 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 cho bạn mức hiệu suất như nhau, nhưng phương pháp thứ hai thườ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 để đưa vào 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 một danh sách các thực thể. Các 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 AWQL rất dài lọc trên mã nhận dạng thực thể bằng mệnh đề IN. Phương pháp này hiệu quả khi số lượng thực thể bị giới hạn. Tuy nhiên, khi độ dài truy vấn tăng lên, hiệu suất của tập lệnh sẽ giảm vì hai lý do:

  • Một truy vấn 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 để đánh giá, nên 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 một nhãn và lọc theo mã nhận dạng nhãn (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 truy vấn dài bằng mệnh đề IN (không nên)
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 các 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 đó, mã này cố gắng kết hợp nhiều thay đổi thành lô để có thể đưa ra một yêu cầu thực hiện nhiều thay đổi. Phương pháp này giúp tập lệnh của bạn 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 thường xuyên xoá hàng loạt thao tác, 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 thành phần mới 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)
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() sẽ buộc tập lệnh Google Ads xoá thao tác setCpc() và chỉ thực thi một thao tác mỗi lần. Phương pháp thứ nhất, tương tự như phương pháp thứ hai, có thêm lợi ích là hỗ trợ việc phân lô 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ì trình tạo 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 các phương thức tạo (không khuyên dùng)
adGroup.createKeyword('shoes');
var keyword = adGroup.keywords()
    .withCondition('KeywordText="shoes"')
    .get()
    .next();

Phương pháp thứ hai không được ưu tiên sử dụng 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 dùng nữa.

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

Hãy xem xét các đoạn mã sau đây để tạo danh sách từ khoá và in mã 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 thành phần mới 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)
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());
}

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

Cân nhắc việ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 tác vụ 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ừ khóa) 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ể, tính năng tải lên hàng loạt có xu hướng mang lại cho bạn hiệu suất cao hơn. Ví dụ: hãy xem xét các tập lệnh sau để tăng MaxCpc của các từ khóa 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 (ít 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 sử dụng 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. Đồng thời, 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 lẫn 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 hoạt động của bạn theo chiến dịch gốc. Điều này giúp tăng tính 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 cân nhắc chạy song song hai tác vụ tải lên hàng loạt. Một nhóm quảng cáo tạm dừng quảng cáo trong một nhóm quảng cáo; một nhóm quảng cáo còn lại sẽ điều chỉnh giá thầu từ khoá. Mặc dù các thao tác không liên quan, nhưng các thao tác này 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ẻ), do đó 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á quá trình thực thi trong một nhiệm 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 nhiệm 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 tính năng tải lên hàng loạt hoạt động trên danh sách chiến dịch (và các thực thể con của các chiến dịch đó) loại trừ lẫn nhau để 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 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ì phương thức AdsApp chuẩn. Chúng tôi ưu tiên sử dụng báo cáo vì các lý do sau:

  • Báo cáo cung cấp cho bạn hiệu suất tốt hơn 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 bình thường.

So sánh các đoạn mã sau đây tìm nạp Lượt nhấp, Lượt hiển thị, Chi phí và Văn bản của tất cả cá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 biến lặp AdsApp (không khuyê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 sử dụng vì nó lặp lại các từ khoá và truy xuất số liệu thống kê cho 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 và truyền trực tuyến dữ liệu đó theo yêu cầu. Ngoài ra, các từ khoá được truy xuất trong phương pháp thứ hai cũng được tính vào hạn mức của tập lệnh đối với số lượng thực thể được truy xuất bằng lệnh gọi get().

Sử dụng công cụ 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à ứng dụng phải biến đổi kết quả của truy vấn để phù hợp với kiểu cũ, không được hỗ trợ cho tất cả các trường và tăng thêm chi phí cho mỗi lệnh gọi.

Thay vào đó, bạn nên sử dụng công cụ 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 được hỗ trợ trong các truy vấn báo cáo và các lệnh gọi withCondition, nhưng AWQL vẫn chạy thông qua một lớp dịch không có khả năng tương thích đầy đủ với AWQL thực sự. Để có toàn quyền kiểm soát các truy vấn của bạn, hãy đảm bảo rằng bạn đang sử dụng GAQL.

Nếu bạn có truy vấn AWQL hiện tại mà bạn muốn dịch, chúng tôi có Công cụ di chuyển truy vấn để trợ giúp bạn.

Khô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 sẽ được báo cáo trả về, bất kể bạn có lặp lại qua 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 kết quả được đặt ở mức nhiều nhất có thể cho phù hợp với trường hợp sử dụng của mình.

Ví dụ: giả sử bạn muốn tìm các nhóm quảng cáo có giá thầu nằm ngoài một số phạm vi cụ thể. Việc tạo hai truy vấn riêng biệt sẽ nhanh hơn, một truy vấn cho giá thầu dưới ngưỡng dưới cùng và truy vấn còn lại cho giá thầu trên ngưỡng trên cùng, thay vì 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 cụm từ tìm kiếm (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 bỏ khỏi một truy vấn 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 Google Ads Manager (MCC)

Ưu tiên thực thiInParallel hơn là 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 (nếu có thể). executeInParallel() cung cấp cho tập lệnh của bạn thêm thời gian xử lý (tối đa một giờ) và tối đa 30 phút cho mỗi tài khoản được xử lý (thay vì 30 phút kết hợp để thực thi nối tiếp). Hãy xem trang các 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 mỗi lần một ô.

Hãy xem xét đoạn mã sau đây giúp tạo mẫu phân dạng trên bảng tính.

Phương pháp lập trình Đoạn mã
Cập nhậ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 mỗi lần một ô (không nên)
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ù Bảng tính Google 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 vẫn mang lại cho bạn 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.