Google পত্রক এবং স্লাইড ব্যবহার করে আপনার বড় ডেটাকে অন্তর্দৃষ্টিতে পরিণত করুন৷

১. বিগ ডেটা বিশ্লেষণ থেকে স্লাইড উপস্থাপনা পর্যন্ত

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

গুগল ক্লাউডের ডেভেলপার টুলস আপনাকে গভীর ডেটা বিশ্লেষণ করতে দেয়। এরপর আপনি ফলাফলগুলো নিয়ে একটি স্প্রেডশিটে যুক্ত করতে পারেন এবং সেই ডেটা দিয়ে একটি স্লাইড প্রেজেন্টেশন তৈরি করতে পারেন। এটি ব্যবস্থাপনার কাছে ডেটা পৌঁছে দেওয়ার একটি আরও উপযুক্ত উপায়। এই কোডল্যাবটিতে ক্লাউড কনসোলের BigQuery API (একটি Apps Script অ্যাডভান্সড সার্ভিস হিসেবে) এবং গুগল শিটসগুগল স্লাইডসের বিল্ট-ইন Apps Script সার্ভিসগুলো নিয়ে আলোচনা করা হয়েছে।

অনুপ্রেরণা

এই কোডল্যাবের নমুনা অ্যাপটি নিম্নলিখিত অন্যান্য কোড নমুনাগুলো থেকে অনুপ্রাণিত হয়েছে:

যদিও স্লাইডস এপিআই কোডল্যাব স্যাম্পল অ্যাপটিতেও বিগকোয়েরি এবং স্লাইডস রয়েছে, তবুও এটি এই কোডল্যাবের স্যাম্পল অ্যাপ থেকে বিভিন্ন দিক দিয়ে আলাদা:

  • তাদের Node.js অ্যাপ বনাম আমাদের Apps Script অ্যাপ।
  • তারা REST API ব্যবহার করে, আর আমরা অ্যাপস স্ক্রিপ্ট সার্ভিস ব্যবহার করি।
  • তারা গুগল ড্রাইভ ব্যবহার করে কিন্তু গুগল শিটস ব্যবহার করে না, অথচ এই অ্যাপটি শিটস ব্যবহার করে কিন্তু ড্রাইভ ব্যবহার করে না।

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

আপনি যা শিখবেন

  • একাধিক গুগল পরিষেবার সাথে গুগল অ্যাপস স্ক্রিপ্ট কীভাবে ব্যবহার করবেন
  • বিগ ডেটা বিশ্লেষণ করতে কীভাবে গুগল বিগকোয়েরি ব্যবহার করবেন
  • কীভাবে একটি গুগল শিট তৈরি করবেন এবং তাতে ডেটা প্রবেশ করাবেন
  • শীটসে কীভাবে একটি চার্ট তৈরি করবেন
  • শীটস থেকে গুগল স্লাইডস প্রেজেন্টেশনে ডেটা এবং চার্ট কীভাবে স্থানান্তর করবেন

আপনার যা যা লাগবে

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

২. জরিপ

আপনি এই কোডল্যাব/টিউটোরিয়ালটি কীভাবে ব্যবহার করবেন?

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

গুগল ওয়ার্কস্পেস ডেভেলপার টুলস ও এপিআই ব্যবহারের অভিজ্ঞতাকে আপনি কীভাবে মূল্যায়ন করবেন?

শিক্ষানবিশ মধ্যবর্তী দক্ষ

বিশেষ করে অ্যাপস স্ক্রিপ্ট নিয়ে আপনার অভিজ্ঞতাকে আপনি কীভাবে মূল্যায়ন করবেন?

শিক্ষানবিশ মধ্যবর্তী দক্ষ

ক্লাউড কনসোল ডেভেলপার টুলস ও এপিআই ব্যবহারের অভিজ্ঞতাকে আপনি কীভাবে মূল্যায়ন করবেন?

শিক্ষানবিশ মধ্যবর্তী দক্ষ

৩. সংক্ষিপ্ত বিবরণ

এখন যেহেতু আপনি জানেন এই কোডল্যাবটি কী নিয়ে, আপনাকে যা করতে হবে তা হলো:

  1. বিদ্যমান একটি অ্যাপস স্ক্রিপ্ট-বিগকোয়েরি স্যাম্পল নিন এবং এটিকে কার্যকর করুন।
  2. এই নমুনা থেকে শিখুন, কীভাবে BigQuery-তে কোয়েরি পাঠাতে হয় এবং ফলাফল পেতে হয়।
  3. একটি গুগল শিট তৈরি করুন এবং BigQuery থেকে প্রাপ্ত ফলাফলগুলো তাতে যুক্ত করুন।
  4. ফেরত আসা এবং শীটে সন্নিবেশিত ডেটা সামান্য পরিবর্তন করার জন্য কোডটি পরিমার্জন করুন।
  5. BigQuery ডেটার জন্য চার্ট তৈরি করতে Apps Script-এ Sheets সার্ভিসটি ব্যবহার করুন।
  6. গুগল স্লাইডস প্রেজেন্টেশন তৈরি করতে স্লাইডস পরিষেবাটি ব্যবহার করুন।
  7. ডিফল্ট টাইটেল স্লাইডে একটি শিরোনাম এবং একটি উপ-শিরোনাম যোগ করুন।
  8. একটি ডেটা টেবিলসহ একটি স্লাইড তৈরি করুন এবং শীটটির ডেটা সেলগুলো তাতে এক্সপোর্ট করুন।
  9. আরেকটি স্লাইড তৈরি করুন এবং তাতে স্প্রেডশিট চার্টটি সন্নিবেশ করুন।

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

গুগল অ্যাপস স্ক্রিপ্ট এবং বিগকোয়েরি

গুগল অ্যাপস স্ক্রিপ্ট হলো একটি গুগল ওয়ার্কস্পেস ডেভেলপমেন্ট প্ল্যাটফর্ম যা গুগল REST API-এর চেয়ে উচ্চতর স্তরে কাজ করে। এটি একটি সার্ভারবিহীন ডেভেলপমেন্ট এবং অ্যাপ্লিকেশন হোস্টিং পরিবেশ যা সকল স্তরের ডেভেলপারদের জন্য ব্যবহারযোগ্য। মূলত, অ্যাপস স্ক্রিপ্ট হলো গুগল ওয়ার্কস্পেস অটোমেশন, এক্সটেনশন এবং ইন্টিগ্রেশনের জন্য একটি সার্ভারবিহীন জাভাস্ক্রিপ্ট রানটাইম।

এটি Node.js-এর মতোই সার্ভার-সাইড জাভাস্ক্রিপ্ট ব্যবহার করে, কিন্তু দ্রুত, অ্যাসিঙ্ক্রোনাস ইভেন্ট-ড্রাইভেন অ্যাপ্লিকেশন হোস্টিংয়ের পরিবর্তে Google Workspace এবং অন্যান্য Google পরিষেবাগুলির সাথে নিবিড় সংযোগের উপর বেশি মনোযোগ দেয়। এতে এমন একটি ডেভেলপমেন্ট এনভায়রনমেন্টও রয়েছে যা আপনার পরিচিত পরিবেশ থেকে ভিন্ন হতে পারে। Apps Script-এর মাধ্যমে আপনি যা করতে পারবেন:

  • ব্রাউজার-ভিত্তিক কোড এডিটর ব্যবহার করে স্ক্রিপ্ট তৈরি করা যায়, তবে অ্যাপস স্ক্রিপ্টের কমান্ড-লাইন ডেপ্লয়মেন্ট টুল clasp ব্যবহার করে স্থানীয়ভাবেও ডেভেলপ করা সম্ভব।
  • গুগল ওয়ার্কস্পেস এবং অন্যান্য গুগল বা বাহ্যিক পরিষেবা অ্যাক্সেস করার জন্য (অ্যাপস স্ক্রিপ্টের URL Fetch বা JDBC পরিষেবা ব্যবহার করে) জাভাস্ক্রিপ্টের একটি বিশেষায়িত সংস্করণে কোড লিখুন।
  • অথরাইজেশন কোড লেখা এড়ানো যায়, কারণ অ্যাপস স্ক্রিপ্ট আপনার জন্য এটি পরিচালনা করে।
  • আপনার অ্যাপ হোস্ট করার প্রয়োজন নেই—এটি ক্লাউডে থাকা গুগলের সার্ভারেই থাকে ও চলে।

অ্যাপস স্ক্রিপ্ট অন্যান্য গুগল প্রযুক্তির সাথে ২টি ভিন্ন উপায়ে সংযোগ স্থাপন করে:

  • একটি অন্তর্নির্মিত পরিষেবা হিসাবে
  • একটি উন্নত পরিষেবা হিসাবে

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

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

অ্যাপস স্ক্রিপ্ট থেকে শীট ও স্লাইড অ্যাক্সেস করুন

BigQuery-এর থেকে ভিন্ন, Sheets এবং Slides উভয়েরই বিল্ট-ইন সার্ভিস রয়েছে। এছাড়াও, শুধুমাত্র এপিআই-তে থাকা ফিচারগুলো অ্যাক্সেস করার জন্য এদের অ্যাডভান্সড সার্ভিসও আছে। কোডে যাওয়ার আগে Sheets এবং Slides উভয়ের বিল্ট-ইন সার্ভিসগুলোর ডকুমেন্টেশন দেখে নিন। উল্লেখ্য যে, Sheets এবং Slides উভয়ের অ্যাডভান্সড সার্ভিসগুলোর জন্যও ডকুমেন্টেশন রয়েছে।

৪. কাজ ১: BigQuery চালান এবং ফলাফল Sheets-এ লগ করুন

ভূমিকা

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

  • একটি গুগল অ্যাপস স্ক্রিপ্ট এবং একটি ক্লাউড কনসোল প্রজেক্ট তৈরি করুন।
  • BigQuery অ্যাডভান্সড সার্ভিসে অ্যাক্সেস চালু করুন।
  • স্ক্রিপ্ট এডিটরটি খুলুন এবং অ্যাপ্লিকেশন সোর্স কোডটি প্রবেশ করান।
  • অ্যাপ অনুমোদন প্রক্রিয়া (OAuth2) সম্পন্ন করুন।
  • BigQuery-তে অনুরোধ পাঠায় এমন অ্যাপ্লিকেশনটি চালান।
  • BigQuery-এর ফলাফল ব্যবহার করে তৈরি করা নতুন Google Sheet-টি পর্যালোচনা করুন।

সেটআপ

  1. একটি অ্যাপস স্ক্রিপ্ট প্রজেক্ট তৈরি করতে, script.google.com এ যান এবং 'New project'-এ ক্লিক করুন।
  2. আপনার অ্যাপস স্ক্রিপ্ট প্রজেক্টের নাম পরিবর্তন করতে, ‘Untitled project’-এ ক্লিক করুন, আপনার প্রজেক্টের জন্য একটি শিরোনাম লিখুন এবং ‘Rename’-এ ক্লিক করুন।

এরপরে, BigQuery-তে ডেটা কোয়েরি করার জন্য আপনাকে একটি ক্লাউড কনসোল প্রজেক্ট তৈরি করতে হবে।

  1. একটি ক্লাউড কনসোল প্রজেক্ট তৈরি করতে, এই শর্টকাট লিঙ্কটি ব্যবহার করুন, প্রজেক্টটির একটি নাম দিন এবং 'Create' এ ক্লিক করুন।
  1. প্রজেক্ট তৈরি সম্পন্ন হলে পেজে একটি নোটিফিকেশন দেখা যায়। পেজের উপরের দিকে থাকা প্রজেক্টের তালিকা থেকে আপনার নতুন প্রজেক্টটি সিলেক্ট করা আছে কিনা, তা নিশ্চিত করুন।
  2. মেনুতে ক্লিক করুন f5fbd278915eb7aa.png এবং API ও পরিষেবা > OAuth সম্মতি স্ক্রিনে যান ( সরাসরি লিঙ্ক )।
  3. আপনার প্রতিষ্ঠানের গুগল ওয়ার্কস্পেস ব্যবহারকারীদের জন্য একটি অ্যাপ তৈরি করতে ইন্টারনাল > ক্রিয়েট- এ ক্লিক করুন।
  4. অ্যাপের নামের ফিল্ডে "Big Data Codelab" লিখুন।
  5. ব্যবহারকারী সহায়তা এবং ডেভেলপার যোগাযোগের তথ্যের ক্ষেত্রগুলিতে যোগাযোগের ইমেল প্রবেশ করান।
  6. সংরক্ষণ করুন এবং চালিয়ে যান-এ ক্লিক করুন > সংরক্ষণ করুন এবং চালিয়ে যান
  7. আরও ক্লিক করুন 50fa7e30ed2d1b1c.png নেভিগেশন বারে প্রজেক্ট সেটিংস নির্বাচন করুন ( সরাসরি লিঙ্ক )।
  8. প্রজেক্ট নম্বরের নিচে তালিকাভুক্ত মানটি কপি করুন। (কোডল্যাবের পরবর্তী অংশে একটি আলাদা প্রজেক্ট আইডি ফিল্ড ব্যবহার করা হবে।)

এরপরে, আপনি আপনার অ্যাপস স্ক্রিপ্ট প্রজেক্টটিকে ক্লাউড কনসোল প্রজেক্টের সাথে সংযুক্ত করবেন।

  1. অ্যাপ স্ক্রিপ্ট এডিটরে যান এবং প্রজেক্ট সেটিংসে ক্লিক করুন। সেটিংস-গিয়ার .
  2. Google Cloud Platform (GCP) প্রজেক্টের অধীনে, Change project-এ ক্লিক করুন।
  3. প্রজেক্ট নম্বরটি প্রবেশ করান এবং 'সেট প্রজেক্ট'-এ ক্লিক করুন।
  4. এরপর, এডিটর-এ ক্লিক করুন। কোড-সম্পাদক BigQuery অ্যাডভান্সড সার্ভিস যোগ করা শুরু করতে।
  5. Services-এর পাশে, Add a service-এ ক্লিক করুন। একটি পরিষেবা যোগ করুন .
  6. 'Add a service' ডায়ালগ বক্সে, BigQuery API নির্বাচন করুন এবং 'Add'-এ ক্লিক করুন।

চূড়ান্ত ধাপটি হলো ক্লাউড কনসোলে BigQuery API চালু করা।

  1. এটি করার জন্য, ক্লাউড কনসোলে যান এবং APIs & Services > Dashboard-এ ক্লিক করুন। (নিশ্চিত করুন যে আপনি ধাপ ৩-এ তৈরি করা একই প্রজেক্টে আছেন।)
  2. এপিআই এবং পরিষেবাগুলি সক্ষম করুন -এ ক্লিক করুন।
  3. 'big query' লিখে সার্চ করুন, BigQuery API (BigQuery Data Transfer API নয় ) নির্বাচন করুন এবং এটি চালু করতে Enable-এ ক্লিক করুন।

a0e07fa159de9367.png

আপনি এখন অ্যাপ্লিকেশন কোডটি প্রবেশ করাতে, অনুমোদন প্রক্রিয়াটি সম্পন্ন করতে এবং এই অ্যাপ্লিকেশনটির প্রথম সংস্করণটি চালু করতে প্রস্তুত।

অ্যাপ্লিকেশনটি আপলোড করুন এবং চালান।

  1. স্ক্রিপ্ট এডিটরে, ডিফল্ট myFunction() কোড ব্লকটি নিম্নলিখিত কোড দিয়ে প্রতিস্থাপন করুন:
// File name for data results
var QUERY_NAME = "Most common words in all of Shakespeare's works";
// Replace this value with your Google Cloud Console Project ID
var PROJECT_ID = '';
if (!PROJECT_ID) throw Error('Project ID is required in setup');

/**
 * Runs a BigQuery query; puts results into a Sheet. You must turn on
 * the BigQuery advanced service before you can run this code.
 * @see https://developers.google.com/apps-script/advanced/bigquery#run_query
 * @see https://github.com/googleworkspace/apps-script-samples/blob/master/advanced/bigquery.gs
 *
 * @returns {Spreadsheet} Returns a spreadsheet with BigQuery results
 * @see https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet
 */
function runQuery() {
  // Replace sample with your own BigQuery query.
  var request = {
    query:
        'SELECT ' +
            'LOWER(word) AS word, ' +
            'SUM(word_count) AS count ' +
        'FROM [bigquery-public-data:samples.shakespeare] ' +
        'GROUP BY word ' +
        'ORDER BY count ' +
        'DESC LIMIT 10'
  };
  var queryResults = BigQuery.Jobs.query(request, PROJECT_ID);
  var jobId = queryResults.jobReference.jobId;

  // Wait for BigQuery job completion (with exponential backoff).
  var sleepTimeMs = 500;
  while (!queryResults.jobComplete) {
    Utilities.sleep(sleepTimeMs);
    sleepTimeMs *= 2;
    queryResults = BigQuery.Jobs.getQueryResults(PROJECT_ID, jobId);
  }

  // Get all results from BigQuery.
  var rows = queryResults.rows;
  while (queryResults.pageToken) {
    queryResults = BigQuery.Jobs.getQueryResults(PROJECT_ID, jobId, {
      pageToken: queryResults.pageToken
    });
    rows = rows.concat(queryResults.rows);
  }

  // Return null if no data returned.
  if (!rows) {
    return Logger.log('No rows returned.');
  }

  // Create the results spreadsheet.
  var spreadsheet = SpreadsheetApp.create(QUERY_NAME);
  var sheet = spreadsheet.getActiveSheet();

  // Add headers to Sheet.
  var headers = queryResults.schema.fields.map(function(field) {
    return field.name.toUpperCase();
  });
  sheet.appendRow(headers);

  // Append the results.
  var data = new Array(rows.length);
  for (var i = 0; i < rows.length; i++) {
    var cols = rows[i].f;
    data[i] = new Array(cols.length);
    for (var j = 0; j < cols.length; j++) {
      data[i][j] = cols[j].v;
    }
  }

  // Start storing data in row 2, col 1
  var START_ROW = 2;      // skip header row
  var START_COL = 1;
  sheet.getRange(START_ROW, START_COL, rows.length, headers.length).setValues(data);

  Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());
}
  1. সংরক্ষণ করুন ক্লিক করুন সংরক্ষণ করুন .
  2. Code.gs পাশে, আরও ক্লিক করুন। 50fa7e30ed2d1b1c.png নাম পরিবর্তন করুন । শিরোনামটি Code.gs থেকে bq-sheets-slides.js এ পরিবর্তন করুন।
  3. এরপরে, চলুন সেই কোডটি পর্যালোচনা করা যাক যা BigQuery-তে কোয়েরি করে এবং ফলাফলগুলো একটি Google Sheet-এ লেখে। আপনি এটি runQuery() ফাংশনের উপরের দিকে দেখতে পাবেন:
SELECT
    LOWER(word) AS word,
    SUM(word_count) AS count
FROM [bigquery-public-data:samples.shakespeare]
GROUP BY word
ORDER BY count
DESC LIMIT 10

এই কোয়েরিটি BigQuery-এর পাবলিক ডেটাসেটের অংশ, শেক্সপিয়রের রচনাবলী অনুসন্ধান করে এবং তাঁর সমস্ত রচনায় সর্বাধিক ব্যবহৃত শীর্ষ ১০টি শব্দকে জনপ্রিয়তার অবরোহী ক্রমে সাজিয়ে বের করে। এই সংকলনটি হাতে করতে কতটা পরিশ্রমের কাজ হবে, তা কল্পনা করলেই BigQuery কতটা উপকারী হতে পারে, সে সম্পর্কে একটি ধারণা পাওয়া যায়।

ফাংশনটি একটি PROJECT_ID ভেরিয়েবলও ঘোষণা করে, যার জন্য একটি বৈধ ক্লাউড কনসোল প্রজেক্ট আইডি প্রয়োজন। ভেরিয়েবলটির নিচে if স্টেটমেন্টটি রাখা হয়েছে যাতে প্রজেক্ট আইডি ছাড়া অ্যাপ্লিকেশনটি চলতে না পারে।

  1. আপনার ক্লাউড কনসোল প্রজেক্টে যান, আরও ক্লিক করুন। 50fa7e30ed2d1b1c.png নেভিগেশন বারে, প্রজেক্ট সেটিংস নির্বাচন করুন।
  2. প্রজেক্ট আইডি- এর অধীনে তালিকাভুক্ত মানটি কপি করুন।
  3. অ্যাপ স্ক্রিপ্ট এডিটরে ফিরে যান, bq-sheets-slides.js ফাইলে PROJECT_ID ভেরিয়েবলটি খুঁজুন এবং মানটি যোগ করুন।
  4. সংরক্ষণ করুন ক্লিক করুন সংরক্ষণ করুন দৌড়ান
  5. চালিয়ে যেতে অনুমতি পর্যালোচনা করুন- এ ক্লিক করুন।
  1. স্ক্রিপ্টটি চলতে শুরু করলে, অন্তর্নির্মিত এক্সিকিউশন লগটি খুলে যায় এবং স্ক্রিপ্টের কার্যকলাপগুলো রিয়েল টাইমে রেকর্ড করে।
  1. এক্সিকিউশন লগে "Execution completed" লেখাটি দেখা গেলে, আপনার গুগল ড্রাইভে ( drive.google.com ) যান এবং "Most common words in all of Shakespeare's works" নামের গুগল শিটটি খুঁজুন (অথবা আপনি যদি QUERY_NAME ভেরিয়েবলটি আপডেট করে থাকেন, তবে সেটির জন্য নির্ধারিত নামটি খুঁজুন):
  2. সবচেয়ে বেশি ব্যবহৃত ১০টি শব্দ এবং সেগুলোর মোট সংখ্যা অবরোহী ক্রমে দেখতে স্প্রেডশিটটি খুলুন:

afe500ad43f8cdf8.png

কাজ ১ এর সারাংশ

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

bq-sheets-slides.js এর জন্য আপনি যে কোডটি ব্যবহার করেছেন, তা এই কোডল্যাবের গিটহাব রিপোজিটরি github.com/googlecodelabs/bigquery-sheets-slides- এর step1 ফোল্ডারেও পাওয়া যাবে। কোডটি BigQuery অ্যাডভান্সড সার্ভিসেস পেজের একটি মূল উদাহরণ থেকে অনুপ্রাণিত, যেখানে শেক্সপিয়রের ব্যবহৃত ১০ বা তার বেশি অক্ষরের সবচেয়ে জনপ্রিয় শব্দগুলো খুঁজে বের করার জন্য কিছুটা ভিন্ন একটি কোয়েরি চালানো হয়েছিল। আপনি এর গিটহাব রিপোতেও একটি উদাহরণ দেখতে পারেন।

আপনি যদি শেক্সপিয়রের রচনা বা অন্যান্য পাবলিক ডেটা টেবিল ব্যবহার করে তৈরি করা যায় এমন অন্যান্য কোয়েরি সম্পর্কে আগ্রহী হন, তাহলে "How to Query the BigQuery Sample Tables" এবং এই গিটহাব রিপোটি দেখুন।

অ্যাপস স্ক্রিপ্টে চালানোর আগে, আপনি ক্লাউড কনসোলের BigQuery পৃষ্ঠা ব্যবহার করেও কোয়েরিগুলো চালাতে পারেন। এটি খুঁজে পেতে, মেনুতে ক্লিক করুন। f5fbd278915eb7aa.png এবং BigQuery UI > SQL workspace- এ যান ( সরাসরি লিঙ্ক )। উদাহরণস্বরূপ, BigQuery গ্রাফিক্যাল ইন্টারফেসে আমাদের কোয়েরিটি দেখতে এইরকম:

BigQueryUI

৫. কাজ ২: গুগল শিটসে একটি চার্ট তৈরি করুন

runQuery() -এর উদ্দেশ্য হলো BigQuery ব্যবহার করে এর ডেটার ফলাফল একটি Google Sheet-এ পাঠানো। এরপর আমাদের এই ডেটা ব্যবহার করে একটি চার্ট তৈরি করতে হবে। চলুন createColumnChart() নামে একটি নতুন ফাংশন তৈরি করি, যা Sheets-এর ` newChart() মেথডকে কল করবে।

  1. অ্যাপস স্ক্রিপ্ট এডিটরে, bq-sheets-slides.js ফাইলে runQuery() পরে createColumnChart() ফাংশনটি যোগ করুন। এই কোডটি শীটটি সংগ্রহ করে এবং সমস্ত ডেটা সহ একটি কলামভিত্তিক চার্টের জন্য অনুরোধ করে। ডেটার পরিসর A2 সেল থেকে শুরু হয়, কারণ প্রথম সারিতে কলাম হেডারগুলো থাকে।
/**
 * Uses spreadsheet data to create a column chart.
 * @param {Spreadsheet} Spreadsheet containing results data
 * @returns {EmbeddedChart} Visualizes the results
 * @see https://developers.google.com/apps-script/reference/spreadsheet/embedded-chart
 */
function createColumnChart(spreadsheet) {
  // Retrieve the populated (first) Sheet.
  var sheet = spreadsheet.getSheets()[0];
  // Data range in Sheet is from cell A2 to B11.
  var START_CELL = 'A2';  // skip header row
  var END_CELL = 'B11';
  // Place chart on Sheet starting on cell E5.
  var START_ROW = 5;      // row 5
  var START_COL = 5;      // col E
  var OFFSET = 0;

  // Create & place chart on the Sheet using above values.
  var chart = sheet.newChart()
     .setChartType(Charts.ChartType.COLUMN)
     .addRange(sheet.getRange(START_CELL + ':' + END_CELL))
     .setPosition(START_ROW, START_COL, OFFSET, OFFSET)
     .build();
  sheet.insertChart(chart);
}
  1. createColumnChart() ফাংশনটির জন্য একটি স্প্রেডশীট অবজেক্ট প্যারামিটার প্রয়োজন, তাই আমাদের runQuery() ফাংশনটিকে এমনভাবে আপডেট করতে হবে যাতে এটি একটি spreadsheet অবজেক্ট রিটার্ন করে, যা আমরা createColumnChart() ফাংশনে পাস করতে পারি। runQuery() ফাংশনের শেষে, শীটটি সফলভাবে তৈরি হওয়ার লগ দেওয়ার পর spreadsheet অবজেক্টটি রিটার্ন করুন।
  Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());

  // NEW: Return the spreadsheet object for later use.
  return spreadsheet;
}
  1. runQuery() এবং createColumnChart() উভয় ফাংশনকে কল করার জন্য একটি createBigQueryPresentation() ফাংশন তৈরি করুন। BigQuery এবং চার্ট তৈরির কার্যকারিতাকে যৌক্তিকভাবে পৃথক রাখাই সর্বোত্তম অনুশীলন।
/**
 * Runs the query, adds data and a chart to a spreadsheet.
 */
function createBigQueryPresentation() {
  var spreadsheet = runQuery();
  createColumnChart(spreadsheet);
}
  1. আপনি উপরে দুটি গুরুত্বপূর্ণ পদক্ষেপ নিয়েছেন: স্প্রেডশীট অবজেক্টটি রিটার্ন করা এবং এন্ট্রি ফাংশন তৈরি করা। runQuery() কে আরও ব্যবহারযোগ্য করতে, আমাদের লগ লাইনটি runQuery() থেকে createBigQueryPresentation() -এ সরাতে হবে। আপনার মেথডটি এখন দেখতে এইরকম হবে:
/**
 * Runs a BigQuery query, adds data and a chart to a spreadsheet.
 */
function createBigQueryPresentation() {
  var spreadsheet = runQuery();
  Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl()); // MOVED HERE
  createColumnChart(spreadsheet);
}

উপরের পরিবর্তনগুলো করার পর ( PROJECT_ID ছাড়া), আপনার bq-sheets-slides.js এখন নিচের মতো দেখতে হবে। এই কোডটি গিটহাব রিপোজিটরির step2 তেও পাওয়া যাবে।

// File name for data results
var QUERY_NAME = "Most common words in all of Shakespeare's works";
// Replace this value with your Google Cloud Console Project ID
var PROJECT_ID = '';
if (!PROJECT_ID) throw Error('Project ID is required in setup');

/**
 * Runs a BigQuery query; puts results into a sheet. You must turn on
 * the BigQuery advanced service before you can run this code.
 * @see https://developers.google.com/apps-script/advanced/bigquery#run_query
 * @see https://github.com/googleworkspace/apps-script-samples/blob/master/advanced/bigquery.gs
 *
 * @returns {Spreadsheet} Returns a spreadsheet with BigQuery results
 * @see https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet
 */
function runQuery() {
  // Replace sample with your own BigQuery query.
  var request = {
    query:
        'SELECT ' +
            'LOWER(word) AS word, ' +
            'SUM(word_count) AS count ' +
        'FROM [bigquery-public-data:samples.shakespeare] ' +
        'GROUP BY word ' +
        'ORDER BY count ' +
        'DESC LIMIT 10'
  };
  var queryResults = BigQuery.Jobs.query(request, PROJECT_ID);
  var jobId = queryResults.jobReference.jobId;

  // Wait for BigQuery job completion (with exponential backoff).
  var sleepTimeMs = 500;
  while (!queryResults.jobComplete) {
    Utilities.sleep(sleepTimeMs);
    sleepTimeMs *= 2;
    queryResults = BigQuery.Jobs.getQueryResults(PROJECT_ID, jobId);
  }

  // Get all results from BigQuery.
  var rows = queryResults.rows;
  while (queryResults.pageToken) {
    queryResults = BigQuery.Jobs.getQueryResults(PROJECT_ID, jobId, {
      pageToken: queryResults.pageToken
    });
    rows = rows.concat(queryResults.rows);
  }

  // Return null if no data returned.
  if (!rows) {
    return Logger.log('No rows returned.');
  }

  // Create the results spreadsheet.
  var spreadsheet = SpreadsheetApp.create(QUERY_NAME);
  var sheet = spreadsheet.getActiveSheet();

  // Add headers to sheet.
  var headers = queryResults.schema.fields.map(function(field) {
    return field.name.toUpperCase();
  });
  sheet.appendRow(headers);

  // Append the results.
  var data = new Array(rows.length);
  for (var i = 0; i < rows.length; i++) {
    var cols = rows[i].f;
    data[i] = new Array(cols.length);
    for (var j = 0; j < cols.length; j++) {
      data[i][j] = cols[j].v;
    }
  }

  // Start storing data in row 2, col 1
  var START_ROW = 2;      // skip header row
  var START_COL = 1;
  sheet.getRange(START_ROW, START_COL, rows.length, headers.length).setValues(data);

  // Return the spreadsheet object for later use.
  return spreadsheet;
}

/**
 * Uses spreadsheet data to create a columnar chart.
 * @param {Spreadsheet} Spreadsheet containing results data
 * @returns {EmbeddedChart} Visualizes the results
 * @see https://developers.google.com/apps-script/reference/spreadsheet/embedded-chart
 */
function createColumnChart(spreadsheet) {
  // Retrieve the populated (first) sheet.
  var sheet = spreadsheet.getSheets()[0];
  // Data range in sheet is from cell A2 to B11.
  var START_CELL = 'A2';  // skip header row
  var END_CELL = 'B11';
  // Place chart on Sheet starting on cell E5.
  var START_ROW = 5;      // row 5
  var START_COL = 5;      // col E
  var OFFSET = 0;

  // Create & place chart on the sheet using above values.
  var chart = sheet.newChart()
     .setChartType(Charts.ChartType.COLUMN)
     .addRange(sheet.getRange(START_CELL + ':' + END_CELL))
     .setPosition(START_ROW, START_COL, OFFSET, OFFSET)
     .build();
  sheet.insertChart(chart);
}

/**
 * Runs a BigQuery query, adds data and a chart to a spreadsheet.
 */
function createBigQueryPresentation() {
  var spreadsheet = runQuery();
  Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());
  createColumnChart(spreadsheet);
}

স্ক্রিপ্ট এডিটরে আপনার স্ক্রিপ্ট প্রজেক্টটি সেভ করুন। এরপর ফাংশন তালিকা থেকে createBigQueryPresentation নির্বাচন করে `Run`-এ ক্লিক করুন। এটি সম্পন্ন হলে, আপনার গুগল ড্রাইভে আরেকটি স্প্রেডশিট তৈরি হবে, কিন্তু এবার ডেটার পাশে শীটটিতে একটি চার্টও অন্তর্ভুক্ত থাকবে।

চার্ট সহ শীট

৬. কাজ ৩: ফলাফলের ডেটাগুলো একটি স্লাইড ডেকে সাজান।

কোডল্যাবের শেষ অংশে একটি গুগল স্লাইডস প্রেজেন্টেশন তৈরি করা, টাইটেল স্লাইডে শিরোনাম ও উপ-শিরোনাম যোগ করা এবং তারপর ডেটা সেল ও চার্টের জন্য স্লাইড তৈরি করতে হবে।

  1. অ্যাপস স্ক্রিপ্ট এডিটরে, bq-sheets-slides.js ফাইলে createColumnChart() ফাংশনের পরে createSlidePresentation() ফাংশনটি যোগ করুন। স্লাইড ডেকের সমস্ত কাজ এই ফাংশনের মধ্যেই সম্পন্ন হয়। চলুন, প্রথমে একটি স্লাইড ডেক তৈরি করা যাক এবং তারপর ডিফল্ট টাইটেল স্লাইডে একটি শিরোনাম ও উপ-শিরোনাম যোগ করা যাক।
/**
 * Create presentation with spreadsheet data and a chart
 * @param {Spreadsheet} Spreadsheet containing results data
 * @param {EmbeddedChart} Sheets chart to embed on a slide
 * @returns {Presentation} Slide deck with the results
  * @see https://developers.google.com/apps-script/reference/slides/presentation
 */
function createSlidePresentation(spreadsheet, chart) {
  // Create the presentation.
  var deck = SlidesApp.create(QUERY_NAME);

  // Populate the title slide.
  var [title, subtitle] = deck.getSlides()[0].getPageElements();
  title.asShape().getText().setText(QUERY_NAME);
  subtitle.asShape().getText().setText('using Google Cloud Console and Google Workspace APIs:\n' +
    'Google Apps Script, BigQuery, Sheets, Slides');
  1. createSlidePresentation() ফাংশনের পরবর্তী ধাপ হলো গুগল শিট থেকে সেল ডেটা আমাদের নতুন স্লাইড ডেকে ইম্পোর্ট করা। ফাংশনটিতে এই কোড স্নিপেটটি যোগ করুন:
  // Data range to copy is from cell A1 to B11
  var START_CELL = 'A1';  // include header row
  var END_CELL = 'B11';
  // Add the table slide and insert an empty table on it with
  // the dimensions of the data range; fails if the sheet is empty.
  var tableSlide = deck.appendSlide(SlidesApp.PredefinedLayout.BLANK);
  var sheetValues = spreadsheet.getSheets()[0].getRange(
      START_CELL + ':' + END_CELL).getValues();
  var table = tableSlide.insertTable(sheetValues.length, sheetValues[0].length);

  // Populate the table with spreadsheet data.
  for (var i = 0; i < sheetValues.length; i++) {
    for (var j = 0; j < sheetValues[0].length; j++) {
      table.getCell(i, j).getText().setText(String(sheetValues[i][j]));
    }
  }
  1. createSlidePresentation() ফাংশনের চূড়ান্ত ধাপ হলো আরও একটি স্লাইড যোগ করা, আমাদের স্প্রেডশীট থেকে চার্টটি ইম্পোর্ট করা এবং Presentation অবজেক্টটি রিটার্ন করা। ফাংশনটিতে এই কোড স্নিপেটটি যোগ করুন:
  // Add a chart slide and insert the chart on it.
  var chartSlide = deck.appendSlide(SlidesApp.PredefinedLayout.BLANK);
  chartSlide.insertSheetsChart(chart);

  // Return the presentation object for later use.
  return deck;
}
  1. এখন যেহেতু আমাদের ফাংশনটি সম্পূর্ণ হয়েছে, এর সিগনেচারটি আবার দেখুন। createSlidePresentation() ফাংশনটির জন্য স্প্রেডশীট এবং চার্ট অবজেক্ট উভয় প্যারামিটারই প্রয়োজন। আমরা ইতিমধ্যেই runQuery() ফাংশনটিকে Spreadsheet অবজেক্ট রিটার্ন করার জন্য পরিবর্তন করেছি, কিন্তু আমাদের createColumnChart() ফাংশনেও একই রকম পরিবর্তন করতে হবে যাতে এটি একটি চার্ট অবজেক্ট ( EmbeddedChart ) রিটার্ন করে। createColumnChart() ফাংশনে ফিরে যান এবং ফাংশনের শেষে নিম্নলিখিত কোড স্নিপেটটি যোগ করুন:
  // NEW: Return the chart object for later use.
  return chart;
}
  1. যেহেতু createColumnChart() এখন একটি চার্ট অবজেক্ট রিটার্ন করে, তাই আমাদের চার্টটিকে একটি ভেরিয়েবলে সেভ করতে হবে। এরপর আমরা স্প্রেডশিট এবং চার্ট উভয় ভেরিয়েবলই createSlidePresentation() -এ পাস করব। এছাড়াও, যেহেতু আমরা নতুন তৈরি হওয়া স্প্রেডশিটের URL লগ করছি, তাই নতুন স্লাইড প্রেজেন্টেশনের URL-টিও লগ করে নিই। আপনার createBigQueryPresentation() আপডেট করুন যাতে এটি দেখতে এইরকম হয়:
/**
 * Runs a BigQuery query, adds data and a chart to a spreadsheet,
 * and adds the data and chart to a new slide presentation.
 */
function createBigQueryPresentation() {
  var spreadsheet = runQuery();
  Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());
  var chart = createColumnChart(spreadsheet); // UPDATED
  var deck = createSlidePresentation(spreadsheet, chart); // NEW
  Logger.log('Results slide deck created: %s', deck.getUrl()); // NEW
}
  1. createBigQueryPresentation() সেভ করে আবার রান করুন। তবে এটি কার্যকর হওয়ার আগে, গুগল স্লাইডস প্রেজেন্টেশন দেখা ও পরিচালনা করার জন্য আপনার অ্যাপের ব্যবহারকারীর কাছ থেকে আরও এক সেট অনুমতির প্রয়োজন হবে। আপনি এই অনুমতিগুলো পর্যালোচনা করে মঞ্জুর করলে, এটি আগের মতোই রান করবে।
  2. এখন, তৈরি হওয়া স্প্রেডশিটটির পাশাপাশি আপনি ৩টি স্লাইড (শিরোনাম, ডেটা টেবিল, ডেটা চার্ট) সহ একটি নতুন স্লাইডস প্রেজেন্টেশনও পাবেন, যা নিচে দেখানো হয়েছে:

f6896f22cc3cd50d.png

59960803e62f7c69.png

5549f0ea81514360.png

৭. উপসংহার

অভিনন্দন, আপনি এমন একটি অ্যাপ্লিকেশন তৈরি করেছেন যা গুগল ক্লাউডের উভয় সুবিধাই ব্যবহার করে। এটি গুগল বিগকোয়েরি (Google BigQuery) এর একটি পাবলিক ডেটাসেট থেকে ডেটা কোয়েরি করে, ফলাফল সংরক্ষণের জন্য একটি গুগল শিটস (Google Sheets) স্প্রেডশিট তৈরি করে, সেই ডেটার উপর ভিত্তি করে একটি চার্ট যোগ করে এবং সবশেষে স্প্রেডশিট থেকে প্রাপ্ত ডেটা ও চার্টের ফলাফল সম্বলিত একটি গুগল স্লাইডস (Google Slides) প্রেজেন্টেশন তৈরি করে।

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

চূড়ান্ত টাস্কের পরিবর্তনগুলির পর ( PROJECT_ID বাদে), আপনার bq-sheets-slides.js এখন নিম্নলিখিতের মতো দেখতে হবে:

/**
 * Copyright 2018 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at apache.org/licenses/LICENSE-2.0.
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

// File name for data results
var QUERY_NAME = "Most common words in all of Shakespeare's works";
// Replace this value with your Google Cloud Console Project ID
var PROJECT_ID = '';
if (!PROJECT_ID) throw Error('Project ID is required in setup');

/**
 * Runs a BigQuery query; puts results into a spreadsheet. You must turn on
 * the BigQuery advanced service before you can run this code.
 * @see https://developers.google.com/apps-script/advanced/bigquery#run_query
 * @see https://github.com/googleworkspace/apps-script-samples/blob/master/advanced/bigquery.gs
 *
 * @returns {Spreadsheet} Returns a spreadsheet with BigQuery results
 * @see https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet
 */
function runQuery() {
  // Replace sample with your own BigQuery query.
  var request = {
    query:
        'SELECT ' +
            'LOWER(word) AS word, ' +
            'SUM(word_count) AS count ' +
        'FROM [bigquery-public-data:samples.shakespeare] ' +
        'GROUP BY word ' +
        'ORDER BY count ' +
        'DESC LIMIT 10'
  };
  var queryResults = BigQuery.Jobs.query(request, PROJECT_ID);
  var jobId = queryResults.jobReference.jobId;

  // Wait for BigQuery job completion (with exponential backoff).
  var sleepTimeMs = 500;
  while (!queryResults.jobComplete) {
    Utilities.sleep(sleepTimeMs);
    sleepTimeMs *= 2;
    queryResults = BigQuery.Jobs.getQueryResults(PROJECT_ID, jobId);
  }

  // Get all results from BigQuery.
  var rows = queryResults.rows;
  while (queryResults.pageToken) {
    queryResults = BigQuery.Jobs.getQueryResults(PROJECT_ID, jobId, {
      pageToken: queryResults.pageToken
    });
    rows = rows.concat(queryResults.rows);
  }

  // Return null if no data returned.
  if (!rows) {
    return Logger.log('No rows returned.');
  }

  // Create the results spreadsheet.
  var spreadsheet = SpreadsheetApp.create(QUERY_NAME);
  var sheet = spreadsheet.getActiveSheet();

  // Add headers to sheet.
  var headers = queryResults.schema.fields.map(function(field) {
    return field.name.toUpperCase();
  });
  sheet.appendRow(headers);

  // Append the results.
  var data = new Array(rows.length);
  for (var i = 0; i < rows.length; i++) {
    var cols = rows[i].f;
    data[i] = new Array(cols.length);
    for (var j = 0; j < cols.length; j++) {
      data[i][j] = cols[j].v;
    }
  }

  // Start storing data in row 2, col 1
  var START_ROW = 2;      // skip header row
  var START_COL = 1;
  sheet.getRange(START_ROW, START_COL, rows.length, headers.length).setValues(data);

  // Return the spreadsheet object for later use.
  return spreadsheet;
}

/**
 * Uses spreadsheet data to create a column chart.
 * @param {Spreadsheet} Spreadsheet containing results data
 * @returns {EmbeddedChart} Visualizes the results
 * @see https://developers.google.com/apps-script/reference/spreadsheet/embedded-chart
 */
function createColumnChart(spreadsheet) {
  // Retrieve the populated (first) sheet.
  var sheet = spreadsheet.getSheets()[0];
  // Data range in sheet is from cell A2 to B11.
  var START_CELL = 'A2';  // skip header row
  var END_CELL = 'B11';
  // Place chart on sheet starting on cell E5.
  var START_ROW = 5;      // row 5
  var START_COL = 5;      // col E
  var OFFSET = 0;

  // Create & place chart on the sheet using above values.
  var chart = sheet.newChart()
     .setChartType(Charts.ChartType.COLUMN)
     .addRange(sheet.getRange(START_CELL + ':' + END_CELL))
     .setPosition(START_ROW, START_COL, OFFSET, OFFSET)
     .build();
  sheet.insertChart(chart);
  
  // Return the chart object for later use.
  return chart;
}

/**
 * Create presentation with spreadsheet data and a chart
 * @param {Spreadsheet} Spreadsheet containing results data
 * @param {EmbeddedChart} Sheets chart to embed on a slide
 * @returns {Presentation} Slide deck with the results
 * @see https://developers.google.com/apps-script/reference/slides/presentation
 */
function createSlidePresentation(spreadsheet, chart) {
  // Create the presentation.
  var deck = SlidesApp.create(QUERY_NAME);

  // Populate the title slide.
  var [title, subtitle] = deck.getSlides()[0].getPageElements();
  title.asShape().getText().setText(QUERY_NAME);
  subtitle.asShape().getText().setText('using Google Cloud Console and Google Workspace APIs:\n' +
    'Google Apps Script, BigQuery, Sheets, Slides');

  // Data range to copy is from cell A1 to B11
  var START_CELL = 'A1';  // include header row
  var END_CELL = 'B11';
  // Add the table slide and insert an empty table on it with
  // the dimensions of the data range; fails if the sheet is empty.
  var tableSlide = deck.appendSlide(SlidesApp.PredefinedLayout.BLANK);
  var sheetValues = spreadsheet.getSheets()[0].getRange(
      START_CELL + ':' + END_CELL).getValues();
  var table = tableSlide.insertTable(sheetValues.length, sheetValues[0].length);

  // Populate the table with spreadsheet data.
  for (var i = 0; i < sheetValues.length; i++) {
    for (var j = 0; j < sheetValues[0].length; j++) {
      table.getCell(i, j).getText().setText(String(sheetValues[i][j]));
    }
  }

  // Add a chart slide and insert the chart on it.
  var chartSlide = deck.appendSlide(SlidesApp.PredefinedLayout.BLANK);
  chartSlide.insertSheetsChart(chart);

  // Return the presentation object for later use.
  return deck;
}

/**
 * Runs a BigQuery query, adds data and a chart to a spreadsheet,
 * and adds the data and chart to a new slide presentation.
 */
function createBigQueryPresentation() {
  var spreadsheet = runQuery();
  Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());
  var chart = createColumnChart(spreadsheet);
  var deck = createSlidePresentation(spreadsheet, chart);
  Logger.log('Results slide deck created: %s', deck.getUrl());
}

এই কোড নমুনাটি গিটহাব রিপো-র final ফোল্ডারেও পাওয়া যাবে।

৮. অতিরিক্ত সম্পদ

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

এই অ্যাপ্লিকেশনের জন্য প্রয়োজনীয় উপকরণ

ডকুমেন্টেশন

ভিডিও

সংবাদ ও আপডেট

অন্যান্য কোডল্যাব

ভূমিকা

মধ্যবর্তী

৯. পরবর্তী ধাপ: কোড চ্যালেঞ্জ

এই কোডল্যাবে আমরা যে নমুনাটি তৈরি করেছি, সেটিকে আপনি কীভাবে আরও উন্নত বা পরিবর্ধন করতে পারেন, তার বিভিন্ন উপায় নিচে তালিকাভুক্ত করা হলো। এই তালিকাটি সম্পূর্ণ নয়, তবে আপনি কীভাবে পরবর্তী পদক্ষেপ নিতে পারেন সে সম্পর্কে এটি কিছু অনুপ্রেরণামূলক ধারণা দেবে।

  • অ্যাপ্লিকেশন — শুধু জাভাস্ক্রিপ্ট ব্যবহারে বা অ্যাপস স্ক্রিপ্টের আরোপিত বিধিনিষেধের মধ্যে সীমাবদ্ধ থাকতে চান না? এই অ্যাপ্লিকেশনটিকে আপনার পছন্দের প্রোগ্রামিং ভাষায় পোর্ট করুন, যা গুগল বিগকোয়েরি, শিটস এবং স্লাইডসের REST API ব্যবহার করে।
  • BigQuery — শেক্সপিয়র ডেটাসেটের জন্য আপনার পছন্দের একটি ভিন্ন কোয়েরি নিয়ে পরীক্ষা করুন। আরেকটি নমুনা কোয়েরি মূল অ্যাপস স্ক্রিপ্ট BigQuery নমুনা অ্যাপে পাওয়া যাবে।
  • BigQuery — আপনার কাছে আরও অর্থবহ একটি ডেটাসেট খুঁজে বের করার জন্য BigQuery-এর অন্যান্য পাবলিক ডেটাসেটগুলো নিয়ে পরীক্ষা-নিরীক্ষা করুন।
  • BigQuery — এর আগে, আমরা শেক্সপিয়রের রচনা বা অন্যান্য পাবলিক ডেটা টেবিল ব্যবহার করে তৈরি করা যায় এমন আরও কিছু কোয়েরির কথা উল্লেখ করেছি। সেগুলো এই ওয়েব পেজে এবং এই গিটহাব রিপোজিটরিতে পাওয়া যাবে।
  • শিটচার্ট গ্যালারিতে অন্যান্য চার্টের ধরন নিয়ে পরীক্ষা-নিরীক্ষা করুন।
  • শীটস ও বিগকোয়েরি — আপনার নিজস্ব বৃহৎ স্প্রেডশীট ডেটাসেট ব্যবহার করুন। ২০১৬ সালে, বিগকোয়েরি টিম ডেভেলপারদের ডেটা সোর্স হিসেবে একটি শীট ব্যবহার করার সুযোগ দিতে একটি ফিচার চালু করে। আরও তথ্যের জন্য, এখানে যান ( গুগল বিগকোয়েরি গুগল ড্রাইভের সাথে ইন্টিগ্রেট করে )।
  • স্লাইডস —তৈরি করা প্রেজেন্টেশনে অন্যান্য স্লাইড যোগ করুন, যেমন ছবি বা আপনার বিগ ডেটা বিশ্লেষণের সাথে সম্পর্কিত অন্যান্য অ্যাসেট। এখানে স্লাইডস বিল্ট-ইন সার্ভিসের রেফারেন্স ডকুমেন্টেশন দেওয়া হলো।
  • গুগল ওয়ার্কস্পেস — অ্যাপস স্ক্রিপ্ট থেকে অন্যান্য গুগল ওয়ার্কস্পেস বা গুগলের বিল্ট-ইন পরিষেবাগুলো ব্যবহার করুন। যেমন, জিমেইল, ক্যালেন্ডার, ডক্স, ড্রাইভ, ম্যাপস, অ্যানালিটিক্স, ইউটিউব ইত্যাদি, সেইসাথে অন্যান্য অ্যাডভান্সড পরিষেবাগুলোও। আরও তথ্যের জন্য, বিল্ট-ইন এবং অ্যাডভান্সড উভয় পরিষেবার রেফারেন্স ওভারভিউ দেখুন।