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ể mà bạn cần. Việc áp dụng bộ lọc phù hợp mang lại các 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ả cá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 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(); |
Di chuyển 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ệ 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 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 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 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 nhóm quảng cáo của mình. 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 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 (í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 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ể. Điều 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 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 AdGroup đó. 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 cơ chế lọc bổ sung trong đoạn mã 1 sử dụng mã nhận dạng mẹ (CampaignId="54678")
sẽ 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 một 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 đương nhau, nhưng phương pháp thứ hai có xu hướng tạo 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 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 truy vấn AWQL rất dài để lọc các mã nhận dạng thực thể bằng cách sử dụng mệnh đề IN. Phương pháp này sẽ hiệu quả 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 của tập lệnh sẽ giảm do hai 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 bạn thêm vào mệnh đề IN là một điều kiện bổ sung để đá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ể, 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 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 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 đó, phương thức này 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 nhanh hơn và giảm tải trên 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 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 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. Phương pháp đầu tiên, mặc dù tương tự như phương pháp thứ hai, nhưng 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ợ 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 các phương thức tạo vì 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 lựa chọn bổ sung có 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 trình tạo, khi được sử dụng không đúng cách, có thể ngăn các tập lệnh Google Ads phân lô các hoạt động của nó.
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 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()); } |
Bạn không nên sử dụng phương pháp thứ hai vì phương pháp này gọi operation.getResult()
trong cùng một vòng lặp tạo ra toán tử, do đó buộc các tập lệnh Google Ads phải thực thi một toán tử tại một thời điểm. Mặc dù tương tự, phương pháp đầu tiên cho phép phân lô vì chúng ta gọi Operations.getResult() trong một vòng lặp khác với nơi tạo ra.
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. Khi bạn phải cập nhật một 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 để 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ã (í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 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ẽ 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 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 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 xem xét hai tác vụ tải lên hàng loạt chạy song song. Một chiến dịch tạm dừng quảng cáo trong một nhóm quảng cáo; chiến dịch còn lại đ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 dùng chung), 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 tác vụ tải lên hàng loạt, vì vậy, điều đơn giản nhất bạn nê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 cùng một lúc. Nếu bạn quyết định chạy nhiều chiến dịch 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 loại trừ lẫn nhau các chiến dịch (và các thực thể con của chiến dịch) để 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. 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ó đượ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 đâ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 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()); } |
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 các từ khoá và truy xuất số liệu thống kê từng thực thể một. Báo cáo hoạt động nhanh hơn trong trường hợp này 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 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 cho 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 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à thao tác này 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à làm tăng mức 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
, nhưng AWQL sẽ 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. Để 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.
Nếu bạn hiện có các truy vấn AWQL và muốn dịch, chúng tôi có Công cụ di chuyển truy vấn để trợ giúp bạ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 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 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()
thay vì thực thi tuần tự khi 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 tuần tự). 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 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 để tạo 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 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.