পেশাদার পদ্ধতি

এই পৃষ্ঠায় Google Ads স্ক্রিপ্ট ডেভেলপ করার জন্য বিভিন্ন পেশাদার পদ্ধতি সম্পর্কে আলোচনা করা হয়েছে।

বাছাইকারী

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

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

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

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

কোডিং পদ্ধতি কোড স্নিপেট
সিলেক্টর ব্যবহার করে ফিল্টার করুন (সাজেস্ট করা হয়েছে)
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 ক্লজে শর্তের সংখ্যা সীমিত করুন

স্ক্রিপ্ট চালানোর সময়, একটি সাধারণ ব্যবহার হল এন্টিটির তালিকার জন্য রিপোর্ট চালানো। ডেভেলপাররা সাধারণত একটি খুব দীর্ঘ 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 Ads এন্টিটিতে পরিবর্তন করলে, Google Ads স্ক্রিপ্ট অবিলম্বে পরিবর্তনটি কার্যকর করে না। পরিবর্তে, এটি একাধিক পরিবর্তনকে ব্যাচে একত্রিত করার চেষ্টা করে, যাতে এটি একটি একক অনুরোধ ইস্যু করতে পারে যা একাধিক পরিবর্তন করে। এই পদ্ধতি আপনার স্ক্রিপ্টকে আরও দ্রুত করে তোলে এবং Google Ads সার্ভারের লোড কমায়। তবে, কিছু কোড প্যাটার্ন Google Ads স্ক্রিপ্টকে ঘন ঘন তার ব্যাচ অপারেশন ফ্লাশ করতে বাধ্য করে, যার ফলে আপনার স্ক্রিপ্ট ধীরে চলে।

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

কোডিং পদ্ধতি কোড স্নিপেট
আপডেট করা এলিমেন্টের ট্র্যাক রাখুন (সাজেস্ট করা হয়)
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() কল করার লুপ থেকে আলাদা লুপে করা হয়।

সম্ভব হলে বিল্ডার ব্যবহার করুন

Google Ads স্ক্রিপ্ট নতুন অবজেক্ট তৈরি করার দুটি উপায় সাপোর্ট করে—বিল্ডার ও তৈরি করার পদ্ধতি। বিল্ডাররা তৈরির পদ্ধতির চেয়ে বেশি নমনীয়, কারণ তারা আপনাকে API কল থেকে তৈরি করা অবজেক্টে অ্যাক্সেস দেয়।

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

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

দ্বিতীয় পদ্ধতিটি পছন্দ করা হয় না কারণ কীওয়ার্ড খুঁজে পাওয়ার জন্য অতিরিক্ত বেছে নেওয়ার অপারেশন করতে হয়। এছাড়াও, তৈরি করার পদ্ধতিও বন্ধ করা হয়েছে।

তবে, মনে রাখবেন যে বিল্ডার ভুলভাবে ব্যবহার করা হলে, Google Ads স্ক্রিপ্টকে তার অপারেশন ব্যাচ করা থেকে আটকাতে পারে।

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

কোডিং পদ্ধতি কোড স্নিপেট
আপডেট করা এলিমেন্টের ট্র্যাক রাখুন (সাজেস্ট করা হয়)
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 Ads স্ক্রিপ্টকে একবারে একটি অপারেশন কার্যকর করতে বাধ্য করে। প্রথম পদ্ধতিটি, একই রকম হলেও, ব্যাচিং করার অনুমতি দেয় কারণ আমরা operation.getResult() কে একটি ভিন্ন লুপে কল করি যেখানে এটি তৈরি করা হয়েছিল।

অনেক বেশি আপডেট করার জন্য একসাথে আপলোড করার সুবিধা ব্যবহার করার কথা বিবেচনা করুন

ডেভেলপারদের একটি সাধারণ কাজ হল রিপোর্ট চালানো এবং বর্তমান পারফর্ম্যান্স ভ্যালুর উপর ভিত্তি করে এন্টিটি প্রপার্টি (যেমন, কীওয়ার্ড বিড) আপডেট করা। আপনাকে অনেকগুলি এন্টিটি আপডেট করতে হলে, একসাথে আপলোড করলে আরও ভাল পারফর্ম্যান্স পাওয়া যায়। উদাহরণস্বরূপ, নিম্নলিখিত স্ক্রিপ্টগুলি বিবেচনা করুন যা গত মাসের জন্য TopImpressionPercentage > 0.4 কীওয়ার্ডের MaxCpc বাড়ায়:

কোডিং পদ্ধতি কোড স্নিপেট
একসাথে আপলোড করার সুবিধা ব্যবহার করুন (সাজেস্ট করা হয়)

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 Ads স্ক্রিপ্টে একবার রান করার সময় কতগুলি অবজেক্ট ফিরিয়ে আনা বা আপডেট করা যাবে তার সীমা আছে এবং দ্বিতীয় পদ্ধতিতে বেছে নেওয়া ও আপডেট করার অপারেশন সেই সীমার মধ্যে পড়ে।

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

ক্যাম্পেন অনুযায়ী আপনার একসাথে আপলোড গ্রুপ করুন

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

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

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

রিপোর্ট করা হচ্ছে

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

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

নতুন Google Ads API রিপোর্টিংয়ের সব ফিচারের সুবিধা নিতে, আমরা আপনাকে সার্চ ব্যবহার করার সাজেশন দিই।

AWQL-এর পরিবর্তে GAQL ব্যবহার করুন

যদিও 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);
  }
}

Ads Manager (MCC) স্ক্রিপ্ট

সিরিয়াল এক্সিকিউশনের পরিবর্তে 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();
}

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