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

تتناول هذه الصفحة العديد من أفضل الممارسات المتعلّقة بالتطوير باستخدام "برامج نصية في إعلانات 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();

الأسلوب الثاني أقل فعالية لأنّنا نفلتر حسب حقل غير حقل المعرّف.

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

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

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

أسلوب الترميز مقتطف الرمز
الفلترة حسب أرقام تعريف الحملات والمجموعات الإعلانية (يُنصح بها)
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.

أسلوب الترميز مقتطف الرمز
تطبيق تصنيف والفلترة حسب 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…)');

تعديلات الحساب

التغييرات المُجمَّعة

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

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

أسلوب الترميز مقتطف الرمز
تتبُّع العناصر المعدَّلة (إجراء يُنصح به)
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() يجبر نصوص &quot;إعلانات Google&quot; البرمجية على إكمال عملية 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();

لا يُفضّل استخدام الطريقة الثانية بسبب عملية الاختيار الإضافية المتضمّنة في استرداد الكلمة الرئيسية. بالإضافة إلى ذلك، تم إيقاف طرق الإنشاء أيضًا.

ومع ذلك، يُرجى العِلم أنّ أدوات الإنشاء، عند استخدامها بشكل غير صحيح، يمكن أن تمنع نصوص &quot;إعلانات Google&quot; البرمجية من تجميع عملياتها.

ضع في اعتبارك مقتطفات الرموز التالية التي تنشئ قائمة بالكلمات الرئيسية، وتطبع رقم تعريف الكلمات الرئيسية التي تم إنشاؤها حديثًا:

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

على الرغم من أنّ الأسلوب الثاني يمنحك أداءً جيدًا جدًا، إلا أنّ الأسلوب الأول هو الأفضل في هذه الحالة لأنّه

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

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

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

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

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

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

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

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

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

إذا كانت لديك طلبات بحث 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();
}

على الرغم من أنّ &quot;جداول بيانات Google&quot; تحاول تحسين مقتطف الرمز الثاني من خلال تخزين القيم مؤقتًا، إلا أنّه يظلّ يقدّم أداءً ضعيفًا مقارنةً بالمقتطف الأول، وذلك بسبب عدد طلبات البيانات من واجهة برمجة التطبيقات التي يتم إجراؤها.