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