সর্বোত্তম অনুশীলন

এই পৃষ্ঠায় গুগল অ্যাডস স্ক্রিপ্ট ব্যবহার করে ডেভেলপ করার বিভিন্ন সেরা পদ্ধতি নিয়ে আলোচনা করা হয়েছে।

নির্বাচক

সিলেক্টর দিয়ে ফিল্টার করুন

সম্ভব হলে, শুধুমাত্র আপনার প্রয়োজনীয় সত্তাগুলো অনুরোধ করতে ফিল্টার ব্যবহার করুন। সঠিক ফিল্টার প্রয়োগের নিম্নলিখিত সুবিধাগুলো রয়েছে:

  • কোডটি আরও সরল এবং সহজে বোঝা যায়।
  • স্ক্রিপ্টটি আরও দ্রুত কার্যকর হবে।

নিম্নলিখিত কোড স্নিপেটগুলো তুলনা করুন:

কোডিং পদ্ধতি কোড স্নিপেট
সিলেক্টর ব্যবহার করে ফিল্টার করুন (প্রস্তাবিত)
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.
  }
}

দ্বিতীয় পদ্ধতিটি সুপারিশ করা হয় না, কারণ এতে অবজেক্টের (ক্যাম্পেইন, অ্যাড গ্রুপ) সম্পূর্ণ হায়ারার্কি আনার চেষ্টা করা হয়, অথচ শুধুমাত্র বিজ্ঞাপন প্রয়োজন।

নির্দিষ্ট প্যারেন্ট অ্যাক্সেসর পদ্ধতি ব্যবহার করুন

কখনও কখনও আপনার পুনরুদ্ধার করা কোনো অবজেক্টের প্যারেন্ট এনটিটি পাওয়ার প্রয়োজন হতে পারে। এক্ষেত্রে, সম্পূর্ণ হায়ারার্কি ফেচ করার পরিবর্তে আপনার একটি প্রদত্ত অ্যাক্সেসর মেথড ব্যবহার করা উচিত।

নিম্নলিখিত কোড স্নিপেটগুলো তুলনা করুন, যেগুলো গত মাসে ৫০টির বেশি ক্লিক পাওয়া টেক্সট অ্যাড থাকা অ্যাড গ্রুপগুলো খুঁজে বের করে:

কোডিং পদ্ধতি কোড স্নিপেট
উপযুক্ত প্যারেন্ট অ্যাক্সেসর পদ্ধতি ব্যবহার করুন (প্রস্তাবিত)।
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.
    }
  }
}

দ্বিতীয় পদ্ধতিটি সুপারিশ করা হয় না, কারণ এটি আপনার অ্যাকাউন্টের সম্পূর্ণ ক্যাম্পেইন এবং অ্যাড গ্রুপ হায়ারার্কি ফেচ করে, অথচ আপনার প্রয়োজন শুধু আপনার বিজ্ঞাপন সেটের সাথে যুক্ত ক্যাম্পেইন এবং অ্যাড গ্রুপগুলোর একটি উপসেট। প্রথম পদ্ধতিটি নিজেকে শুধুমাত্র প্রাসঙ্গিক অ্যাডস কালেকশন ফেচ করার মধ্যে সীমাবদ্ধ রাখে এবং এর প্যারেন্ট অবজেক্টগুলো অ্যাক্সেস করার জন্য একটি উপযুক্ত পদ্ধতি ব্যবহার করে।

নির্দিষ্ট প্যারেন্ট ফিল্টার ব্যবহার করুন

কোনো নির্দিষ্ট ক্যাম্পেইন বা অ্যাড গ্রুপের অন্তর্গত এনটিটিগুলো অ্যাক্সেস করতে, ডেটা ফেচ করে হায়ারার্কির মধ্য দিয়ে যাওয়ার পরিবর্তে সিলেক্টরে একটি নির্দিষ্ট ফিল্টার ব্যবহার করুন।

নিম্নলিখিত কোড স্নিপেটগুলো তুলনা করুন, যেগুলো একটি নির্দিষ্ট ক্যাম্পেইন এবং অ্যাড গ্রুপের অন্তর্গত সেইসব টেক্সট অ্যাডের তালিকা পুনরুদ্ধার করে যেগুলোতে গত মাসে ৫০টির বেশি ক্লিক পড়েছে।

কোডিং পদ্ধতি কোড স্নিপেট
উপযুক্ত প্যারেন্ট লেভেল ফিল্টার ব্যবহার করুন (প্রস্তাবিত)।
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();

যদিও উভয় কোড স্নিপেট একই ফলাফল দেয়, কোড স্নিপেট ১-এ একটি প্যারেন্ট আইডি (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 ক্লজে শর্তের সংখ্যা সীমিত করুন।

স্ক্রিপ্ট চালানোর সময়, এনটিটির একটি তালিকার জন্য রিপোর্ট তৈরি করা একটি সাধারণ ব্যবহার। ডেভেলপাররা সাধারণত একটি IN ক্লজ ব্যবহার করে এনটিটি আইডিগুলোর উপর ফিল্টার করার জন্য একটি খুব দীর্ঘ GAQL কোয়েরি তৈরি করে এটি সম্পন্ন করেন। এনটিটির সংখ্যা সীমিত থাকলে এই পদ্ধতিটি ভালোভাবে কাজ করে। তবে, আপনার কোয়েরির দৈর্ঘ্য বাড়ার সাথে সাথে দুটি কারণে আপনার স্ক্রিপ্টের পারফরম্যান্স খারাপ হতে থাকে:

  • একটি দীর্ঘ কোয়েরি পার্স করতে বেশি সময় লাগে।
  • IN ক্লজে আপনি প্রতিটি ID যোগ করার ফলে তা মূল্যায়নের জন্য একটি অতিরিক্ত শর্ত হয়ে দাঁড়ায়, এবং একারণে এতে বেশি সময় লাগে।

এই পরিস্থিতিতে, সত্তাগুলিতে একটি লেবেল প্রয়োগ করা এবং তারপরে 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…)');

অ্যাকাউন্ট আপডেট

ব্যাচ পরিবর্তন

যখন আপনি কোনো গুগল অ্যাডস এনটিটিতে পরিবর্তন করেন, তখন গুগল অ্যাডস স্ক্রিপ্ট সেই পরিবর্তনটি সঙ্গে সঙ্গে কার্যকর করে না। এর পরিবর্তে, এটি একাধিক পরিবর্তনকে ব্যাচে একত্রিত করার চেষ্টা করে, যাতে একটিমাত্র অনুরোধের মাধ্যমে একাধিক পরিবর্তন সম্পন্ন করা যায়। এই পদ্ধতি আপনার স্ক্রিপ্টকে দ্রুততর করে এবং গুগল অ্যাডস সার্ভারের উপর চাপ কমায়। তবে, কিছু কোড প্যাটার্ন রয়েছে যা গুগল অ্যাডস স্ক্রিপ্টকে তার অপারেশনের ব্যাচটি ঘন ঘন ফ্লাশ করতে বাধ্য করে, যার ফলে আপনার স্ক্রিপ্ট ধীরগতিতে চলে।

নিম্নলিখিত স্ক্রিপ্টটি বিবেচনা করুন যা কীওয়ার্ডের একটি তালিকার বিড আপডেট করে।

কোডিং পদ্ধতি কোড স্নিপেট
আপডেট করা উপাদানগুলির উপর নজর রাখুন (প্রস্তাবিত)।
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 Ads স্ক্রিপ্টকে setCpc() অপারেশনটি ফ্লাশ করতে এবং একবারে কেবল একটি অপারেশন সম্পাদন করতে বাধ্য করে। প্রথম পদ্ধতিটি, দ্বিতীয় পদ্ধতির অনুরূপ হলেও, ব্যাচিং সমর্থন করার একটি অতিরিক্ত সুবিধা রয়েছে, কারণ getCpc() কলটি setCpc() কল করা লুপ থেকে একটি পৃথক লুপে করা হয়।

সম্ভব হলে নির্মাণকর্মীদের ব্যবহার করুন

গুগল অ্যাডস স্ক্রিপ্টে নতুন অবজেক্ট তৈরি করার দুটি উপায় রয়েছে—বিল্ডার এবং ক্রিয়েশন মেথড। ক্রিয়েশন মেথডের চেয়ে বিল্ডারগুলো বেশি নমনীয়, কারণ এগুলো আপনাকে এপিআই কলের মাধ্যমে তৈরি হওয়া অবজেক্টটি অ্যাক্সেস করার সুযোগ দেয়।

নিম্নলিখিত কোড স্নিপেটগুলো বিবেচনা করুন:

কোডিং পদ্ধতি কোড স্নিপেট
নির্মাণকারী ব্যবহার করুন (সুপারিশকৃত)
var operation = adGroup.newKeywordBuilder()
    .withText('shoes')
    .build();
var keyword = operation.getResult();
তৈরির পদ্ধতি ব্যবহার করুন (সুপারিশ করা হয় না)
adGroup.createKeyword('shoes');
var keyword = adGroup.keywords()
    .withCondition('KeywordText="shoes"')
    .get()
    .next();

কীওয়ার্ড পুনরুদ্ধার করার জন্য অতিরিক্ত নির্বাচন প্রক্রিয়ার প্রয়োজন হওয়ায় দ্বিতীয় পদ্ধতিটি পছন্দনীয় নয়। এছাড়াও, তৈরির পদ্ধতিগুলোও অপ্রচলিত।

তবে, মনে রাখবেন যে বিল্ডারগুলি ভুলভাবে ব্যবহার করা হলে, গুগল অ্যাডস স্ক্রিপ্টগুলিকে তাদের অপারেশনগুলি ব্যাচিং করতে বাধা দিতে পারে।

নিম্নলিখিত কোড স্নিপেটগুলো বিবেচনা করুন, যেগুলো কীওয়ার্ডের একটি তালিকা তৈরি করে এবং নতুন তৈরি হওয়া কীওয়ার্ডগুলোর আইডি প্রিন্ট করে:

কোডিং পদ্ধতি কোড স্নিপেট
আপডেট করা উপাদানগুলির উপর নজর রাখুন (প্রস্তাবিত)।
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() কল করে, ফলে গুগল অ্যাডস স্ক্রিপ্টগুলো একবারে একটি অপারেশন সম্পাদন করতে বাধ্য হয়। প্রথম পদ্ধতিটি একই রকম হলেও, এটি ব্যাচিংয়ের সুযোগ দেয়, যেহেতু আমরা 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);
  }
}

যদিও দ্বিতীয় পদ্ধতিটি আপনাকে বেশ ভালো পারফরম্যান্স দেয়, এই ক্ষেত্রে প্রথম পদ্ধতিটিই বেশি পছন্দনীয় কারণ

  • গুগল অ্যাডস স্ক্রিপ্টে একবারে কতগুলো অবজেক্ট পুনরুদ্ধার বা আপডেট করা যাবে তার একটি সীমা রয়েছে, এবং দ্বিতীয় পদ্ধতির সিলেক্ট ও আপডেট অপারেশনগুলো সেই সীমার মধ্যেই গণনা করা হয়।

  • বাল্ক আপলোডের ক্ষেত্রে, এটি যে সংখ্যক এনটিটি আপডেট করতে পারে এবং এর সামগ্রিক কার্যসম্পাদনের সময়—উভয় দিক থেকেই উচ্চতর সীমা রয়েছে।

ক্যাম্পেইন অনুযায়ী আপনার বাল্ক আপলোডগুলিকে গ্রুপ করুন

যখন আপনি একসাথে অনেক ফাইল আপলোড করবেন, তখন মূল ক্যাম্পেইন অনুযায়ী আপনার অপারেশনগুলোকে গ্রুপ করার চেষ্টা করুন। এতে কার্যকারিতা বাড়ে এবং পরস্পরবিরোধী পরিবর্তন বা একই সময়ে একাধিক ফাইল চলার ত্রুটির সম্ভাবনা কমে যায়।

সমান্তরালভাবে চলমান দুটি বাল্ক আপলোড টাস্ক বিবেচনা করুন। একটি একটি অ্যাড গ্রুপের বিজ্ঞাপনগুলো থামিয়ে দেয়; অন্যটি কীওয়ার্ড বিড সমন্বয় করে। যদিও অপারেশনগুলো সম্পর্কহীন, তবুও এগুলো একই অ্যাড গ্রুপের অধীনে থাকা এনটিটিগুলোর ওপর (অথবা একই ক্যাম্পেইনের অধীনে থাকা দুটি ভিন্ন অ্যাড গ্রুপের ওপর) প্রযোজ্য হতে পারে। যখন এমনটা ঘটে, তখন সিস্টেমটি প্যারেন্ট এনটিটি (শেয়ার করা অ্যাড গ্রুপ বা ক্যাম্পেইন)-কে লক করে দেবে, যার ফলে বাল্ক আপলোড টাস্কগুলো একে অপরের ওপর ব্লক হয়ে যাবে।

গুগল অ্যাডস স্ক্রিপ্টগুলো একটিমাত্র বাল্ক আপলোড টাস্কের মধ্যেই তার কার্যকারিতা অপ্টিমাইজ করতে পারে, তাই সবচেয়ে সহজ উপায় হলো প্রতি অ্যাকাউন্টে একবারে কেবল একটি বাল্ক আপলোড টাস্ক চালানো। যদি আপনি প্রতি অ্যাকাউন্টে একাধিক বাল্ক আপলোড চালানোর সিদ্ধান্ত নেন, তাহলে সর্বোত্তম পারফরম্যান্সের জন্য নিশ্চিত করুন যে বাল্ক আপলোডগুলো পারস্পরিকভাবে স্বতন্ত্র ক্যাম্পেইনের (এবং তাদের চাইল্ড এনটিটিগুলোর) তালিকার উপর পরিচালিত হয়।

রিপোর্টিং

পরিসংখ্যান সংগ্রহের জন্য রিপোর্ট ব্যবহার করুন।

যখন আপনি বিপুল সংখ্যক এনটিটি এবং তাদের পরিসংখ্যান পুনরুদ্ধার করতে চান, তখন প্রচলিত AdsApp পদ্ধতির পরিবর্তে রিপোর্ট ব্যবহার করা প্রায়শই শ্রেয়। নিম্নলিখিত কারণগুলোর জন্য রিপোর্ট ব্যবহার করা বেশি পছন্দনীয়:

  • বড় আকারের কোয়েরির ক্ষেত্রে রিপোর্ট আপনাকে আরও ভালো পারফরম্যান্স দেয়।
  • রিপোর্টগুলো সাধারণ সংগ্রহের কোটা অতিক্রম করবে না।

নিম্নলিখিত কোড স্নিপেটগুলো তুলনা করুন, যেগুলো গত মাসে ৫০টির বেশি ক্লিক পাওয়া সমস্ত কীওয়ার্ডের ক্লিক, ইম্প্রেশন, খরচ এবং টেক্সট সংগ্রহ করে:

কোডিং পদ্ধতি কোড স্নিপেট
রিপোর্ট ব্যবহার করুন (সুপারিশকৃত)
  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 ব্যবহার করলেও এটি ফলাফল একটি ফ্ল্যাট ফরম্যাটে আউটপুট দেবে। এর মানে হলো, পুরোনো স্টাইলের সাথে মেলানোর জন্য এটিকে কোয়েরির ফলাফল রূপান্তর করতে হয়, যা সব ফিল্ডের জন্য সমর্থিত নয় এবং প্রতিটি কলে অতিরিক্ত ওভারহেড যোগ করে।

নতুন গুগল অ্যাডস এপিআই রিপোর্টিং-এর সমস্ত ফিচারের সুবিধা নিতে আমরা আপনাকে এর পরিবর্তে সার্চ ব্যবহার করার পরামর্শ দিচ্ছি।

AWQL-এর চেয়ে GAQL বেশি পছন্দনীয়।

যদিও রিপোর্ট কোয়েরি এবং withCondition কলের জন্য AWQL এখনও প্রযুক্তিগতভাবে কাজ করে, এটি ব্যবহার করার পরামর্শ দেওয়া হয় না। আপনার কোয়েরিগুলোর উপর সম্পূর্ণ নিয়ন্ত্রণ রাখতে, এর পরিবর্তে 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);
  }
}

বিজ্ঞাপন ব্যবস্থাপক (এমসিসি) স্ক্রিপ্ট

সিরিয়াল এক্সিকিউশনের চেয়ে executeInParallel ব্যবহার করা শ্রেয়।

ম্যানেজার অ্যাকাউন্টের জন্য স্ক্রিপ্ট লেখার সময়, সম্ভব হলে সিরিয়াল এক্সিকিউশনের পরিবর্তে executeInParallel() ব্যবহার করুন। executeInParallel() আপনার স্ক্রিপ্টকে আরও বেশি প্রসেসিং সময় (এক ঘন্টা পর্যন্ত) এবং প্রতিটি অ্যাকাউন্ট প্রসেস করার জন্য ৩০ মিনিট পর্যন্ত সময় দেয় (সিরিয়াল এক্সিকিউশনের জন্য মোট ৩০ মিনিটের পরিবর্তে)। আরও বিস্তারিত জানতে আমাদের লিমিটস পেজ দেখুন।

স্প্রেডশিট

স্প্রেডশীট আপডেট করার সময় ব্যাচ অপারেশন ব্যবহার করুন।

স্প্রেডশীট আপডেট করার সময়, একবারে একটি সেল আপডেট করে এমন পদ্ধতির পরিবর্তে বাল্ক অপারেশন পদ্ধতি (যেমন, 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();
}

যদিও গুগল স্প্রেডশিট ভ্যালু ক্যাশ করার মাধ্যমে দ্বিতীয় কোড স্নিপেটটিকে অপটিমাইজ করার চেষ্টা করে, তবুও এতে অধিক সংখ্যক এপিআই কল হওয়ার কারণে এটি প্রথম স্নিপেটটির তুলনায় দুর্বল পারফরম্যান্স দেয়।