স্মার্ট চিপ সহ Google Books থেকে লিঙ্কগুলির পূর্বরূপ দেখুন

কোডিং স্তর : মধ্যবর্তী
সময়কাল : ৩০ মিনিট
প্রকল্পের ধরণ : গুগল ওয়ার্কস্পেস অ্যাড-অন

উদ্দেশ্য

  • অ্যাড-অনটি কী কাজ করে তা বুঝুন।
  • অ্যাপস স্ক্রিপ্ট ব্যবহার করে কীভাবে একটি অ্যাড-অন তৈরি করতে হয় এবং অ্যাপস স্ক্রিপ্ট সার্ভিসগুলো কী কাজ করে, তা বুঝুন।
  • আপনার পরিবেশ প্রস্তুত করুন।
  • স্ক্রিপ্টটি সেট আপ করুন।
  • স্ক্রিপ্টটি চালান।

এই গুগল ওয়ার্কস্পেস অ্যাড-অন সম্পর্কে

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

এই অ্যাড-অনটি অ্যাপস স্ক্রিপ্টের UrlFetch সার্ভিস ব্যবহার করে গুগল বুকস এপিআই-এর সাথে সংযোগ স্থাপন করে এবং গুগল ডকস-এ প্রদর্শনের জন্য গুগল বুকস সম্পর্কিত তথ্য সংগ্রহ করে।

এটি কীভাবে কাজ করে

Google Workspace অ্যাড-অনটির ম্যানিফেস্ট ফাইলে থাকা স্ক্রিপ্টটি, Google Docs-কে সম্প্রসারিত করতে এবং Google Books ওয়েবসাইট ( https://books.google.com ) থেকে নির্দিষ্ট প্যাটার্নের সাথে মেলে এমন URL-গুলির জন্য লিঙ্ক প্রিভিউ চালু করতে অ্যাড-অনটিকে কনফিগার করে।

কোড ফাইলে, স্ক্রিপ্টটি গুগল বুকস এপিআই-এর সাথে সংযোগ স্থাপন করে এবং ইউআরএল ব্যবহার করে বইটি সম্পর্কে তথ্য সংগ্রহ করে (যা Volume রিসোর্সের একটি ইনস্ট্যান্স)। স্ক্রিপ্টটি এই তথ্য ব্যবহার করে একটি স্মার্ট চিপ তৈরি করে, যা বইটির শিরোনাম প্রদর্শন করে, এবং একটি প্রিভিউ কার্ড তৈরি করে, যেখানে বইটির সারাংশ, পৃষ্ঠাসংখ্যা, বইয়ের প্রচ্ছদের ছবি ও রেটিং সংখ্যা দেখানো হয়।

অ্যাপস স্ক্রিপ্ট পরিষেবা

এই অ্যাড-অনটি নিম্নলিখিত পরিষেবাগুলি ব্যবহার করে:

পূর্বশর্ত

এই নমুনাটি ব্যবহার করার জন্য আপনার নিম্নলিখিত পূর্বশর্তগুলো প্রয়োজন:

  • একটি গুগল অ্যাকাউন্ট (গুগল ওয়ার্কস্পেস অ্যাকাউন্টের জন্য প্রশাসকের অনুমোদনের প্রয়োজন হতে পারে)।
  • ইন্টারনেট সংযোগসহ একটি ওয়েব ব্রাউজার।

  • একটি গুগল ক্লাউড প্রকল্প

আপনার পরিবেশ তৈরি করুন

নিম্নলিখিত বিভাগগুলি অ্যাড-অনটি তৈরির জন্য আপনার পরিবেশ প্রস্তুত করবে।

গুগল ক্লাউড কনসোলে আপনার ক্লাউড প্রজেক্টটি খুলুন।

যদি আগে থেকে খোলা না থাকে, তাহলে এই স্যাম্পলটির জন্য আপনি যে ক্লাউড প্রজেক্টটি ব্যবহার করতে চান সেটি খুলুন:

  1. গুগল ক্লাউড কনসোলে, 'Select a project' পেজে যান।

    একটি ক্লাউড প্রকল্প নির্বাচন করুন

  2. আপনি যে গুগল ক্লাউড প্রজেক্টটি ব্যবহার করতে চান, সেটি নির্বাচন করুন। অথবা, 'Create project'-এ ক্লিক করুন এবং স্ক্রিনে দেওয়া নির্দেশাবলী অনুসরণ করুন। আপনি যদি একটি গুগল ক্লাউড প্রজেক্ট তৈরি করেন, তাহলে প্রজেক্টটির জন্য বিলিং চালু করার প্রয়োজন হতে পারে।

গুগল বুকস এপিআই চালু করুন

এই অ্যাড-অনটি গুগল বুকস এপিআই-এর সাথে সংযুক্ত হয়। গুগল এপিআই ব্যবহার করার আগে, আপনাকে একটি গুগল ক্লাউড প্রজেক্টে সেগুলি চালু করতে হবে। আপনি একটি একক গুগল ক্লাউড প্রজেক্টে এক বা একাধিক এপিআই চালু করতে পারেন।

এই অ্যাড-অনটির জন্য একটি কনফিগার করা কনসেন্ট স্ক্রিনসহ একটি ক্লাউড প্রজেক্ট প্রয়োজন। OAuth কনসেন্ট স্ক্রিনটি কনফিগার করলে নির্ধারিত হয় গুগল ব্যবহারকারীদের কী দেখাবে এবং আপনার অ্যাপটি রেজিস্টার হয়ে যায়, যাতে আপনি পরবর্তীতে এটি পাবলিশ করতে পারেন।

  1. Google API কনসোলে, > Google Auth প্ল্যাটফর্ম > ব্র্যান্ডিং- এ যান।

    ব্র্যান্ডিং-এ যান

  2. আপনি যদি ইতিমধ্যেই Google Auth প্ল্যাটফর্মটি কনফিগার করে থাকেন, তাহলে আপনি Branding , Audience , এবং Data Access- এ নিম্নলিখিত OAuth Consent Screen সেটিংস কনফিগার করতে পারেন। যদি আপনি এমন কোনো বার্তা দেখতে পান যেখানে লেখা আছে ‘Google Auth প্ল্যাটফর্ম এখনও কনফিগার করা হয়নি’ , তাহলে Get Started-এ ক্লিক করুন:
    1. 'অ্যাপ ইনফরমেশন'- এর অধীনে 'অ্যাপ নেম' -এ অ্যাপটির জন্য একটি নাম লিখুন।
    2. ব্যবহারকারী সহায়তা ইমেল- এ, এমন একটি সহায়তা ইমেল ঠিকানা বেছে নিন যেখানে ব্যবহারকারীরা তাদের সম্মতি সম্পর্কে কোনো প্রশ্ন থাকলে আপনার সাথে যোগাযোগ করতে পারে।
    3. পরবর্তী ধাপে যান।
    4. Audience-এর অধীনে Internal নির্বাচন করুন।
    5. পরবর্তী ধাপে যান।
    6. যোগাযোগের তথ্যের অধীনে, একটি ইমেল ঠিকানা লিখুন যেখানে আপনার প্রকল্পের যেকোনো পরিবর্তন সম্পর্কে আপনাকে জানানো যাবে।
    7. পরবর্তী ধাপে যান।
    8. Finish-এর অধীনে, Google API Services ব্যবহারকারীর ডেটা নীতি পর্যালোচনা করুন এবং যদি আপনি সম্মত হন, তাহলে I agree to the Google API Services: User Data Policy নির্বাচন করুন।
    9. চালিয়ে যান-এ ক্লিক করুন।
    10. তৈরি করুন- এ ক্লিক করুন।
  3. আপাতত, আপনি স্কোপ যোগ করা এড়িয়ে যেতে পারেন। ভবিষ্যতে, যখন আপনি আপনার Google Workspace অর্গানাইজেশনের বাইরে ব্যবহারের জন্য কোনো অ্যাপ তৈরি করবেন, তখন আপনাকে অবশ্যই ইউজার টাইপ (User type) পরিবর্তন করে ‘এক্সটার্নাল’ ( External ) করতে হবে। এরপর আপনার অ্যাপের জন্য প্রয়োজনীয় অথরাইজেশন স্কোপগুলো যোগ করুন। আরও জানতে, সম্পূর্ণ ‘কনফিগার OAuth কনসেন্ট’ (Configure OAuth consent) গাইডটি দেখুন।

গুগল বুকস এপিআই-এর জন্য একটি এপিআই কী নিন।

  1. গুগল এপিআই কনসোলে যান। নিশ্চিত করুন যে আপনার বিলিং-সক্ষম প্রজেক্টটি খোলা আছে।
  2. Google API Console-এ, > APIs & Services > Credentials- এ যান।

    পরিচয়পত্রে যান

  3. ক্রেডেনশিয়াল তৈরি করুন > এপিআই কী-তে ক্লিক করুন।

  4. পরবর্তী ধাপে ব্যবহারের জন্য আপনার এপিআই কী-টি লিখে রাখুন।

স্ক্রিপ্টটি সেট আপ করুন

নিম্নলিখিত বিভাগগুলি অ্যাড-অন তৈরির জন্য স্ক্রিপ্টটি সেট আপ করে।

অ্যাপস স্ক্রিপ্ট প্রজেক্টটি তৈরি করুন

  1. গুগল বুকস অ্যাপস স্ক্রিপ্ট প্রজেক্টের প্রিভিউ লিঙ্কগুলো খোলার জন্য নিচের বাটনটিতে ক্লিক করুন।
    প্রকল্পটি খুলুন
  2. Overview-তে ক্লিক করুন।
  3. ওভারভিউ পৃষ্ঠায়, ক্লিক করুন অনুলিপি তৈরির আইকন একটি অনুলিপি তৈরি করুন
  4. আপনার অ্যাপস স্ক্রিপ্ট প্রজেক্টের কপিতে, Code.gs ফাইলে যান এবং YOUR_API_KEY পূর্ববর্তী বিভাগে তৈরি করা API কী-টি দিয়ে প্রতিস্থাপন করুন।

ভবিষ্যতে, আপনি যদি নির্দিষ্ট Google API ব্যবহার করতে বা আপনার অ্যাপ প্রকাশ করতে চান, তাহলে আপনাকে অবশ্যই আপনার ক্লাউড প্রজেক্টকে আপনার অ্যাপস স্ক্রিপ্ট প্রজেক্টের সাথে যুক্ত করতে হবে। এই নির্দেশিকার জন্য, আপনাকে তা করতে হবে না। আরও জানতে, Google ক্লাউড প্রজেক্ট নির্দেশিকা দেখুন।

অ্যাড-অনটি পরীক্ষা করুন

নিম্নলিখিত বিভাগগুলি আপনার তৈরি করা অ্যাড-অনটি পরীক্ষা করে।

একটি পরীক্ষামূলক ডেপ্লয়মেন্ট ইনস্টল করুন

  1. আপনার অ্যাপস স্ক্রিপ্ট প্রজেক্টে, এডিটর- এ ক্লিক করুন।
  2. Deploy > Test deployments-এ ক্লিক করুন।
  3. ইনস্টল-এ ক্লিক করুন > সম্পন্ন
  1. docs.new- এ একটি গুগল ডক্স ডকুমেন্ট তৈরি করুন।
  2. ডকুমেন্টে নিম্নলিখিত URL-টি পেস্ট করুন এবং URL-টিকে স্মার্ট চিপে রূপান্তর করতে ট্যাব কী চাপুন: https://www.google.com/books/edition/Software_Engineering_at_Google/V3TTDwAAQBAJ
  3. স্মার্ট চিপের উপর পয়েন্টারটি ধরে রাখুন এবং অনুরোধ করা হলে, অ্যাড-অনটি চালানোর জন্য অ্যাক্সেস অনুমোদন করুন। প্রিভিউ কার্ডটিতে বইটি সম্পর্কে তথ্য প্রদর্শিত হবে।

নিচের ছবিতে লিঙ্কের প্রিভিউ দেখানো হচ্ছে:

‘Software Engineering at Google’ বইটির একটি লিঙ্ক প্রিভিউ।

কোডটি পর্যালোচনা করুন

এই অ্যাড-অনটির অ্যাপস স্ক্রিপ্ট কোড পর্যালোচনা করতে, 'ভিউ সোর্স কোড'-এ ক্লিক করে সেকশনটি প্রসারিত করুন:

উৎস কোড দেখুন

appsscript.json

solutions/add-on/book-smartchip/appsscript.json
{
  "timeZone": "America/Los_Angeles",
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "oauthScopes": [
    "https://www.googleapis.com/auth/workspace.linkpreview",
    "https://www.googleapis.com/auth/script.external_request"
  ],
  "urlFetchWhitelist": ["https://www.googleapis.com/books/v1/volumes/"],
  "addOns": {
    "common": {
      "name": "Preview Books Add-on",
      "logoUrl": "https://developers.google.com/workspace/add-ons/images/library-icon.png",
      "layoutProperties": {
        "primaryColor": "#dd4b39"
      }
    },
    "docs": {
      "linkPreviewTriggers": [
        {
          "runFunction": "bookLinkPreview",
          "patterns": [
            {
              "hostPattern": "*.google.*",
              "pathPrefix": "books"
            },
            {
              "hostPattern": "*.google.*",
              "pathPrefix": "books/edition"
            }
          ],
          "labelText": "Book",
          "logoUrl": "https://developers.google.com/workspace/add-ons/images/book-icon.png",
          "localizedLabelText": {
            "es": "Libros"
          }
        }
      ]
    }
  }
}

কোড.জিএস

solutions/add-on/book-smartchip/Code.js
/**
 * Copyright 2025 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
 *
 *     http://www.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.
 */

function getBook(id) {
  const apiKey = "YOUR_API_KEY"; // Replace with your API key
  const apiEndpoint = `https://www.googleapis.com/books/v1/volumes/${id}?key=${apiKey}&country=US`;
  const response = UrlFetchApp.fetch(apiEndpoint);
  return JSON.parse(response);
}

function bookLinkPreview(event) {
  if (event.docs.matchedUrl.url) {
    const segments = event.docs.matchedUrl.url.split("/");
    const volumeID = segments[segments.length - 1];

    const bookData = getBook(volumeID);
    const bookTitle = bookData.volumeInfo.title;
    const bookDescription = bookData.volumeInfo.description;
    const bookImage = bookData.volumeInfo.imageLinks.small;
    const bookAuthors = bookData.volumeInfo.authors;
    const bookPageCount = bookData.volumeInfo.pageCount;

    const previewHeader = CardService.newCardHeader()
      .setSubtitle(`By ${bookAuthors}`)
      .setTitle(bookTitle);

    const previewPages = CardService.newDecoratedText()
      .setTopLabel("Page count")
      .setText(bookPageCount);

    const previewDescription = CardService.newDecoratedText()
      .setTopLabel("About this book")
      .setText(bookDescription)
      .setWrapText(true);

    const previewImage = CardService.newImage()
      .setAltText("Image of book cover")
      .setImageUrl(bookImage);

    const buttonBook = CardService.newTextButton()
      .setText("View book")
      .setOpenLink(CardService.newOpenLink().setUrl(event.docs.matchedUrl.url));

    const cardSectionBook = CardService.newCardSection()
      .addWidget(previewImage)
      .addWidget(previewPages)
      .addWidget(CardService.newDivider())
      .addWidget(previewDescription)
      .addWidget(buttonBook);

    return CardService.newCardBuilder()
      .setHeader(previewHeader)
      .addSection(cardSectionBook)
      .build();
  }
}