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