แนวทางปฏิบัติแนะนำ

หน้านี้จะกล่าวถึงแนวทางปฏิบัติแนะนำต่างๆ ในการพัฒนาด้วยสคริปต์ 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.
}

แม้ว่าข้อมูลโค้ดทั้งสองจะให้ประสิทธิภาพในระดับใกล้เคียงกัน มีแนวโน้มที่จะสร้างโค้ดที่ซับซ้อนมากขึ้นตามจำนวนเงื่อนไขใน ตัวเลือกเพิ่มขึ้น ใช้ป้ายกำกับกับเอนทิตีใหม่ได้ง่ายขึ้น มากกว่าการแก้ไขสคริปต์ เพื่อเพิ่มเอนทิตีใหม่

จํากัดจํานวนเงื่อนไขในประโยค IN

เมื่อเรียกใช้สคริปต์ กรณีการใช้งานทั่วไปคือการเรียกใช้รายงานสำหรับลิสต์ของ เอนทิตี โดยปกติแล้วนักพัฒนาแอปจะดำเนินการนี้ด้วยการสร้างการค้นหา AWQL ที่ยาวมากซึ่งกรองตามรหัสเอนทิตีโดยใช้ประโยค IN แนวทางนี้ได้ผลดีเมื่อจํานวนเอนทิตีมีจํากัด แต่อย่างไรก็ตาม ของข้อความค้นหาเพิ่มขึ้น ประสิทธิภาพสคริปต์ของคุณลดลงเนื่องจาก เหตุผล:

  • คำค้นหาที่ยาวกว่าจะใช้เวลาในการแยกวิเคราะห์นานขึ้น
  • รหัสแต่ละรายการที่คุณเพิ่มลงในอนุประโยค 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();

ไม่แนะนำให้ใช้วิธีการที่สองเนื่องจากมีการดำเนินการเลือกเพิ่มเติม ที่เกี่ยวข้องในการเรียกคีย์เวิร์ด นอกจากนี้ วิธีสร้าง เลิกใช้งานแล้ว

อย่างไรก็ตาม โปรดทราบว่าเมื่อใช้อย่างไม่ถูกต้อง เครื่องมือสร้างอาจขัดขวางไม่ให้ Google สคริปต์โฆษณาจากการรวมการดำเนินการเป็นกลุ่ม

ลองใช้ข้อมูลโค้ดต่อไปนี้ซึ่งจะสร้างรายการคีย์เวิร์ด และพิมพ์รหัสของคีย์เวิร์ดที่สร้างขึ้นใหม่ ดังนี้

วิธีการเขียนโค้ด ข้อมูลโค้ด
ติดตามองค์ประกอบที่อัปเดต (แนะนำ)
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() ในลูปอื่นที่ไม่ใช่ที่ที่สร้าง

พิจารณาใช้การอัปโหลดหลายรายการพร้อมกันสำหรับการอัปเดตจำนวนมาก

งานทั่วไปที่นักพัฒนาซอฟต์แวร์ทำคือการเรียกใช้รายงานและอัปเดตเอนทิตี พร็อพเพอร์ตี้ (เช่น การเสนอราคาระดับคีย์เวิร์ด) ตามมูลค่าประสิทธิภาพปัจจุบัน วันและเวลา คุณจะต้องอัปเดตเอนทิตีจำนวนมาก การอัปโหลดจำนวนมากมีแนวโน้มที่จะให้ ประสิทธิภาพที่ดีขึ้น ตัวอย่างเช่น ลองพิจารณาสคริปต์ต่อไปนี้ที่เพิ่ม CPC สูงสุดของคีย์เวิร์ดที่ 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 รายการ รายการหนึ่งหยุดโฆษณาชั่วคราวในโฆษณา group; คู่อื่นๆ จะปรับการเสนอราคาระดับคีย์เวิร์ด แม้ว่าการดำเนินการจะไม่ได้เกี่ยวข้องกัน แต่การดำเนินการอาจใช้กับเอนทิตีที่อยู่ในกลุ่มโฆษณาเดียวกัน (หรือกลุ่มโฆษณา 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());
}

ไม่แนะนำให้ใช้วิธีที่สองเพราะเป็นการทำซ้ำกับคีย์เวิร์ด และดึงสถิติทีละเอนทิตี รายงานจะทํางานได้เร็วขึ้นในกรณีนี้เนื่องจากจะดึงข้อมูลทั้งหมดในการเรียกใช้ครั้งเดียวและสตรีมตามที่ต้องการ นอกจากนี้ คีย์เวิร์ดที่ได้มาด้วยวิธีที่สองคือ นับรวมในโควต้าของสคริปต์สำหรับจำนวนเอนทิตีที่ดึงข้อมูลโดยใช้ การโทรหา get()

ใช้การค้นหาแทนรายงาน

เมธอดรายงานสร้างขึ้นสำหรับโครงสร้างพื้นฐานเก่า และจะแสดงผลลัพธ์ ในรูปแบบคงที่แม้ว่าคุณจะใช้ GAQL ซึ่งหมายความว่าแอปจะต้อง เปลี่ยนผลการค้นหาให้ตรงกับรูปแบบเดิม ซึ่งไม่ ใช้ได้กับทุกช่อง และเพิ่มค่าใช้จ่ายในการโทรแต่ละครั้ง

เราขอแนะนำให้คุณใช้การค้นหา แทนเพื่อใช้ประโยชน์จาก คุณลักษณะ การรายงานใหม่เกี่ยวกับ Google Ads API

ใช้ GAQL แทน AWQL

แม้ว่าระบบจะยังคงรองรับ AWQL ในการค้นหารายงานและการเรียกใช้ withCondition แต่ระบบจะเรียกใช้ผ่านเลเยอร์การแปลภาษาซึ่งเข้ากันได้ไม่สมบูรณ์กับ AWQL จริง โปรดตรวจสอบว่าคุณใช้ GAQL เพื่อให้ควบคุมการค้นหาได้อย่างสมบูรณ์

หากคุณมีข้อความค้นหา AWQL ที่คุณต้องการแปล เรามีข้อความค้นหา เครื่องมือย้ายข้อมูล

อย่าเลือกแถวมากเกินกว่าที่คุณต้องการ

ความเร็วในการเรียกใช้รายงาน (และตัวเลือก) จะอิงตามจํานวนแถวทั้งหมดที่รายงานจะแสดงไม่ว่าคุณจะวนดูแถวเหล่านั้นหรือไม่ ซึ่งหมายความว่าคุณควรใช้ตัวกรองที่เฉพาะเจาะจงเสมอเพื่อลดชุดผลลัพธ์ให้เหลือน้อยที่สุดเพื่อให้ตรงกับ Use Case ของคุณ

เช่น สมมติว่าคุณต้องการค้นหากลุ่มโฆษณาที่มีราคาเสนออยู่นอกช่วงหนึ่งๆ การสร้างคำค้นหา 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);
  }
}

สคริปต์ Ad Manager (MCC)

ต้องการ OperatInParallel ผ่านการดำเนินการแบบอนุกรม

เมื่อเขียนสคริปต์สําหรับบัญชีดูแลจัดการ ให้ใช้ 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