أفضل الممارسات

تتناول هذه الصفحة أفضل الممارسات المختلفة لتطوير النصوص البرمجية في "إعلانات Google".

المحددات

الفلترة باستخدام أدوات الاختيار

استخدِم الفلاتر لطلب الكيانات التي تحتاج إليها فقط، متى أمكن ذلك. ويؤدي تطبيق الفلاتر المناسبة إلى المزايا التالية:

  • تكون الرموز البرمجية أبسط وأسهل فهمًا.
  • سيتم تنفيذ النص البرمجي بشكل أسرع بكثير.

قارِن بين مقتطفات الرمز التالية:

منهج الترميز مقتطف الرمز
الفلترة باستخدام المحدّدات (إجراء يُنصح به)
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.
  }
}

لا يُنصح باستخدام المنهج الثاني لأنه يحاول استرجاع التسلسلات الهرمية الكاملة للكائنات (الحملات والمجموعات الإعلانية)، بينما تكون الإعلانات فقط مطلوبة.

استخدام طرق معيّنة لاسترداد بيانات الوالدَين

في بعض الأحيان، تحتاج إلى الحصول على العنصر الرئيسي للكائن الذي تم استرجاعه. في هذه الحالة، يجب عليك استخدام طريقة موصّل مقدمة بدلاً من جلب تسلسلات هرمية بالكامل.

قارِن بين المقتطفات التالية من الرموز البرمجية التي تسترجع المجموعات الإعلانية التي تحتوي على إعلانات نصية حصدت أكثر من 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.
    }
  }
}

لا يُنصح بالطريقة الثانية لأنّها تُجلب التسلسلات الهرمية للحملات والمجموعات الإعلانية بالكامل في حسابك، في حين أنّك تحتاج فقط إلى مجموعة فرعية من الحملات والمجموعات الإعلانية المرتبطة بمجموعة إعلاناتك. يقتصر الأسلوب الأول على جلب مجموعة الإعلانات ذات الصلة فقط، ويستخدم طريقة مناسبة للوصول إلى عناصرها الرئيسية.

استخدام فلاتر معيّنة للوالدَين

للوصول إلى الكيانات ضمن حملة أو مجموعة إعلانية معيّنة، استخدِم ملف شخصي فلترة محدّدًا في أداة الاختيار بدلاً من جلب التسلسل الهرمي ثم التنقّل فيه.

قارن مقتطفات الرمز التالية التي تسترجع قائمة الإعلانات النصية ضمن حملة محددة ومجموعة إعلانية محددة تلقت أكثر من 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.
    }
  }
}

ولا يُنصح باستخدام المنهج الثاني لأنه يتكرر على التدرّج الهرمي للحملات والمجموعات الإعلانية في حسابك، بينما تحتاج فقط إلى مجموعة محدّدة من الإعلانات، وحملاتها ومجموعاتها الإعلانية الرئيسية. يحدّد النهج الأول التكرار بقائمة الإعلانات من خلال تطبيق فلتر محدّد للكيانات الرئيسية على أداة الاختيار.

استخدام المعرّفات للفلترة كلما أمكن

عند الفلترة حسب الكيانات، من الأفضل الفلترة حسب معرّفاتها بدلاً من الحقول الأخرى.

راجِع المقتطفات التالية من الرموز البرمجية التي تختار حملة.

منهج الترميز مقتطف الرمز
الفلترة حسب رقم التعريف (إجراء مقترَح)
var campaign = AdsApp.campaigns()
    .withIds([12345])
    .get()
    .next();
الفلترة حسب الاسم (أقل فعالية)
var campaign = AdsApp.campaigns()
    .withCondition('Name="foo"')
    .get()
    .next();

والطريقة الثانية أقل مثالية نظرًا لأننا نقوم بالتصفية حسب حقل غير معرف.

الفلترة حسب أرقام تعريف الوالدَين كلما أمكن

عند اختيار كيان، يمكنك الفلترة حسب أرقام التعريف الرئيسية كلما أمكن ذلك. سيؤدي ذلك إلى تسريع طلبات البحث من خلال الحد من قائمة الكيانات التي يتم استرجاعها من قبل الخوادم عند فلترة النتائج.

ضع في الاعتبار مقتطف الرمز التالي الذي يسترد مجموعة إعلانية حسب رقم تعريفها. نفترض أنّه معروف رقم تعريف الحملة الرئيسية.

منهج الترميز مقتطف الرمز
الفلترة حسب أرقام تعريف الحملات والمجموعات الإعلانية (إجراء مقترَح)
var adGroup = AdsApp.adGroups()
    .withIds([12345])
    .withCondition('CampaignId="54678"')
    .get()
    .next();
الفلترة حسب رقم تعريف المجموعة الإعلانية فقط (أقلّ فعالية)
var adGroup = AdsApp.adGroups()
    .withIds([12345])
    .get()
    .next();

على الرغم من أنّ كلا المقتطفَين من الرموز يقدّمان نتائج متطابقة، فإنّ عملية التصفّح الإضافية في المقتطف 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.

منهج الترميز مقتطف الرمز
تطبيق تصنيف والفلترة حسب رقم تعريف التصنيف (إجراء يُنصح به)
// 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"، لا تنفِّذ نصوص "إعلانات Google" البرمجية التغيير على الفور. بدلاً من ذلك، يحاول دمج تغييرات متعددة في مجموعات، حتى يتمكّن من إصدار طلب واحد يُجري تغييرات متعدّدة. ويؤدي هذا النهج إلى تسريع نصوصك البرمجية وتقليل الضغط على ملفّات "إعلانات Google". الملفات. ومع ذلك، هناك بعض أنماط الرموز التي تجبر النصوص البرمجية في "إعلانات Google" على تفريغ مجموعة العمليات الخاصة بها بشكلٍ متكرر، ما يؤدي إلى بطء تنفيذ النص البرمجي.

راجِع النص البرمجي التالي الذي يعدّل عروض أسعار قائمة من الكلمات الرئيسية.

منهج الترميز مقتطف الرمز
تتبُّع العناصر المعدَّلة (يُنصح به)
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" البرمجية مسح عملية setCpc() وتنفيذ عملية واحدة فقط في كل مرة. وعلى الرغم من أنّ الطريقة الأولى تشبه النهج الثاني، فإنّها تحقّق فائدة إضافية تتمثل في دعم التجميع حيث يتم تنفيذ طلب getCpc() في حلقة منفصلة عن الحلقة التي يتم فيها استدعاء setCpc().

استخدام أدوات الإنشاء كلما أمكن

تتيح نصوص "إعلانات Google" طريقتَين لإنشاء عناصر جديدة، وهما أدوات الإنشاء وطرق الإنشاء. إنّ أدوات الإنشاء أكثر مرونة من طرق الإنشاء، لأنّها تمنحك إمكانية الوصول إلى العنصر الذي تم إنشاؤه من طلب واجهة برمجة التطبيقات.

راجِع المقتطفات التالية من الرموز البرمجية:

منهج الترميز مقتطف الرمز
استخدام أدوات الإنشاء (إجراء يُنصح به)
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());
}

لا يُفضَّل الأسلوب الثاني لأنّه يستدعي operation.getResult() ضمن الحلقة نفسها التي تنشئ العملية، ما يجبر نصوص "إعلانات Google" البرمجية على تنفيذ عملية واحدة في كل مرة. على الرغم من أنّ المنهج الأول مشابه، إلا أنّه يسمح بالمعالجة دُفعة واحدة لأنّنا نُطلِق 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);
  }
}

على الرغم من أنّ الطريقة الثانية تمنحك أداءً جيدًا جدًا، يُفضّل استخدام الطريقة الأولى في هذه الحالة لأنّ

  • تفرض نصوص "إعلانات Google" حدًا أقصى لعدد العناصر التي يمكن استرجاعها أو تعديلها في عملية واحدة، ويتم احتساب عمليات الاختيار والتعديل في الأسلوب الثاني ضمن هذا الحدّ الأقصى.

  • تكون لعمليات التحميل المجمّعة حدودًا أعلى من حيث عدد العناصر التي يمكن تعديلها والوقت الإجمالي لعملية التنفيذ.

تجميع عمليات التحميل المجمَّعة حسب الحملات

عند إنشاء عمليات التحميل المجمّعة، حاوِل تجميع عملياتك حسب الحملة الأساسية. ويؤدي ذلك إلى زيادة الكفاءة والحدّ من احتمال حدوث أخطاء تتعلّق بتضارب التغييرات أو التزامن.

لنفترض أنّ هناك مهمتَي تحميل مجمّع يتم تنفيذهما بالتوازي. يوقف أحدهما الإعلانات مؤقتًا في مجموعة إعلانية، ويُعدّل الآخر عروض أسعار الكلمات الرئيسية. على الرغم من أنّ العمليات غير مرتبطة ببعضها، قد تنطبق العمليات على الكيانات ضمن المجموعة الإعلانية نفسها (أو مجموعتَين إعلانيتين مختلفتَين ضمن الحملة نفسها). عند حدوث ذلك، سيقفل النظام العنصر الرئيسي (المجموعة الإعلانية أو الحملة المشترَكة)، ما يؤدي إلى حظر المهام لتحميل البيانات المجمّعة على بعضها.

يمكن أن تحسّن نصوص "إعلانات Google" البرمجية عملية التنفيذ ضمن مهمة تحميل مجمّع واحدة، لذا فإنّ أبسط ما يمكنك فعله هو تشغيل مهمة تحميل مجمّع واحدة فقط لكل حساب في كل مرة. إذا قرّرت تنفيذ أكثر من عملية تحميل مجمّع واحدة لكل حساب، تأكَّد من أنّ عمليات التحميل المجمَّعة تعمل على قائمة حصرية للحملات (وكياناتها الفرعية) لتحقيق الأداء الأمثل.

إعداد التقارير

استخدام التقارير لاسترجاع الإحصاءات

عندما تريد استرداد كميات كبيرة من الكيانات وإحصاءاتها، من المفضّل في أغلب الأحيان استخدام التقارير بدلاً من طرق 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. وهذا يعني أنّه يجب تحويل نتائج طلب البحث لمطابقة الطراز القديم، وهو ليس متاحًا لجميع الحقول ويضيف عبءً إضافيًا إلى كلّ طلب بحث.

ننصحك باستخدام البحث بدلاً من ذلك للاستفادة من جميع ميزات reporting الجديدة في Google Ads API.

تفضيل GAQL إلى AWQL

على الرغم من أنّ لغة AWQL لا تزال متاحة في طلبات بحث التقارير وطلبات withCondition، يتم تنفيذها من خلال طبقة ترجمة لا تتوافق بشكل كامل مع لغة AWQL الحقيقية. للتحكّم بشكل كامل في طلبات البحث، تأكَّد من استخدام GAQL.

إذا كانت لديك طلبات بحث حالية في AWQL تريد ترجمتها، لدينا أداة نقل طلبات البحث لمساعدتك.

لا تختَر صفوفًا أكثر من التي تحتاج إليها.

تعتمد سرعة تنفيذ التقارير (وأدوات الاختيار) على إجمالي عدد الصفوف التي سيعرضها التقرير، بغض النظر عمّا إذا كنت تكرّر تصفّحها. هذا يعني أنه يجب عليك دائمًا استخدام عوامل تصفية محددة لتقليل مجموعة النتائج قدر الإمكان بما يتوافق مع حالة استخدامك.

على سبيل المثال، لنفترض أنّك تريد العثور على مجموعات إعلانية تتضمّن عروض أسعار خارج بعض النطاقات المحدّدة. وسيكون من الأسرع إجراء طلبَي بحث منفصلَين، أحدهما لعروض الأسعار أقل من الحد الأدنى والآخر لعروض الأسعار الأعلى من الحدّ الأقصى، بدلاً من جلب جميع المجموعات الإعلانية وتجاهل المجموعات الإعلانية التي لا تهمّك فيها.

منهج الترميز مقتطف الرمز
استخدام طلبَي بحث (إجراء مقترَح)
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);
  }
}

النصوص البرمجية لمدير الإعلانات (مركز عملائي)

تفضيل التنفيذInParallel على التنفيذ التسلسلي

عند كتابة نصوص برمجية للحسابات الإدارية، استخدِم executeInParallel() بدلاً من التنفيذ التسلسلي متى أمكن. يوفّر executeInParallel() لنصك البرمجي وقت معالجة إضافيًا (يصل إلى ساعة واحدة) ويصل إلى 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" تحاول تحسين مقتطف الرمز البرمجي الثاني من خلال تخزين قيمة العناصر مؤقتًا، إلا أنّه لا يزال يقدّم أداءً ضعيفًا مقارنةً بالمقتطف الأول، ويعود سبب ذلك إلى عدد طلبات البيانات التي يتم إجراؤها من خلال واجهة برمجة التطبيقات.