روال‌های مطلوب

این صفحه روال‌های مطلوب مختلفی را برای توسعه با جاوااسکریپت 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.
  }
}

رویکرد دوم توصیه نمی‌شود زیرا تلاش می‌کند فهرست همه کلیدواژه‌های حسابتان را بازیابی کند تا فقط فیلتری را روی فهرست اعمال کند.

از پیمایش سلسله‌مراتب پویش اجتناب کنید

وقتی می‌خواهید نهادها را در سطح خاصی بازیابی کنید، به‌جای پیمایش کل سلسله‌مراتب پویش، از روش مجموعه‌سازی در آن سطح استفاده کنید. علاوه‌بر ساده‌تر بودن، این کار عملکرد بسیار بهتری نیز خواهد داشت: سیستم مجبور نخواهد بود همه پویش‌ها و گروه‌های آگهی را به‌طور غیرضروری بخواند.

تکه‌کدهای زیر را که همه آگهی‌های حسابتان را بازیابی می‌کنند مقایسه کنید:

رویکرد کدنویسی تکه‌کد
استفاده از روش جمع‌آوری مناسب (توصیه‌شده)

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.
  }
}

رویکرد دوم توصیه نمی‌شود زیرا تلاش می‌کند کل سلسله‌مراتب اشیاء (کمپین‌ها، گروه‌های آگهی) را واکشی کند، درحالی‌که فقط آگهی‌ها موردنیاز است.

استفاده از روش‌های دستیاب والد خاص

گاهی اوقات لازم است نهاد اصلی شیء بازیابی‌شده را دریافت کنید. در این مورد، باید از روش دستیاب ارائه‌شده به‌جای واکشی کل سلسله‌مراتب استفاده کنید.

تکه‌کدهای زیر را که گروه‌های آگهی دارای آگهی‌های نوشتاری با بیش‌از ۵۰ کلیک در ماه گذشته را بازیابی می‌کنند مقایسه کنید:

رویکرد کدنویسی تکه‌کد
از روش دستیاب والد مناسب استفاده کنید (توصیه‌شده)
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.
    }
  }
}

رویکرد دوم توصیه نمی‌شود زیرا کل سلسله‌مراتب پویش و گروه آگهی را در حسابتان واکشی می‌کند، درحالی‌که شما فقط به زیرمجموعه‌ای از پویش‌ها و گروه‌های آگهی نیاز دارید که با مجموعه آگهی‌هایتان مرتبط است. رویکرد اول خود را محدود می‌کند تا فقط مجموعه آگهی‌های مربوط را واکشی کند و از روش مناسبی برای دسترسی به اشیای والد آن استفاده می‌کند.

استفاده از فیلترهای خاص والدین

برای دسترسی به نهادها در یک پویش یا گروه آگهی خاص، از یک فیلتر خاص در انتخاب‌گر استفاده کنید، به‌جای اینکه ابتدا آن‌ها را واکشی کنید و سپس در سلسله‌مراتب پیمایش کنید.

تکه‌کدهای زیر را که فهرست آگهی‌های نوشتاری را در پویش و گروه آگهی مشخصی که ماه گذشته بیش‌از ۵۰ کلیک داشته‌اند بازیابی می‌کنند مقایسه کنید.

رویکرد کدنویسی تکه‌کد
استفاده از فیلترهای مناسب سطح والدین (توصیه‌شده)
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.
    }
  }
}

رویکرد دوم توصیه نمی‌شود زیرا سلسله‌مراتب پویش و گروه آگهی را در حسابتان تکرار می‌کند، درحالی‌که شما فقط به مجموعه انتخابی از آگهی‌ها و پویش‌ها و گروه‌های آگهی اصلی آن‌ها نیاز دارید. رویکرد اول تکرار را به فهرست آگهی‌ها محدود می‌کند، با اعمال فیلتر خاصی برای نهادهای والد در انتخابگر.

درصورت امکان، از شناسه‌ها برای فیلتر کردن استفاده کنید

هنگام فیلتر کردن برای نهادها، ترجیحاً نهادها را براساس شناسه‌شان فیلتر کنید تا فیلدهای دیگر.

تکه‌کدهای زیر را که پویشی را انتخاب می‌کنند درنظر بگیرید.

رویکرد کدنویسی تکه‌کد
فیلتر کردن براساس شناسه (توصیه‌شده)
var campaign = AdsApp.campaigns()
    .withIds([12345])
    .get()
    .next();
فیلتر کردن براساس نام (کمتر بهینه)
var campaign = AdsApp.campaigns()
    .withCondition('Name="foo"')
    .get()
    .next();

رویکرد دوم کمتر بهینه است زیرا براساس فیلد غیرشناسه فیلتر می‌کنیم.

هرزمان ممکن بود، براساس شناسه‌های والدین فیلتر کنید

هنگام انتخاب نهاد، هر زمان ممکن بود براساس شناسه‌های اصلی فیلتر کنید. این کار با محدود کردن فهرست نهادهایی که هنگام فیلتر کردن نتایج توسط سرورها بازیابی می‌شوند، پرس‌وجوهایتان را سریع‌تر می‌کند.

تکه‌کد زیر را درنظر بگیرید که AdGroup را با شناسه آن بازیابی می‌کند. فرض کنید شناسه پویش اصلی مشخص است.

رویکرد کدنویسی تکه‌کد
فیلتر کردن براساس شناسه‌های پویش و گروه آگهی (توصیه‌شده)
var adGroup = AdsApp.adGroups()
    .withIds([12345])
    .withCondition('CampaignId="54678"')
    .get()
    .next();
فیلتر کردن فقط براساس شناسه گروه آگهی (کمتر بهینه)
var adGroup = AdsApp.adGroups()
    .withIds([12345])
    .get()
    .next();

اگرچه هر دو تکه‌کد نتایج یکسانی ارائه می‌دهند، فیلتر کردن اضافی در تکه‌کد ۱ بااستفاده از شناسه اصلی (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 محدود کنید

هنگام اجرای اسکریپت‌ها، یک مورد استفاده رایج، اجرای گزارش برای فهرستی از نهادها است. توسعه‌دهندگان معمولاً این کار را با ساختن یک پُرسمان GAQL بسیار طولانی انجام می‌دهند که بااستفاده از عبارت IN، شناسه‌های نهاد را فیلتر می‌کند. این رویکرد زمانی که تعداد نهادها محدود باشد به‌خوبی کار می‌کند. بااین‌حال، با افزایش طول پُرسمان، عملکرد دستورات شما به دو دلیل کاهش می‌یابد:

  • پُرسمان طولانی‌تر به زمان بیشتری برای تجزیه نیاز دارد.
  • هر شناسه‌ای که به عبارت IN اضافه می‌کنید، شرط دیگری برای ارزیابی است و بنابراین زمان بیشتری می‌برد.

در چنین شرایطی، بهتر است برچسبی به نهادها اعمال کنید و سپس براساس 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());
}

رویکرد دوم توصیه نمی‌شود زیرا فراخوانی keyword.bidding().getCpc() اسکریپت‌های Google Ads را مجبور می‌کند تا عملیات setCpc() را پاک کند و در هر زمان فقط یک عملیات را اجرا کند. رویکرد اول، اگرچه شبیه به رویکرد دوم است، اما مزیت اضافی پشتیبانی از دسته‌بندی را دارد زیرا فراخوانی getCpc() در یک حلقه جداگانه از حلقه‌ای که setCpc() فراخوانی می‌شود انجام می‌شود.

درصورت امکان از سازنده‌ها استفاده کنید

جاوااسکریپت Google Ads از دو روش برای ایجاد اشیاء جدید پشتیبانی می‌کند: سازنده‌ها و روش‌های ایجاد. سازنده‌ها انعطاف‌پذیرتر از روش‌های ایجاد هستند، زیرا به شما امکان می‌دهند به شیء ایجادشده از فراخوانی 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 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());
}

رویکرد دوم ترجیح داده نمی‌شود زیرا operation.getResult() را در همان حلقه‌ای که عملیات را ایجاد می‌کند فراخوانی می‌کند، بنابراین جاوااسکریپت Google Ads را مجبور می‌کند تا هر بار یک عملیات را اجرا کند. رویکرد اول، بااینکه مشابه است، امکان دسته‌بندی را فراهم می‌کند زیرا operation.getResult()‎ را در حلقه‌ای متفاوت از جایی که ایجاد شده است فراخوانی می‌کنیم.

برای به‌روزرسانی‌های بزرگ، از بارگذاری انبوه استفاده کنید

یکی از کارهای رایجی که توسعه‌دهندگان انجام می‌دهند اجرای گزارش‌ها و به‌روزرسانی ویژگی‌های نهاد (برای مثال، قیمت‌های پیشنهادی کلیدواژه) براساس مقادیر عملکرد فعلی است. وقتی باید تعداد زیادی از نهادها را به‌روز کنید، بارگذاری انبوه معمولاً عملکرد بهتری به شما می‌دهد. برای مثال، اسکریپت‌های زیر را درنظر بگیرید که «بیشترین کلیک‌بها» کلیدواژه‌هایی را که 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);
  }
}

درحالی‌که رویکرد دوم عملکرد بسیار خوبی به شما می‌دهد، رویکرد اول در این مورد ترجیح داده می‌شود زیرا

  • جاوااسکریپت Google Ads برای تعداد اشیایی که می‌توانند در یک اجرا بازیابی یا به‌روزرسانی شوند محدودیت دارد و عملیات انتخاب و به‌روزرسانی در رویکرد دوم در این محدودیت لحاظ می‌شود.

  • بارگذاری‌های انبوه ازنظر تعداد نهادهایی که می‌تواند به‌روز کند و زمان کلی اجرا، محدودیت‌های بالاتری دارند.

بارگذاری‌های انبوهتان را براساس پویش‌ها گروه‌بندی کنید

وقتی بارگذاری‌های انبوهتان را ایجاد می‌کنید، سعی کنید عملیاتتان را براساس کمپین اصلی گروه‌بندی کنید. این کار کارایی را افزایش می‌دهد و احتمال تغییرات متناقض / خطاهای هم‌زمانی را کاهش می‌دهد.

دو تکلیف بارگذاری انبوه را درنظر بگیرید که به‌طور موازی اجرا می‌شوند. یکی آگهی‌ها را در گروه آگهی موقتاً متوقف می‌کند؛ دیگری قیمت‌های پیشنهادی کلیدواژه را تنظیم می‌کند. حتی اگر عملیات‌ها نامرتبط باشند، ممکن است عملیات‌ها برای نهادهای تحت همان گروه آگهی (یا دو گروه آگهی متفاوت تحت همان پویش) اعمال شوند. وقتی این اتفاق می‌افتد، سیستم نهاد اصلی (کمپین یا گروه آگهی هم‌رسانی‌شده) را قفل می‌کند و درنتیجه باعث می‌شود کارهای بارگذاری انبوه یکدیگر را مسدود کنند.

جاوااسکریپت Google Ads می‌تواند اجرا را در یک تکلیف بارگذاری انبوه بهینه‌سازی کند، بنابراین ساده‌ترین کار این است که در هر زمان فقط یک تکلیف بارگذاری انبوه را برای هر حساب اجرا کنید. اگر تصمیم دارید بیش‌از یک بارگذاری انبوه برای هر حساب اجرا کنید، مطمئن شوید که بارگذاری‌های انبوه روی فهرست کمپین‌های متقابلاً انحصاری (و نهادهای فرزند آن‌ها) برای عملکرد بهینه اجرا می‌شوند.

گزارش

استفاده از گزارش‌ها برای واکشی آمار

وقتی می‌خواهید حجم زیادی از نهادها و آمار آن‌ها را بازیابی کنید، اغلب بهتر است از گزارش‌ها استفاده کنید تا روش‌های استاندارد AdsApp. استفاده از گزارش‌های به دلایل زیر ترجیح داده می‌شود:

  • گزارش‌ها عملکرد بهتری برای پرسمان‌های بزرگ به شما ارائه می‌دهند.
  • گزارش‌ها به سهمیه‌های واکشی عادی نمی‌رسند.

تکه‌کدهای زیر را که «کلیک‌ها»، «ظهورها»، «هزینه»، و «نوشتار» همه کلیدواژه‌هایی را که ماه گذشته بیش‌از ۵۰ کلیک دریافت کرده‌اند واکشی می‌کنند مقایسه کنید:

رویکرد کدنویسی تکه‌کد
استفاده از گزارش‌ها (توصیه‌شده)
  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 تماس‌ها کار می‌کند، اما توصیه نمی‌شود. برای کنترل کامل پُرسمان‌هایتان، مطمئن شوید که به‌جای آن از GAQL استفاده می‌کنید.

بیشتر از تعداد ردیف‌های موردنیازتان انتخاب نکنید

سرعت اجرای گزارش‌ها (و گزینشگرها) براساس تعداد کل ردیف‌هایی است که گزارش برمی‌گرداند، صرف‌نظر از اینکه آن‌ها را تکرار کنید یا نه. این یعنی همیشه باید از فیلترهای خاصی استفاده کنید تا مجموعه نتایج را تا حد امکان برای مطابقت با مورد استفاده‌تان به‌حداقل برسانید.

برای مثال، فرض کنید می‌خواهید گروه‌های آگهی با قیمت‌های پیشنهادی خارج از محدوده خاصی را پیدا کنید. انجام دو پرسمان جداگانه، یکی برای قیمت‌های پیشنهادی زیر آستانه پایین و دیگری برای قیمت‌های پیشنهادی بالای آستانه بالا، سریع‌تر از واکشی همه گروه‌های آگهی و نادیده گرفتن مواردی است که به آن‌ها علاقه‌مند نیستید.

رویکرد کدنویسی تکه‌کد
استفاده از دو پُرسمان (توصیه‌شده)
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» (مرکز مدیریت مشتریان)

ترجیح دادن executeInParallel بر اجرای سریال

هنگام نوشتن دستورگان برای حساب‌های مدیر، درصورت امکان به‌جای اجرای سریال از executeInParallel() استفاده کنید. executeInParallel() به دستورات شما زمان پردازش بیشتری می‌دهد (تا یک ساعت) و تا ۳۰ دقیقه برای هر حساب پردازش‌شده (به‌جای ۳۰ دقیقه ترکیبی برای اجرای سریال). برای جزئیات بیشتر، صفحه محدودیت‌ها را ببینید.

صفحه‌گسترده‌ها

هنگام به‌روزرسانی صفحه‌گسترده‌ها از عملیات دسته‌ای استفاده کنید

هنگام به‌روزرسانی صفحه‌گسترده‌ها، سعی کنید از روش‌های عملیات انبوه (برای مثال، 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 Spreadsheets تلاش می‌کند تکه‌کد دوم را با ذخیره کردن مقادیر در حافظه نهان بهینه‌سازی کند، به‌دلیل تعداد فراخوانی‌های میانای برنامه‌سازی کاربردی که انجام می‌شود، همچنان عملکرد ضعیفی نسبت‌به تکه‌کد اول ارائه می‌دهد.