หน้านี้กล่าวถึงแนวทางปฏิบัติแนะนำที่หลากหลายสำหรับการพัฒนาด้วยสคริปต์ 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 มีประสิทธิภาพน้อยกว่าเนื่องจากเรากรองตามช่องที่ไม่ใช่ ID
กรองตามรหัสผู้ปกครองทุกครั้งที่ทำได้
เมื่อเลือกเอนทิตี ให้กรองตามรหัสหลักเมื่อใดก็ตามที่เป็นไปได้ วิธีนี้จะช่วยให้การค้นหารวดเร็วขึ้นโดยจำกัดรายการเอนทิตีที่เซิร์ฟเวอร์จะดึงมาเมื่อกรองผลลัพธ์
ลองใช้ข้อมูลโค้ดต่อไปนี้ที่เรียกกลุ่มโฆษณาตามรหัส สมมติว่าทราบรหัสแคมเปญหลัก
วิธีการเขียนโค้ด | ข้อมูลโค้ด |
---|---|
กรองตามรหัสแคมเปญและกลุ่มโฆษณา (แนะนำ) |
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
กรณีการใช้งานทั่วไปเมื่อเรียกใช้สคริปต์คือเรียกใช้รายงานเพื่อดูรายการเอนทิตี นักพัฒนาซอฟต์แวร์มักจะดำเนินการนี้ได้โดยสร้างคำค้นหา 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()
และดำเนินการเพียงครั้งเดียวเท่านั้น แม้วิธีแรกจะคล้ายกับวิธีที่ 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 ดำเนินการทีละรายการ แม้ว่าวิธีแรกจะคล้ายคลึงกัน แต่จะเป็นการอนุญาตให้รวมกลุ่ม เนื่องจากเราเรียกใช้ actions.get Results() ในลูปต่างจากที่สร้าง
พิจารณาใช้การอัปโหลดจำนวนมากสำหรับการอัปเดตขนาดใหญ่
งานทั่วไปที่นักพัฒนาซอฟต์แวร์ทำคือการเรียกใช้รายงานและอัปเดตพร็อพเพอร์ตี้เอนทิตี (เช่น การเสนอราคาระดับคีย์เวิร์ด) ตามค่าประสิทธิภาพปัจจุบัน เมื่อต้องอัปเดตเอนทิตีจำนวนมาก การอัปโหลดหลายรายการพร้อมกันมีแนวโน้มที่จะให้ประสิทธิภาพที่ดีกว่า ตัวอย่างเช่น ลองพิจารณาสคริปต์ต่อไปนี้ที่เพิ่ม 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 กลุ่มที่อยู่ในแคมเปญเดียวกัน) เมื่อเกิดกรณีนี้ขึ้น ระบบจะล็อกเอนทิตีหลัก (กลุ่มโฆษณาหรือแคมเปญที่ใช้ร่วมกัน) และทําให้การอัปโหลดจำนวนมากถูกบล็อกซึ่งกันและกัน
สคริปต์ 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 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 เพราะจะทำซ้ำตามคีย์เวิร์ดและดึงสถิติมาครั้งละ 1 รายการ รายงานจะทำงานได้เร็วขึ้นในกรณีนี้ เนื่องจากระบบจะดึงข้อมูลทั้งหมดในการเรียกครั้งเดียวและสตรีมตามที่จำเป็น นอกจากนี้ คีย์เวิร์ดที่ดึงมาในวิธีที่ 2 จะนับรวมในโควต้าของสคริปต์สำหรับจำนวนเอนทิตีที่ดึงโดยใช้การเรียก get()
ใช้การค้นหาแทนรายงาน
เมธอดรายงานสร้างขึ้นสำหรับโครงสร้างพื้นฐานเก่า และจะแสดงผลในรูปแบบ 2 มิติ แม้ว่าคุณจะใช้ GAQL อยู่ก็ตาม ซึ่งหมายความว่าจะต้องมีการเปลี่ยนผลการค้นหาของข้อความค้นหาให้ตรงกับรูปแบบเดิม ซึ่งจะไม่รองรับฟิลด์ทั้งหมดและเพิ่มค่าใช้จ่ายให้กับการเรียกแต่ละครั้ง
เราขอแนะนำให้คุณใช้การค้นหาแทนเพื่อใช้ประโยชน์จากฟีเจอร์ทั้งหมดของการรายงาน Google Ads API ใหม่
ต้องการใช้ GAQL กับ AWQL
แม้ว่า AWQL จะยังคงได้รับการรองรับในการค้นหารายงานและการเรียก withCondition
แต่ระบบจะเรียกใช้ผ่านเลเยอร์การแปลซึ่งไม่มีความเข้ากันได้อย่างสมบูรณ์กับ 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); } } |
สคริปต์ Ads Manager (MCC)
ต้องการ actionsInParallel มากกว่าการดำเนินการแบบอนุกรม
เมื่อเขียนสคริปต์สำหรับบัญชีดูแลจัดการ ให้ใช้ 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); |
อัปเดตทีละ 1 เซลล์ (ไม่แนะนำ) |
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 สเปรดชีตจะพยายามเพิ่มประสิทธิภาพข้อมูลโค้ดที่สองโดยการแคชค่า แต่ก็ยังคงให้ประสิทธิภาพที่ไม่ดีเมื่อเทียบกับข้อมูลโค้ดแรกเนื่องจากจำนวนการเรียก API ที่เกิดขึ้น