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 các thực thể bạn cần. Đang áp dụng bộ lọc phù hợp có 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 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 chỉ cố gắng truy xuất danh sách tất cả từ khoá trong tài khoản của bạn để áp dụng bộ lọc cho danh sách đó.

Tránh truy cập vào 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 thu thậ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, phương thức 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.

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();

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ộ thứ bậc của đối tượng (chiến dịch, nhóm quảng cáo) trong khi chỉ có quảng cáo là bắt buộc.

Sử dụng các phương thức truy cập mẹ cụ thể

Đôi khi, bạn cần lấy thực thể mẹ của đối tượng được truy xuất. Trong trường hợp này, bạn nên sử dụng 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 các nhóm quảng cáo có quảng cáo dạng văn bản với 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 phương thức truy cập dành cho cha mẹ phù 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.
}
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.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ộ chiến dịch và hệ thống phân cấp nhóm quảng cáo trong tài khoản của mình, trong khi bạn chỉ cần một tập hợp con 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 bạn. Phương pháp đầu tiên chỉ cho phép tìm nạp bộ sưu tập quảng cáo có liên quan 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ẹ.

Sử dụng các bộ lọc mẹ cụ thể

Để 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 duyệt 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 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.
}
Di chuyển 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 theo hệ phân cấp chiến dịch và nhóm quảng cáo trong tài khoản, trong khi bạn chỉ cần một nhóm quảng cáo đã chọn, cùng với chiến dịch và nhóm quảng cáo mẹ của các quảng cáo đó. Phương pháp đầu tiên giới hạn vòng lặp ở 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 để 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 tôi đang lọc theo trường không phải 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 mục, 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 nhanh hơn bằng cách giới hạn danh sách các thực thể được truy xuất máy chủ 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ử bạn đã biết mã chiến dịch mẹ.

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 việc lọc bổ sung trong đoạn mã 1 bằng mã nhận dạng mẹ (CampaignId="54678") giúp mã hoạt động hiệu quả hơn bằng cách hạn chế danh sách 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 cho các đối tượng bạn xử lý và sử dụng nhãn đó để lọ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
}
Xây dựng 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 tương tự nhau, đoạn mã thứ hai có xu hướng tạo mã phức tạp hơn vì số lượng điều kiện trong bộ chọn của bạn sẽ 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 của bạn

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 thực thể. Nhà phát triển thường thực hiện việc này bằng cách xây dựng một đoạn mã rất dài Truy vấn AWQL lọc các mã nhận dạng thực thể bằng mệnh đề IN. Phương pháp này sẽ hoạt động tốt khi số lượng thực thể bị giới hạn. Tuy nhiên, khi độ dài truy vấn của bạn tăng lên, thì hiệu suất của tập lệnh giảm sút do lý do:

  • Truy vấn dài hơn sẽ mất nhiều thời gian phân tích cú pháp hơn.
  • 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á, và nên 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 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)
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 mục Google Ads, tập lệnh Google Ads sẽ không thực thi thay đổi ngay lập tức. Thay vào đó, phương pháp này cố gắng kết hợp nhiều thay đổi thành theo 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 trên Google Ads máy chủ. 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 thao tác, do đó khiến tập lệnh của bạn chạy chậm.

Hãy xem xét đoạn mã sau đây giúp 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ập nhật (nên làm)
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 cá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ư phương pháp thứ hai, nhưng phương pháp đầu tiên có thêm lợi ích là hỗ trợ tính năng 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 gọi setCpc().

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

Tập lệnh Google Ads hỗ trợ hai 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 so với phương thức tạo, vì nó cho phép bạn quyền truy cập vào đối tượng được tạo qua 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)
adGroup.createKeyword('shoes');
var keyword = adGroup.keywords()
    .withCondition('KeywordText="shoes"')
    .get()
    .next();

Phương pháp 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 nếu sử dụng không đúng cách, trình tạo có thể ngăn tập lệnh Google Ads thực hiện các thao tác theo lô.

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 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ập nhật (nên làm)
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 vì gọi operation.getResult() trong cùng một vòng lặp tạo ra thao tác, do đó buộc các tập lệnh Google Ads để thực thi một thao tác tại một thời điểm. Mặc dù tương tự, phương pháp đầu tiên cho phép tạo lô vì chúng ta gọi activity.getResult() trong một vòng lặp khác với vị trí nó đã được 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 nhiệm vụ phổ biến mà 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 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. Thời gian bạn phải cập nhật một số lượng lớn các thực thể, thì tính năng tải lên hàng loạt thường mang lại cho bạn hiệu suất tốt hơn. Ví dụ: hãy xem xét các tập lệnh sau đây để 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 (í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 cho bạn 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ể truy xuất hoặc được cập nhật trong một lần chạy, cũng như 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 đó.

  • Phương thức 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à phương thức này có thể cập nhật và thời gian thực thi tổng thể.

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ính năng tải lên hàng loạt, hãy thử nhóm các hoạt động của bạn theo cấp độ gốc chiến dịch. Điều này làm tăng hiệu quả và giảm khả năng xảy ra lỗi thay đổi/đồng thời xung đột.

Hãy cân nhắc thực hiện song song 2 tác vụ tải lên hàng loạt. Một người dùng tạm dừng một quảng cáo group; phần còn lại điều chỉnh giá thầu từ khoá. Mặc dù các hoạt động không liên quan, 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 nhóm quảng cáo trong cùng một chiến dịch). Khi điều này xảy ra, hệ thống sẽ khoá pháp nhân mẹ (nhóm quảng cáo hoặc chiến dịch dùng chung), do đó dẫn đến việc tải lên hàng loạt nhiệm vụ bị 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, nhờ đó điều đơn giản nhất cần làm 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 lúc. Nếu bạn quyết định chạy nhiều lần tải lên hàng loạt trên 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 (và các thực thể con của chiến dịch) không trùng lặp để đạ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ể đó, tốt hơn là bạn nên sử dụng báo cáo thay vì các phương thức AdsApp tiêu chuẩn. Việc sử dụng báo cáo được ưu tiên vì những lý do sau:

  • Báo cáo giúp bạn đạt được 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 thông thường.

So sánh các đoạn mã sau giúp 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 nhấp chuột 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 lại AdsApp (không nên)
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ì nó lặp lại qua các từ khóa và truy xuất mỗi lần một thực thể số liệu thống kê. Báo cáo hoạt động nhanh hơn trong vì phương thức này 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ưới dạng là bắt buộc. Ngoài ra, các từ khoá được truy xuất theo phương pháp thứ hai sẽ được tính vào hạn mức của tập lệnh cho số lượng thực thể được truy xuất bằng lệnh gọi get().

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

Phương thức báo cáo được tạo 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àm này phải chuyển đổi kết quả của truy vấn để khớp với kiểu cũ. Kiểu này không được hỗ trợ cho tất cả các trường và làm tăng hao tổn cho mỗi lệnh gọi.

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

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

Đừ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 mình.

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 số phạm vi cụ thể. Bạn sẽ thực hiện nhanh hơn nếu tạo hai truy vấn riêng biệt, một truy vấn cho giá thầu thấp hơn ngưỡng dưới cùng và một truy vấn cho giá thầu cao hơn ngưỡng trên cùng, so với việc tìm nạp tất cả cá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 truy vấn 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 là thực thi tuần tự

Khi viết tập lệnh cho tài khoản người quản lý, hãy sử dụng executeInParallel() thực thi nối tiếp khi có thể. executeInParallel() cung cấp thêm cho tập lệnh của bạn 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). Xem các giới hạn của chúng tôi để biết thêm chi tiết.

Bảng tính

Sử dụng 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()) qua các phương thức cập nhật từng ô một.

Hãy xem xét đoạn mã tạo ra mẫu fractal trên 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)
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();
}

Trong khi Bảng tính Google cố gắng tối ưu hoá đoạn mã thứ hai bằng cách lưu vào bộ nhớ đệm nhưng nó vẫn sẽ mang lại hiệu suất kém so với đoạn mã đầu tiên, do vào số lệnh gọi API đang được thực hiện.