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

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

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

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

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

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

يمكن للنصوص البرمجية في "إعلانات 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.

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

عدم اختيار صفوف أكثر مما تحتاج

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

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

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

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

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

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