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

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 ব্যবহার করা

রিপোর্ট কোয়েরি ও 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);
  }
}

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 কলের সংখ্যার কারণে প্রথম স্নিপেটের তুলনায় এটি এখনও খারাপ পারফর্ম্যান্স দেয়।