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

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

ونقترح عليك استخدام البحث بدلاً من ذلك للاستفادة من جميع ميزات إعداد تقارير جديدة في 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);
  }
}

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

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

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