หน้านี้จะกล่าวถึงแนวทางปฏิบัติแนะนำต่างๆ ในการพัฒนาด้วยสคริปต์ Google Ads
ตัวเลือก
กรองด้วยตัวเลือก
เมื่อเป็นไปได้ ให้ใช้ตัวกรองเพื่อขอเฉพาะเอนทิตีที่คุณต้องการ การใช้ตัวกรองที่เหมาะสมมีประโยชน์ดังนี้
- โค้ดจะง่ายขึ้นและเข้าใจได้ง่ายขึ้น
- สคริปต์จะทำงานเร็วขึ้นมาก
เปรียบเทียบข้อมูลโค้ดต่อไปนี้
| แนวทางการเขียนโค้ด | ข้อมูลโค้ด |
|---|---|
| กรองโดยใช้ตัวเลือก (แนะนำ) |
var keywords = AdsApp.keywords()
.withCondition('Clicks > 10')
.forDateRange('LAST_MONTH')
.get();
while (keywords.hasNext()) {
var keyword = keywords.next();
// Do work here.
}
|
| กรองในโค้ด (ไม่แนะนำ) |
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.
}
}
|
เราไม่แนะนำวิธีที่ 2 เนื่องจากวิธีนี้จะพยายามดึงข้อมูลรายการคีย์เวิร์ดทั้งหมดในบัญชีเพื่อใช้ตัวกรองกับรายการเท่านั้น
หลีกเลี่ยงการข้ามลำดับชั้นแคมเปญ
เมื่อต้องการดึงข้อมูลเอนทิตีในระดับที่เฉพาะเจาะจง ให้ใช้วิธีการรวบรวมในระดับนั้นแทนการข้ามลําดับชั้นของแคมเปญทั้งหมด นอกเหนือจากความเรียบง่ายแล้ว วิธีนี้ยังทํางานได้ดีกว่ามาก เนื่องจากระบบ ไม่ต้องอ่านแคมเปญและกลุ่มโฆษณาทั้งหมดโดยไม่จําเป็น
เปรียบเทียบข้อมูลโค้ดต่อไปนี้ที่ดึงโฆษณาทั้งหมดในบัญชี
| แนวทางการเขียนโค้ด | ข้อมูลโค้ด |
|---|---|
| ใช้วิธีการเก็บรวบรวมที่เหมาะสม (แนะนำ) |
var ads = AdsApp.ads(); |
| ข้ามลำดับชั้น (ไม่แนะนำ) |
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.
}
}
|
ไม่แนะนําให้ใช้วิธีที่ 2 เนื่องจากพยายามดึงลําดับชั้นของออบเจ็กต์ทั้งหมด (แคมเปญ กลุ่มโฆษณา) เมื่อต้องการเฉพาะโฆษณา
ใช้วิธีการเข้าถึงองค์ประกอบหลักที่เฉพาะเจาะจง
บางครั้งคุณจำเป็นต้องรับเอนทิตีหลักของออบเจ็กต์ที่ดึงมา ในกรณีนี้ คุณควรใช้วิธีเข้าถึงข้อมูลลับที่ให้มาแทนการดึงข้อมูลลำดับชั้นทั้งหมด
เปรียบเทียบข้อมูลโค้ดต่อไปนี้ที่ดึงข้อมูลกลุ่มโฆษณาที่มีโฆษณาแบบข้อความซึ่งมีจำนวนคลิกมากกว่า 50 ครั้งในเดือนที่ผ่านมา
| แนวทางการเขียนโค้ด | ข้อมูลโค้ด |
|---|---|
| ใช้วิธีเข้าถึงข้อมูลลับระดับบนที่เหมาะสม (แนะนำ) |
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.
}
|
| ข้ามลำดับชั้น (ไม่แนะนำ) |
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.
}
}
}
|
เราไม่แนะนําให้ใช้วิธีที่ 2 เนื่องจากจะดึงลําดับชั้นของแคมเปญและกลุ่มโฆษณาทั้งหมดในบัญชีของคุณ ในขณะที่คุณต้องการเพียงชุดย่อยของแคมเปญและกลุ่มโฆษณาที่เชื่อมโยงกับชุดโฆษณาของคุณ แนวทางแรกจะจำกัดตัวเองให้ดึงข้อมูลเฉพาะคอลเล็กชันโฆษณาที่เกี่ยวข้อง และใช้วิธีที่เหมาะสมในการเข้าถึงออบเจ็กต์หลัก
ใช้ตัวกรองหลักที่เฉพาะเจาะจง
หากต้องการเข้าถึงเอนทิตีภายในแคมเปญหรือกลุ่มโฆษณาที่เฉพาะเจาะจง ให้ใช้ตัวกรองที่เฉพาะเจาะจง ในเครื่องมือเลือกแทนการดึงข้อมูลแล้วไปยังลําดับชั้น
เปรียบเทียบข้อมูลโค้ดต่อไปนี้ที่ดึงข้อมูลรายการโฆษณาแบบข้อความภายในแคมเปญและกลุ่มโฆษณาที่ระบุซึ่งมีการคลิกมากกว่า 50 ครั้งในเดือนที่ผ่านมา
| แนวทางการเขียนโค้ด | ข้อมูลโค้ด |
|---|---|
| ใช้ตัวกรองระดับบนที่เหมาะสม (แนะนำ) |
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.
}
|
| ไปยังลำดับชั้น (ไม่แนะนำ) |
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.
}
}
}
|
เราไม่แนะนำวิธีที่ 2 เนื่องจากจะทำซ้ำในลำดับชั้นของแคมเปญและกลุ่มโฆษณาในบัญชี เมื่อคุณต้องการเพียงชุดโฆษณาที่เลือก รวมถึงแคมเปญและกลุ่มโฆษณาหลักเท่านั้น วิธีแรกจะจำกัดการทำซ้ำในรายการโฆษณาโดยใช้ตัวกรองเฉพาะสำหรับเอนทิตีหลักในตัวเลือก
ใช้รหัสเพื่อกรองเมื่อเป็นไปได้
เมื่อกรองเอนทิตี เราขอแนะนำให้กรองเอนทิตีตามรหัสแทนช่องอื่นๆ
พิจารณาข้อมูลโค้ดต่อไปนี้ที่เลือกแคมเปญ
| แนวทางการเขียนโค้ด | ข้อมูลโค้ด |
|---|---|
| กรองตามรหัส (แนะนำ) |
var campaign = AdsApp.campaigns()
.withIds([12345])
.get()
.next();
|
| กรองตามชื่อ (ประสิทธิภาพต่ำกว่า) |
var campaign = AdsApp.campaigns()
.withCondition('Name="foo"')
.get()
.next();
|
วิธีที่ 2 มีประสิทธิภาพน้อยกว่าเนื่องจากเรากรองตามฟิลด์ที่ไม่ใช่รหัส
กรองตามรหัสผู้ปกครองทุกครั้งที่ทำได้
เมื่อเลือกเอนทิตี ให้กรองตามรหัสหลักทุกครั้งที่ทำได้ ซึ่งจะช่วยให้การค้นหาเร็วขึ้นโดยการจำกัดรายการเอนทิตีที่เซิร์ฟเวอร์ดึงข้อมูลเมื่อกรองผลลัพธ์
พิจารณาข้อมูลโค้ดต่อไปนี้ที่ดึงข้อมูล AdGroup ตามรหัส สมมติว่าทราบรหัสแคมเปญหลัก
| แนวทางการเขียนโค้ด | ข้อมูลโค้ด |
|---|---|
| กรองตามรหัสแคมเปญและกลุ่มโฆษณา (แนะนํา) |
var adGroup = AdsApp.adGroups()
.withIds([12345])
.withCondition('CampaignId="54678"')
.get()
.next();
|
| กรองตามรหัสกลุ่มโฆษณาเพียงอย่างเดียว (มีประสิทธิภาพน้อยกว่า) |
var adGroup = AdsApp.adGroups()
.withIds([12345])
.get()
.next();
|
แม้ว่าข้อมูลโค้ดทั้ง 2 รายการจะให้ผลลัพธ์ที่เหมือนกัน แต่การกรองเพิ่มเติมในข้อมูลโค้ด 1 โดยใช้รหัสระดับบนสุด (CampaignId="54678") จะทำให้โค้ดมีประสิทธิภาพมากขึ้นโดยการจำกัดรายการเอนทิตีที่เซิร์ฟเวอร์ต้องทำซ้ำเมื่อกรองผลลัพธ์
ใช้ป้ายกำกับเมื่อมีเงื่อนไขตัวกรองมากเกินไป
เมื่อมีเงื่อนไขตัวกรองมากเกินไป คุณควรสร้างป้ายกำกับสำหรับเอนทิตีที่ประมวลผล และใช้ป้ายกำกับนั้นเพื่อกรองเอนทิตี
พิจารณาข้อมูลโค้ดต่อไปนี้ที่ดึงข้อมูลรายการแคมเปญตามชื่อ
| แนวทางการเขียนโค้ด | ข้อมูลโค้ด |
|---|---|
| ใช้ป้ายกำกับ (แนะนำ) |
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
}
|
| สร้างตัวเลือกที่ซับซ้อน (ไม่แนะนำ) |
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.
}
|
แม้ว่าข้อมูลโค้ดทั้ง 2 รายการจะให้ประสิทธิภาพในระดับที่ใกล้เคียงกัน แต่วิธีที่ 2 มีแนวโน้มที่จะสร้างโค้ดที่ซับซ้อนมากขึ้นเมื่อจำนวนเงื่อนไขในตัวเลือกเพิ่มขึ้น นอกจากนี้ การใช้ป้ายกำกับกับเอนทิตีใหม่ยังง่ายกว่าการแก้ไขสคริปต์เพื่อรวมเอนทิตีใหม่ด้วย
จำกัดจำนวนเงื่อนไขในส่วนคำสั่ง IN
เมื่อเรียกใช้สคริปต์ Use Case ทั่วไปคือการเรียกใช้รายงานสำหรับรายการเอนทิตี โดยปกตินักพัฒนาแอปจะทำเช่นนี้โดยสร้างคำค้นหา GAQL ที่ยาวมากซึ่งกรองรหัสเอนทิตีโดยใช้ส่วนคำสั่ง IN วิธีนี้ใช้ได้ดีเมื่อจำนวนเอนทิตีมีจำกัด อย่างไรก็ตาม เมื่อความยาวของคำค้นหาเพิ่มขึ้น ประสิทธิภาพของสคริปต์จะลดลงเนื่องจาก 2 สาเหตุต่อไปนี้
- คำค้นหาที่ยาวขึ้นจะใช้เวลานานขึ้นในการแยกวิเคราะห์
- รหัสแต่ละรายการที่คุณเพิ่มลงในคําสั่ง IN คือเงื่อนไขเพิ่มเติมที่จะประเมิน และ จึงใช้เวลานานขึ้น
ในกรณีเช่นนี้ คุณควรใช้ป้ายกำกับกับเอนทิตี แล้วกรองตาม LabelId
| แนวทางการเขียนโค้ด | ข้อมูลโค้ด |
|---|---|
| ใช้ป้ายกำกับและกรองตาม LabelID (แนะนำ) |
// 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() + '"');
|
| สร้างการค้นหาแบบยาวโดยใช้ส่วนคำสั่ง IN (ไม่แนะนำ) |
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…)');
|
การอัปเดตบัญชี
การเปลี่ยนแปลงเป็นกลุ่ม
เมื่อคุณทำการเปลี่ยนแปลงเอนทิตี Google Ads สคริปต์ Google Ads จะไม่ ดำเนินการเปลี่ยนแปลงทันที แต่จะพยายามรวมการเปลี่ยนแปลงหลายรายการเป็นกลุ่ม เพื่อให้สามารถส่งคำขอเดียวที่ทำการเปลี่ยนแปลงหลายรายการได้ วิธีนี้จะทำให้สคริปต์ทำงานเร็วขึ้นและลดภาระงานบนเซิร์ฟเวอร์ Google Ads อย่างไรก็ตาม มีรูปแบบโค้ดบางอย่างที่บังคับให้สคริปต์ Google Ads ล้างชุดการดำเนินการบ่อยครั้ง ซึ่งทำให้สคริปต์ทำงานช้า
พิจารณาสคริปต์ต่อไปนี้ซึ่งอัปเดตราคาเสนอของรายการคีย์เวิร์ด
| แนวทางการเขียนโค้ด | ข้อมูลโค้ด |
|---|---|
| ติดตามองค์ประกอบที่อัปเดต (แนะนำ) |
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());
}
|
| ดึงข้อมูลองค์ประกอบที่อัปเดตในลูปที่แน่น (ไม่แนะนำ) |
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());
}
|
เราไม่แนะนำให้ใช้วิธีที่ 2 เนื่องจากเรียกใช้ keyword.bidding().getCpc() จะบังคับให้สคริปต์ Google Ads ล้างการดำเนินการ setCpc() และดำเนินการทีละรายการเท่านั้น แนวทางแรกแม้จะคล้ายกับแนวทางที่ 2 แต่ก็มีประโยชน์เพิ่มเติมในการรองรับการจัดกลุ่ม เนื่องจากมีการเรียก getCpc() ในลูปแยกต่างหากจากลูปที่มีการเรียก setCpc()
ใช้ Builder เมื่อเป็นไปได้
สคริปต์ Google Ads รองรับการสร้างออบเจ็กต์ใหม่ 2 วิธี ได้แก่ เครื่องมือสร้างและวิธีการสร้าง บิลเดอร์มีความยืดหยุ่นมากกว่าวิธีการสร้าง เนื่องจากบิลเดอร์ให้สิทธิ์เข้าถึงออบเจ็กต์ที่สร้างจากการเรียก API
ลองพิจารณาข้อมูลโค้ดต่อไปนี้
| แนวทางการเขียนโค้ด | ข้อมูลโค้ด |
|---|---|
| ใช้เครื่องมือสร้าง (แนะนำ) |
var operation = adGroup.newKeywordBuilder()
.withText('shoes')
.build();
var keyword = operation.getResult();
|
| ใช้วิธีการสร้าง (ไม่แนะนำ) |
adGroup.createKeyword('shoes');
var keyword = adGroup.keywords()
.withCondition('KeywordText="shoes"')
.get()
.next();
|
ไม่แนะนำให้ใช้วิธีที่ 2 เนื่องจากต้องมีการดำเนินการเลือกเพิ่มเติม ในการดึงคีย์เวิร์ด นอกจากนี้ เรายังเลิกใช้งานเมธอดการสร้างด้วย
อย่างไรก็ตาม โปรดทราบว่าหากใช้ Builder อย่างไม่ถูกต้อง อาจทำให้สคริปต์ Google Ads ไม่สามารถจัดกลุ่มการดำเนินการได้
พิจารณาข้อมูลโค้ดต่อไปนี้ที่สร้างรายการคีย์เวิร์ดและพิมพ์รหัสของคีย์เวิร์ดที่สร้างขึ้นใหม่
| แนวทางการเขียนโค้ด | ข้อมูลโค้ด |
|---|---|
| ติดตามองค์ประกอบที่อัปเดต (แนะนำ) |
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());
}
|
| ดึงข้อมูลองค์ประกอบที่อัปเดตในลูปที่แน่น (ไม่แนะนำ) |
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());
}
|
เราไม่แนะนำให้ใช้วิธีที่ 2 เนื่องจากมีการเรียกใช้ operation.getResult() ภายในลูปเดียวกันกับที่สร้างการดำเนินการ จึงทำให้สคริปต์ Google Ads ต้องดำเนินการทีละรายการ วิธีแรกแม้จะคล้ายกัน แต่ก็อนุญาตให้มีการประมวลผลแบบกลุ่มเนื่องจากเราเรียกใช้ operation.getResult() ในลูปอื่นที่ไม่ใช่ลูปที่สร้างขึ้น
ลองใช้การอัปโหลดหลายรายการพร้อมกันสำหรับการอัปเดตจำนวนมาก
งานที่นักพัฒนาแอปทำเป็นประจำคือการเรียกใช้รายงานและอัปเดตพร็อพเพอร์ตี้เอนทิตี (เช่น การเสนอราคาระดับคีย์เวิร์ด) โดยอิงตามค่าประสิทธิภาพปัจจุบัน เมื่อคุณต้องอัปเดตเอนทิตีจำนวนมาก การอัปโหลดหลายรายการพร้อมกันมักจะให้ประสิทธิภาพที่ดีกว่า ตัวอย่างเช่น ลองพิจารณาสคริปต์ต่อไปนี้ที่เพิ่ม MaxCpc ของคีย์เวิร์ดที่มี TopImpressionPercentage > 0.4 ในเดือนที่ผ่านมา
| แนวทางการเขียนโค้ด | ข้อมูลโค้ด |
|---|---|
| ใช้การอัปโหลดหลายรายการพร้อมกัน (แนะนำ) |
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();
|
| เลือกและอัปเดตคีย์เวิร์ดตามรหัส (ประสิทธิภาพน้อยกว่า) |
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);
}
}
|
แม้ว่าแนวทางที่ 2 จะให้ประสิทธิภาพที่ดีพอสมควร แต่แนวทางแรกเป็นแนวทางที่แนะนำในกรณีนี้เนื่องจาก
สคริปต์ Google Ads มีขีดจํากัดจํานวนออบเจ็กต์ที่เรียกข้อมูลหรืออัปเดตได้ในการเรียกใช้ครั้งเดียว และการดําเนินการเลือกและอัปเดตในแนวทางที่ 2 จะนับรวมในขีดจํากัดนั้น
การอัปโหลดหลายรายการพร้อมกันมีขีดจำกัดที่สูงกว่าทั้งในแง่ของจำนวนเอนทิตีที่อัปเดตได้ และเวลาในการดำเนินการโดยรวม
จัดกลุ่มการอัปโหลดหลายรายการพร้อมกันตามแคมเปญ
เมื่อสร้างการอัปโหลดหลายรายการพร้อมกัน ให้พยายามจัดกลุ่มการดำเนินการตามแคมเปญหลัก ซึ่งจะเพิ่มประสิทธิภาพและลดโอกาสที่จะเกิดการเปลี่ยนแปลงที่ขัดแย้งกัน / ข้อผิดพลาดเกี่ยวกับความพร้อมกัน
พิจารณางานการอัปโหลดหลายรายการพร้อมกัน 2 งานที่ทำงานแบบคู่ขนาน กฎหนึ่งจะหยุดโฆษณาในกลุ่มโฆษณาชั่วคราว ส่วนอีกกฎจะปรับราคาเสนอระดับคีย์เวิร์ด แม้ว่าการดำเนินการจะไม่เกี่ยวข้องกัน แต่การดำเนินการอาจใช้กับเอนทิตีภายใต้กลุ่มโฆษณาเดียวกัน (หรือกลุ่มโฆษณา 2 กลุ่มที่แตกต่างกันภายใต้แคมเปญเดียวกัน) เมื่อเกิดกรณีนี้ขึ้น ระบบจะล็อกเอนทิตีหลัก (กลุ่มโฆษณาหรือแคมเปญที่แชร์) ซึ่งจะทำให้งานอัปโหลดหลายรายการพร้อมกันบล็อกกันเอง
สคริปต์ Google Ads สามารถเพิ่มประสิทธิภาพการดำเนินการภายในงานการอัปโหลดหลายรายการพร้อมกันเพียงงานเดียวได้ ดังนั้นสิ่งที่ง่ายที่สุดที่ควรทำคือการเรียกใช้งานการอัปโหลดหลายรายการพร้อมกันเพียงงานเดียวต่อบัญชีในแต่ละครั้ง หากคุณตัดสินใจที่จะเรียกใช้การอัปโหลดหลายรายการต่อบัญชี โปรดตรวจสอบว่าการอัปโหลดหลายรายการทำงานในรายการแคมเปญที่ใช้ร่วมกันไม่ได้ (และเอนทิตีย่อยของแคมเปญ) เพื่อให้ได้ประสิทธิภาพสูงสุด
การรายงาน
ใช้รายงานเพื่อดึงข้อมูลสถิติ
เมื่อต้องการดึงข้อมูลเอนทิตีจำนวนมากและสถิติของเอนทิตีเหล่านั้น การใช้รายงานมักจะดีกว่าการใช้วิธีการ AdsApp มาตรฐาน เราขอแนะนำให้ใช้รายงานเนื่องจากเหตุผลต่อไปนี้
- รายงานช่วยให้คุณค้นหาข้อมูลขนาดใหญ่ได้อย่างมีประสิทธิภาพมากขึ้น
- รายงานจะไม่ใช้โควต้าการดึงข้อมูลปกติ
เปรียบเทียบข้อมูลโค้ดต่อไปนี้ที่ดึงข้อมูลการคลิก การแสดงผล ต้นทุน และข้อความของคีย์เวิร์ดทั้งหมดที่ได้รับการคลิกมากกว่า 50 ครั้งในเดือนที่แล้ว
| แนวทางการเขียนโค้ด | ข้อมูลโค้ด |
|---|---|
| ใช้รายงาน (แนะนํา) |
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);
}
|
| ใช้ AdsApp Iterator (ไม่แนะนำ) |
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());
}
|
ไม่แนะนำให้ใช้วิธีที่ 2 เนื่องจากจะวนซ้ำคีย์เวิร์ด
และดึงข้อมูลสถิติทีละเอนทิตี รายงานจะทำงานได้เร็วขึ้นในกรณีนี้เนื่องจากจะดึงข้อมูลทั้งหมดในการเรียกใช้ครั้งเดียวและสตรีมข้อมูลตามที่จำเป็น นอกจากนี้ คีย์เวิร์ดที่ดึงมาในแนวทางที่ 2 จะนับรวมในโควต้าของสคริปต์สำหรับจำนวนเอนทิตีที่ดึงมาโดยใช้การเรียก get()
ใช้การค้นหาแทนรายงาน
วิธีการรายงานสร้างขึ้นสำหรับโครงสร้างพื้นฐานเดิม และจะแสดงผลลัพธ์ ในรูปแบบแบนราบแม้ว่าคุณจะใช้ GAQL ก็ตาม ซึ่งหมายความว่าต้อง แปลงผลลัพธ์ของคำค้นหาให้ตรงกับรูปแบบเก่า ซึ่งไม่ รองรับในทุกช่อง และเพิ่มค่าใช้จ่ายในการเรียกแต่ละครั้ง
เราขอแนะนําให้ใช้การค้นหาแทนเพื่อใช้ประโยชน์จากฟีเจอร์ทั้งหมดของการรายงาน Google Ads API ใหม่
ใช้ GAQL แทน AWQL
แม้ว่าในทางเทคนิคแล้ว AWQL จะยังคงใช้ได้กับการค้นหารายงานและการเรียกใช้ withCondition แต่เราไม่แนะนำให้ใช้ หากต้องการควบคุมคำค้นหาได้อย่างสมบูรณ์ โปรดตรวจสอบว่าคุณใช้ GAQL แทน
อย่าเลือกแถวมากกว่าที่จำเป็น
ความเร็วในการดำเนินการของรายงาน (และตัวเลือก) จะขึ้นอยู่กับจำนวนแถวทั้งหมดที่รายงานจะแสดงผล ไม่ว่าคุณจะทำซ้ำหรือไม่ก็ตาม ซึ่งหมายความว่าคุณควรใช้ตัวกรองที่เฉพาะเจาะจงเสมอเพื่อลดชุดผลลัพธ์ให้มากที่สุดเท่าที่จะเป็นไปได้เพื่อให้ตรงกับกรณีการใช้งานของคุณ
เช่น สมมติว่าคุณต้องการค้นหากลุ่มโฆษณาที่มีราคาเสนอนอกช่วงที่เฉพาะเจาะจง การทําคําค้นหาแยกกัน 2 รายการ รายการหนึ่งสําหรับราคาเสนอที่ต่ำกว่า เกณฑ์ล่าง และอีกรายการสําหรับราคาเสนอที่สูงกว่าเกณฑ์บน จะเร็วกว่า การดึงข้อมูลกลุ่มโฆษณาทั้งหมดและละเว้นกลุ่มที่คุณไม่สนใจ
| แนวทางการเขียนโค้ด | ข้อมูลโค้ด |
|---|---|
| ใช้การค้นหา 2 รายการ (แนะนำ) |
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);
}
|
| กรองจากคำค้นหาทั่วไป (ไม่แนะนำ) |
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);
}
}
|
สคริปต์บัญชีดูแลจัดการ Google Ads (MCC)
ใช้ executeInParallel แทนการดำเนินการแบบอนุกรม
เมื่อเขียนสคริปต์สำหรับบัญชีดูแลจัดการ ให้ใช้ executeInParallel() แทนการดำเนินการแบบต่อเนื่องเมื่อเป็นไปได้ executeInParallel() ช่วยให้สคริปต์มีเวลาประมวลผลมากขึ้น (สูงสุด 1 ชั่วโมง) และสูงสุด 30 นาทีต่อบัญชีที่ประมวลผล (แทนที่จะเป็น 30 นาทีรวมกันสำหรับการดำเนินการแบบต่อเนื่อง) ดูรายละเอียดเพิ่มเติมได้ที่หน้าโควต้า
สเปรดชีต
ใช้การดำเนินการเป็นกลุ่มเมื่ออัปเดตสเปรดชีต
เมื่ออัปเดตสเปรดชีต ให้ลองใช้วิธีการดำเนินการแบบกลุ่ม (เช่น getRange()) แทนวิธีการที่อัปเดตทีละเซลล์
ลองพิจารณาข้อมูลโค้ดต่อไปนี้ที่สร้างรูปแบบแฟร็กทัลในสเปรดชีต
| แนวทางการเขียนโค้ด | ข้อมูลโค้ด |
|---|---|
| อัปเดตช่วงเซลล์ในการเรียกใช้ครั้งเดียว (แนะนำ) |
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);
|
| อัปเดตเซลล์ทีละเซลล์ (ไม่แนะนำ) |
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();
}
|
แม้ว่า Google สเปรดชีตจะพยายามเพิ่มประสิทธิภาพข้อมูลโค้ดที่ 2 โดยการแคชค่า แต่ก็ยังคงมีประสิทธิภาพต่ำเมื่อเทียบกับข้อมูลโค้ดแรก เนื่องจากมีการเรียก API จำนวนมาก