หน้านี้จะกล่าวถึงแนวทางปฏิบัติแนะนำต่างๆ ในการพัฒนาด้วยสคริปต์ 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()
การดําเนินการและดําเนินการเพียงครั้งละ 1 รายการ แนวทางแรกนั้นคล้ายกับแนวทางที่ 2 แต่มีข้อดีเพิ่มเติมคือรองรับการจัดกลุ่ม เนื่องจากgetCpc() จะเรียกใช้ในลูปแยกต่างหากจากลูปที่เรียกใช้ setCpc()
ใช้เครื่องมือสร้างเมื่อเป็นไปได้
สคริปต์ 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 เนื่องจากต้องมีการดำเนินการเลือกเพิ่มเติม ในการดึงข้อมูลคีย์เวิร์ด นอกจากนี้ เรายัง เลิกใช้งานวิธีการสร้างด้วย
อย่างไรก็ตาม โปรดทราบว่าเมื่อใช้เครื่องมือสร้างอย่างไม่ถูกต้อง เครื่องมือดังกล่าวอาจป้องกันไม่ให้สคริปต์ 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
ดำเนินการครั้งละ 1 รายการ แม้ว่าวิธีแรกจะคล้ายกัน แต่ก็อนุญาตให้มีการประมวลผลเป็นกลุ่มเนื่องจากเราเรียกใช้ 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 สามารถเพิ่มประสิทธิภาพการดำเนินการภายในงานการอัปโหลดหลายรายการงานเดียวได้ ดังนั้น สิ่งที่ง่ายที่สุดคือการเรียกใช้งานการอัปโหลดหลายรายการเพียง 1 งานต่อบัญชีในแต่ละครั้ง หากคุณตัดสินใจที่จะเรียกใช้การอัปโหลดหลายรายการต่อบัญชี โปรดตรวจสอบว่าการอัปโหลดหลายรายการทำงานในรายการแคมเปญที่ใช้ร่วมกันไม่ได้ (และเอนทิตีย่อยของแคมเปญ) เพื่อประสิทธิภาพสูงสุด
การรายงาน
ใช้รายงานเพื่อดึงข้อมูลสถิติ
เมื่อต้องการดึงข้อมูลเอนทิตีและสถิติจำนวนมาก การใช้รายงานมักจะดีกว่าการใช้วิธีมาตรฐานของ 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 (ไม่แนะนำ) |
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