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

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