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 phù 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 dùng phương pháp thứ hai vì phương pháp này chỉ tìm cách truy xuất danh sách tất cả các từ khoá trong tài khoản của bạn để áp dụng một bộ lọc cho danh sách đó.
Tránh đi 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ả cá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(); |
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. } } |
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ệ thống phân cấp của các đối tượng (chiến dịch, nhóm quảng cáo) trong khi chỉ cần quảng cáo.
Sử dụng các phương thức truy cập dành riêng cho đối tượng gốc
Đôi khi, bạn cần lấy thực thể mẹ của một đối tượng đã 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 những 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 đối tượng 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. } } } |
Cách thứ hai không được khuyến khích vì cách này 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 nhóm nhỏ các 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 bạn. Phương pháp đầu tiên chỉ giới hạn ở việc 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ẹ của bộ sưu tập đó.
Sử dụng bộ lọc cụ thể 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 duyệt qua một hệ thống 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 cha mẹ 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 dùng phương pháp thứ hai vì phương pháp này 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 và chiến dịch cũng như nhóm quảng cáo mẹ của nhóm quảng cáo đó. Phương pháp đầu tiên giới hạn quá trình 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 các thực thể, bạn nên lọc cá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) |
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 một trường không phải là trường 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 cấp trên bất cứ khi nào có thể. Thao tác 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 một AdGroup theo mã nhận dạng của nhóm đó. 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 (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 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 (CampaignId="54678")
của thành phần mẹ 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 cho bạn mức 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 của bạ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ể. 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 theo mã nhận dạng thực thể bằng cách sử dụng mệnh đề IN. Phương pháp này hoạt động tốt khi số lượng thực thể bị hạn chế. 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:
- Một 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ột mệnh đề IN là một điều kiện bổ sung cần đánh giá, 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ể, rồi 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 theo lô
Khi bạn thay đổ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 các tập lệnh của bạn chạy nhanh hơn và giảm tải cho các máy chủ của 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ậ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()); } |
Cách thứ hai không được khuyến khích 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ì 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 phương thức tạo (không nê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 do thao tác 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 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ậ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()); } |
Phương pháp thứ hai không được ưu tiên vì phương pháp 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 hiện từng thao tác một. Mặc dù tương tự, nhưng phương pháp đầu tiên cho phép xử lý hàng loạt vì chúng ta gọi operation.getResult() trong một vòng lặp khác với vòng lặp mà phương thức này đượ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 nội dung cập nhật lớn
Một tác 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. 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 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 vừa qua:
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) |
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 tạo các 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 2 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ẻ), do đó, các tác vụ tải lên hàng loạt sẽ 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 duy nhấ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ượt 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ượt 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) loại trừ lẫn nhau để đạ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 muốn truy xuất số lượng lớn các thực thể và số liệu thống kê của chúng, bạn nên sử dụng báo cáo thay vì các phương thức AdsApp tiêu 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 cải thiện hiệu suất cho các truy vấn lớn.
- Báo cáo sẽ không bị ảnh hưởng bởi hạn mức tìm nạp thông 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 vào 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 theo 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 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à bạn 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 chi phí 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 được hỗ trợ trong các truy vấn báo cáo và lệnh gọi withCondition
, nhưng AWQL được chạy thông qua một lớp dịch không hoàn toàn tương thích với AWQL thực. Để có toàn quyền kiểm soát các truy vấn, hãy đảm bảo rằng bạn đang sử dụng GAQL.
Nếu bạn có cá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.
Đừng chọn nhiều hàng hơn mức cần thiết
Tốc độ thực thi của 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ối đa tập hợp kết quả 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ể. Sẽ nhanh hơn nếu bạn thực hiện 2 truy vấn riêng biệt, một truy vấn cho giá thầu dưới ngưỡng dưới cùng và một truy vấn khác cho giá thầu trên ngưỡng trên cùng, thay vì tìm nạp tất cả các nhóm quảng cáo và bỏ qua những nhóm mà bạn không quan tâm.
Phương pháp lập trình | Đoạn mã |
---|---|
Sử dụng 2 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ì 30 phút kết hợp cho quá trình thực thi nối tiếp). Hãy xem trang giới hạn của chúng tôi để biết thêm thông tin.
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 ô tại một thời điểm.
Hãy xem xét đoạn mã sau đây tạo ra một 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 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 trữ 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.