Google Chat-এ পরিচিতি সংগ্রহ ও ম্যানেজ করা

এই টিউটোরিয়ালে দেখানো হয়েছে কীভাবে Google Chat ব্যবহারকারীদের ব্যক্তিগত ও ব্যবসায়িক পরিচিতি ম্যানেজ করতে সাহায্য করার জন্য Google Chat অ্যাপ তৈরি করতে হয়। তথ্য সংগ্রহ করতে, কার্ড মেসেজ ও ডায়ালগে Chat অ্যাপ ব্যবহারকারীদের যোগাযোগের ফর্ম পূরণ করতে প্রম্পট করে।

Chat অ্যাপের ব্যবহার দেখুন:

  • স্ল্যাশ কমান্ড থেকে যোগাযোগের ফর্ম।
    ছবি ১. চ্যাট অ্যাপটি স্ল্যাশ কমান্ড /about-এর উত্তর একটি টেক্সট মেসেজ ও বোতামের মাধ্যমে দেয় যা পরিচিতি ফর্ম খোলে।
  • ডায়ালগে যোগাযোগের ফর্ম।
    ছবি ২. Chat অ্যাপে একটি ডায়ালগ খুলে যায় যেখানে ব্যবহারকারী পরিচিতি সম্পর্কে তথ্য লিখতে পারেন।
  • ডায়ালগ কনফার্ম ও পর্যালোচনা করুন।
    ছবি ৩. Chat অ্যাপ একটি কনফার্মেশন ডায়ালগ দেখায় যাতে ব্যবহারকারীরা জমা দেওয়ার আগে তথ্য পর্যালোচনা করে কনফার্ম করতে পারেন।
  • নতুন পরিচিতি কনফার্ম করে একটি টেক্সট মেসেজ।
    ছবি ৪. ব্যবহারকারী ফর্ম জমা দেওয়ার পরে, জমা দেওয়ার বিষয়টি কনফার্ম করতে Chat অ্যাপ একটি ব্যক্তিগত টেক্সট মেসেজ পাঠায়।
  • কার্ড মেসেজ থেকে যোগাযোগ ফর্ম।
    ছবি ৫. এছাড়াও, Chat অ্যাপ ব্যবহারকারীদের মেসেজে থাকা কার্ড থেকে পরিচিতি যোগ করার জন্য প্রম্পট করে।

পূর্বশর্ত

উদ্দেশ্য

  • অবজেক্ট হিসেবে card ইউজার ইন্টারফেস (UI) ডিজাইন ও তৈরি করুন এবং মেসেজ ও ডায়ালগে UI দেখান।
  • ব্যবহারকারীরা ফর্ম ইনপুট উইজেট ব্যবহার করে যে তথ্য জমা দেন তা গ্রহণ ও প্রসেস করা।
  • টেক্সট, কার্ড ও অ্যাক্সেসরি উইজেট সহ মেসেজের মাধ্যমে কমান্ডের উত্তর দিন।

আর্কিটেকচার

Chat অ্যাপটি Google Apps Script-এ (Google Workspace অ্যাড-অন হিসেবে যা Google Chat-এর কার্যকারিতা বাড়ায়) তৈরি করা হয়েছে এবং ব্যবহারকারীর ইন্টার‍্যাকশন (onMessage, onAppCommand এবং বোতামে ক্লিক করা যা openInitialDialog, openConfirmationDialog ও submitForm-কে আহ্বান করে) প্রসেস করে Chat ব্যবহারকারীদের উত্তর দেয়।

নিচে দেখানো হল যে কীভাবে কোনও ব্যবহারকারী সাধারণত Chat অ্যাপের সাথে ইন্টার‍্যাক্ট করতে পারেন:

  1. কোনও ব্যবহারকারী Chat অ্যাপের মাধ্যমে সরাসরি মেসেজ খুললে অথবা আগে থেকে থাকা স্পেসে Chat অ্যাপ যোগ করলে।

  2. Chat অ্যাপ ব্যবহারকারীকে একটি পরিচিতি যোগ করার জন্য প্রম্পট করে, এর জন্য একটি পরিচিতি ফর্ম তৈরি করে এবং তা card অবজেক্ট হিসেবে দেখায়। যোগাযোগের ফর্মটি দেখাতে, Chat অ্যাপ ব্যবহারকারীদের নিম্নলিখিত উপায়ে উত্তর দেয়:

    • পরিচিতি ফর্ম সহ কার্ড মেসেজ দিয়ে @উল্লেখ ও সরাসরি মেসেজের (onMessage) উত্তর দেয়।
    • পরিচিতি ফর্ম সহ একটি ডায়ালগ খুলে /addContact (onAppCommand) স্ল্যাশ কমান্ডের উত্তর দেয়।
    • স্ল্যাশ কমান্ড /about (onAppCommand)-এর উত্তরে একটি টেক্সট মেসেজ দেয় যাতে পরিচিতি যোগ করুন বোতাম থাকে। ব্যবহারকারী এই বোতামে ক্লিক করে openInitialDialog খুলতে এবং পরিচিতি ফর্ম সহ একটি ডায়ালগ বক্স দেখতে পান।
  3. যোগাযোগের ফর্ম দেখানো হলে, ব্যবহারকারী নিম্নলিখিত ফিল্ড ও উইজেটে যোগাযোগের তথ্য ইনপুট করেন:

    • নাম ও পদবি: একটি textInput উইজেট যা স্ট্রিং গ্রহণ করে।
    • জন্মতারিখ: ক dateTimePicker উইজেট যা শুধুমাত্র তারিখ গ্রহণ করে।
    • পরিচিতির ধরন: a selectionInput রেডিও বোতামের উইজেট যা ব্যবহারকারীদের একটি স্ট্রিং ভ্যালু (Personal বা Work) বেছে নিতে ও জমা দিতে দেয়।
    • পর্যালোচনা করে জমা দিন বোতাম: a buttonList button উইজেট সহ অ্যারে, ব্যবহারকারী যে ভ্যালু ইনপুট করেন সেটি জমা দেওয়ার জন্য তিনি এতে ক্লিক করেন।
  4. ব্যবহারকারীর দেওয়া ভ্যালু প্রসেস করার জন্য Google Chat অ্যাপ openConfirmationDialog ইনভোক করে এবং কনফার্মেশন কার্ডে ভ্যালু দেখায়।

  5. ব্যবহারকারী কনফার্মেশন কার্ড পর্যালোচনা করে এবং submitForm চালু করতে ও যোগাযোগের তথ্য চূড়ান্ত করতে জমা দিন বোতামে ক্লিক করেন ।

  6. Google Chat অ্যাপ একটি ব্যক্তিগত টেক্সট মেসেজ পাঠায় যা জমা দেওয়ার বিষয়টি কনফার্ম করে।

পরিবেশ প্রস্তুত করা

এই বিভাগে, কীভাবে Chat অ্যাপের জন্য Google Cloud প্রোজেক্ট কনফিগার করতে হয় তা দেখানো হয়েছে।

Google API Console-এ আপনার ক্লাউড প্রোজেক্ট খুলুন

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

  1. Google API কনসোলে, একটি প্রোজেক্ট বেছে নিন পৃষ্ঠায় যান।

    ক্লাউড প্রোজেক্ট বেছে নিন

  2. আপনি যে Google Cloud প্রোজেক্ট ব্যবহার করতে চান সেটি বেছে নিন। অথবা, প্রোজেক্ট তৈরি করুন বিকল্পে ক্লিক করে স্ক্রিনে দেখানো নির্দেশাবলী অনুসরণ করুন। আপনি Google Cloud প্রোজেক্ট তৈরি করলে, আপনাকে হয়ত প্রোজেক্টের জন্য বিলিং চালু করতে হবে।

যাচাইকরণ ও অনুমোদন সেট-আপ করা

Google Chat অ্যাপের জন্য আপনাকে একটি OAuth-এর সম্মতি সংক্রান্ত স্ক্রিন কনফিগার করতে হবে যাতে ব্যবহারকারীরা Google Chat সহ Google Workspace অ্যাপ্লিকেশনে আপনার অ্যাপকে অনুমোদন দিতে পারেন।

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

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

    ব্র্যান্ডিংয়ে যান

  2. আপনি যদি আগে থেকেই Google Auth প্ল্যাটফর্ম কনফিগার করে থাকেন, তাহলে আপনি ব্র্যান্ডিং, দর্শক, এবং ডেটা অ্যাক্সেস-এ নিম্নলিখিত OAuth-এর সম্মতি সংক্রান্ত স্ক্রিন সেটিংস কনফিগার করতে পারবেন। আপনি যদি এমন কোনও মেসেজ দেখতে পান যা বলে Google Auth প্ল্যাটফর্ম এখনও কনফিগার করা হয়নি, শুরু করুন বিকল্পে ক্লিক করুন:

    1. অ্যাপ সম্পর্কিত তথ্য বিকল্পের মধ্যে, অ্যাপের নাম বিকল্পে গিয়ে Contact Manager টাইপ করুন।
    2. ব্যবহারকারীর সহায়তা সংক্রান্ত ইমেল বিকল্পে, আপনার ইমেল আইডি বা উপযুক্ত Google গ্রুপ বেছে নিন।
    3. পরবর্তী বিকল্পে ক্লিক করুন।
    4. দর্শক বিকল্পের মধ্যে, ইন্টার্নাল বিকল্প বেছে নিন। আপনি ইন্টার্নাল বেছে নিতে না পারলে, এক্সটার্নাল বেছে নিন।
    5. পরবর্তী বিকল্পে ক্লিক করুন।
    6. যোগাযোগের তথ্য বিকল্পের মধ্যে, এমন একটি ইমেল আইডি লিখুন যেখানে আপনার প্রোজেক্টে কোনও পরিবর্তন হলে আপনাকে জানানো যাবে।
    7. পরবর্তী বিকল্পে ক্লিক করুন।
    8. সম্পূর্ণ করুন বিকল্পের অধীনে, Google API পরিষেবা সংক্রান্ত ব্যবহারকারীর ডেটা নীতি পর্যালোচনা করুন এবং আপনি সম্মতি জানালে, Google API পরিষেবা সংক্রান্ত ব্যবহারকারীর ডেটা নীতিতে আমি সম্মতি জানাচ্ছি বিকল্প বেছে নিন।
    9. চালিয়ে যান বিকল্পে ক্লিক করুন।
    10. তৈরি করুন বিকল্পে ক্লিক করুন।
    11. ব্যবহারকারীর ধরন হিসেবে এক্সটার্নাল বেছে নিলে, টেস্ট ব্যবহারকারী যোগ করুন:
      1. দর্শক বিকল্পে ক্লিক করুন।
      2. টেস্ট ব্যবহারকারী বিকল্পের মধ্যে, ব্যবহারকারী যোগ করুন বিকল্পে ক্লিক করুন।
      3. আপনার ইমেল আইডি ও অন্য কোনও অনুমোদিত টেস্ট ব্যবহারকারীর ইমেল আইডি লিখুন, তারপর সেভ করুন বিকল্পে ক্লিক করুন।

Chat অ্যাপ তৈরি ও ডেপ্লয় করা

নিম্নলিখিত বিভাগে, আপনার Chat অ্যাপের জন্য অ্যাপ্লিকেশন কোড (Code.gs এবং appsscript.json) সহ একটি Apps স্ক্রিপ্ট প্রোজেক্ট তৈরি ও আপডেট করুন।

ঐচ্ছিকভাবে, আপনি GitHub-এ সম্পূর্ণ প্রোজেক্ট দেখতে পারেন।

GitHub-এ দেখুন

প্রতিটি ফাইলের ওভারভিউ এখানে দেওয়া হল:

Code.gs

ব্যবহারকারীর ইন্টার‍্যাকশন (onMessage, onAppCommand, openInitialDialog, openConfirmationDialog এবং submitForm) এবং মেসেজ ও ডায়ালগে কার্ডে দেখানো ফর্ম ইনপুট উইজেট সহ সমস্ত অ্যাপ লজিক ম্যানেজ করে।

Code.gs কোড দেখুন

apps-script/chat/contact-form-app/Code.gs
/**
 * 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.
 */

/**
 * Responds to a message in Google Chat.
 *
 * @param {Object} event The event object from the Google Workspace add-on.
 * @return {Object} response that handles dialogs.
 */
function onMessage(event) {
  // Reply with a message that contains a button to open the initial dialog
  return { hostAppDataAction: { chatDataAction: { createMessageAction: { message: {
    text: "To add a contact, use the `ADD CONTACT` button below.",
    accessoryWidgets: [
      { buttonList: { buttons: [{
        text: "ADD CONTACT",
        onClick: { action: {
          function: "openInitialDialog",
          interaction: "OPEN_DIALOG"
        }}
      }]}}
    ]
  }}}}};
}

/**
 * Opens the initial step of the dialog that lets users add contact details.
 *
 * @param {Object} event The event object from the Google Workspace add-on.
 * @return {Object} open the dialog.
 */
function openInitialDialog(event) {
  return { action: { navigations: [{ pushCard: { sections: [{ widgets: [
    { textInput: {
      name: "contactName",
      label: "First and last name",
      type: "SINGLE_LINE"
    }},
    { dateTimePicker: {
      name: "contactBirthdate",
      label: "Birthdate",
      type: "DATE_ONLY"
    }},
    { selectionInput: {
      name: "contactType",
      label: "Contact type",
      type: "RADIO_BUTTON",
      items: [
        { text: "Work", value: "Work", selected: false },
        { text: "Personal", value: "Personal", selected: false }
      ]
    }},
    { buttonList: { buttons: [{
      text: "NEXT",
      onClick: { action: { function : "openConfirmationDialog" }}
    }]}}
  ]}]}}]}};
}

/**
 * Opens the second step of the dialog that lets users confirm details.
 *
 * @param {Object} event The event object from the Google Workspace add-on.
 * @return {Object} update the dialog.
 */
function openConfirmationDialog(event) {
  // Retrieve the form input values
  const name = event.commonEventObject.formInputs["contactName"].stringInputs.value[0];
  const birthdate = event.commonEventObject.formInputs["contactBirthdate"].dateInput.msSinceEpoch;
  const type = event.commonEventObject.formInputs["contactType"].stringInputs.value[0];
  // Display the input values for confirmation
  return { action: { navigations: [{ pushCard: { sections: [{ widgets: [
    { textParagraph: { text: "Confirm contact information and submit:" }},
    { textParagraph: { text: "<b>Name:</b> " + name }},
    { textParagraph: { text: "<b>Birthday:</b> " + new Date(birthdate) }},
    { textParagraph: { text: "<b>Type:</b> " + type }},
    { buttonList: { buttons: [{
      text: "SUBMIT",
      onClick: { action: {
        function: "submitDialog",
        // Pass input values as parameters for last dialog step (submission)
        parameters: [
          { key: "contactName", value: name },
          { key: "contactBirthdate", value: birthdate },
          { key: "contactType", value: type }
        ]
      }}
    }]}}
  ]}]}}]}};
}

/**
 * Handles submission and closes the dialog.
 *
 * @param {Object} event The event object from the Google Workspace add-on.
 * @return {Object} close the dialog with a status in text notification or message.
 */
function submitDialog(event) {
  // Validate the parameters.
  if (!event.commonEventObject.parameters["contactName"]) {
    return { action: {
      navigations: [{ endNavigation: { action: "CLOSE_DIALOG"}}],
      notification: { text: "Failure, the contact name was missing!" }
    }};
  }

  return { hostAppDataAction: { chatDataAction: { createMessageAction: { message: {
    text: "✅ " + event.commonEventObject.parameters["contactName"] + " has been added to your contacts."
  }}}}};
}
appsscript.json

Apps Script ম্যানিফেস্ট যা Chat অ্যাপের জন্য Apps Script প্রোজেক্টকে সংজ্ঞায়িত ও কনফিগার করে।

appsscript.json কোড দেখুন

apps-script/chat/contact-form-app/appsscript.json
{
  "timeZone": "America/Los_Angeles",
  "dependencies": {},
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "addOns": {
    "common": {
      "name": "Contact Form app",
      "logoUrl": "https://developers.google.com/workspace/add-ons/images/contact-icon.png"
    },
    "chat": {}
  }
}

Apps স্ক্রিপ্ট প্রোজেক্ট তৈরি করা

Code.gs ও appsscript.json ফাইল থেকে Apps স্ক্রিপ্ট প্রোজেক্ট তৈরি করতে:

  1. Google অ্যাপ্স স্ক্রিপ্টে যান এবং নতুন প্রজেক্ট বিকল্পে ক্লিক করুন।
  2. আপনার Apps স্ক্রিপ্ট প্রোজেক্টের নাম দিন:

    1. শিরোনামহীন প্রোজেক্ট বিকল্পে ক্লিক করুন।

    2. প্রোজেক্টের নাম বক্সে Contact Manager - Google Chat app লিখুন।

    3. নাম পরিবর্তন করুন বিকল্পে ক্লিক করুন।

  3. Code.gs-এর কন্টেন্ট উপরে দেওয়া Code.gs নমুনা কোড দিয়ে পরিবর্তন করুন।

  4. প্রোজেক্ট সেটিংস প্রোজেক্ট সেটিংসের আইকন বিকল্পে ক্লিক করে এডিটরে "appsscript.json" ম্যানিফেস্ট ফাইল দেখুন বিকল্প বেছে নিন।

  5. এডিটরে ফিরে যান এবং appsscript.json-এর কন্টেন্টকে উপরে দেওয়া appsscript.json ম্যানিফেস্ট কোড দিয়ে পাল্টে দিন, তারপর আপনার প্রোজেক্ট সেভ করুন।

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

Apps স্ক্রিপ্ট ডিপ্লয়মেন্ট তৈরি করা

এখন যেহেতু সব কোড লেখা হয়ে গেছে, তাই Apps Script প্রোজেক্ট ডিপ্লয় করুন। Google Cloud-এ Chat অ্যাপ কনফিগার করার সময় আপনি ডিপ্লয়মেন্ট আইডি ব্যবহার করেন।

  1. Apps Script-এ, Chat অ্যাপের প্রজেক্ট খুলুন।

    Apps স্ক্রিপ্টে যান

  2. ডেপ্লয় করুন > নতুন ডেপ্লয়মেন্ট বিকল্পে ক্লিক করুন।

  3. অ্যাড-অন আগে থেকেই বেছে নেওয়া না থাকলে, ধরন বেছে নিন বিকল্পের পাশে, ডিপ্লয়মেন্টের ধরন প্রোজেক্ট সেটিংসের আইকন বিকল্পে ক্লিক করে অ্যাড-অন বিকল্প বেছে নিন।

  4. বিবরণ বিভাগে, এই ভার্সনের জন্য একটি বিবরণ লিখুন, যেমন Test of Contact Manager।

  5. ডেপ্লয় করুন বিকল্পে ক্লিক করুন। Apps স্ক্রিপ্ট সফল ডিপ্লয়মেন্টের রিপোর্ট করে এবং একটি ডিপ্লয়মেন্ট আইডি প্রদান করে।

  6. ডেপ্লয়মেন্ট আইডি কপি করতে কপি করুন বিকল্পে ক্লিক করুন এবং তারপরে হয়ে গেছে বিকল্পে ক্লিক করুন।

Google API কনসোলে Chat অ্যাপ কনফিগার করা

এই বিভাগে, আপনার Apps Script প্রোজেক্ট থেকে এইমাত্র তৈরি করা ডিপ্লয়মেন্টের আইডি সহ আপনার Chat অ্যাপ সম্পর্কে তথ্য সহ Google API কনসোলে Google Chat API কীভাবে কনফিগার করতে হয় তা দেখানো হয়েছে।

  1. Google API Console-এ, মেনু > API ও পরিষেবা > চালু API ও পরিষেবা > Google Chat API > কনফিগারেশন বিকল্পে ক্লিক করুন।

    Chat API কনফিগারেশনে যান

  2. অ্যাপের নাম বিকল্পে Contact Manager টাইপ করুন।

  3. অবতার URL-এ https://developers.google.com/chat/images/contact-icon.png টাইপ করুন।

  4. বিবরণ অংশে, Manage your personal and business contacts টাইপ করুন।

  5. ইন্টার‍্যাক্টিভ ফিচার চালু করুন টগল বোতামে ক্লিক করে সেটি চালু করুন।

  6. কার্যকারিতা বিকল্পের মধ্যে, স্পেস ও গ্রুপ কথোপকথনে যোগ দিন বিকল্প বেছে নিন।

  7. কানেকশন সেটিংস বিকল্পের মধ্যে, Apps স্ক্রিপ্ট বেছে নিন।

  8. ডিপ্লয়মেন্ট আইডিতে, Apps Script ডিপ্লয়মেন্ট তৈরি করার সময় আগের বিভাগে আপনি যে Apps Script ডিপ্লয়মেন্ট আইডি কপি করেছিলেন সেটি পেস্ট করুন।

  9. ট্রিগার বিকল্পের অধীনে, ব্যবহারকারীর ইন্টার‍্যাকশনের উত্তর দেয় এমন ফাংশন কনফিগার করুন:

    • মেসেজ ট্রিগারের জন্য, onMessage লিখুন।
    • অ্যাপ কমান্ড ট্রিগারের জন্য, onAppCommand লিখুন।
  10. কমান্ড বিকল্পের অধীনে, স্ল্যাশ কমান্ড /about ও /addContact সেট-আপ করুন:

    1. প্রথম স্ল্যাশ কমান্ড সেট-আপ করতে কমান্ড যোগ করুন বিকল্পে ক্লিক করুন।
    2. কমান্ড আইডিতে 1 টাইপ করুন।
    3. বিবরণ বিকল্পে গিয়ে Learn how to use this Chat app to manage your contacts টাইপ করুন।
    4. কমান্ডের ধরন বিকল্পের মধ্যে থেকে Slash command বেছে নিন।
    5. স্ল্যাশ কমান্ডের নাম বিকল্পে /about টাইপ করুন।
    6. হয়ে গেছে বিকল্পে ক্লিক করুন।
    7. আরেকটি স্ল্যাশ কমান্ড সেট-আপ করতে কমান্ড যোগ করুন বিকল্পে ক্লিক করুন।
    8. কমান্ড আইডিতে 2 টাইপ করুন।
    9. বিবরণ বিকল্পে গিয়ে Submit information about a contact টাইপ করুন।
    10. কমান্ডের ধরন বিকল্পের মধ্যে থেকে Slash command বেছে নিন।
    11. স্ল্যাশ কমান্ডের নাম বিকল্পে /addContact টাইপ করুন।
    12. ডায়ালগ খোলে বিকল্প বেছে নিন।
    13. হয়ে গেছে বিকল্পে ক্লিক করুন।
  11. দৃশ্যমানতা বিকল্পের মধ্যে, এই Chat অ্যাপকে YOUR DOMAIN-এর নির্দিষ্ট লোকজন ও গ্রুপের জন্য উপলভ্য করুন চেকবক্স বেছে নিন এবং আপনার ইমেল আইডি লিখুন।

  12. লগ বিকল্পের মধ্যে, লগিংয়ে লগ সংক্রান্ত সমস্যা বিকল্প বেছে নিন।

  13. সেভ করুন বিকল্পে ক্লিক করুন। কনফিগারেশন সেভ করা হয়েছে মেসেজটি দেখতে পাবেন।

Chat অ্যাপটি ইনস্টল ও পরীক্ষা করার জন্য রেডি Chat.

Chat অ্যাপ পরীক্ষা করা

আপনার Chat অ্যাপ পরীক্ষা করতে, Chat অ্যাপের মাধ্যমে সরাসরি মেসেজ স্পেস খুলুন এবং একটি মেসেজ পাঠান:

  1. আপনি বিশ্বস্ত পরীক্ষক হিসেবে নিজেকে যোগ করার সময় যে Google Workspace অ্যাকাউন্ট প্রদান করেছিলেন সেটি ব্যবহার করে Google Chat খুলুন।

    Google Chat-এ যান

  2. নতুন চ্যাট বিকল্পে ক্লিক করুন।
  3. ১ বা একাধিক লোকজনকে যোগ করুন ফিল্ডে, আপনার Chat অ্যাপের নাম টাইপ করুন।
  4. ফলাফল থেকে আপনার Chat অ্যাপ বেছে নিন। সরাসরি মেসেজ খুলে যায়।

  1. Chat অ্যাপের মাধ্যমে নতুন সরাসরি মেসেজে, /addContactটাইপ করে Enter টিপুন।

  2. যে ডায়ালগটি খুলবে, তাতে যোগাযোগের তথ্য লিখুন:

    1. নাম ও পদবি টেক্সট ফিল্ডে, একটি নাম লিখুন।
    2. জন্মতারিখ তারিখ বেছে নেওয়ার বিকল্পে, একটি তারিখ বেছে নিন।
    3. পরিচিতির ধরন বিকল্পের মধ্যে, অফিস বা ব্যক্তিগত রেডিও বোতাম বেছে নিন।
  3. পর্যালোচনা করে জমা দিন বিকল্পে ক্লিক করুন।

  4. কনফার্মেশন ডায়ালগে, আপনার জমা দেওয়া তথ্য পর্যালোচনা করে জমা দিন বিকল্পে ক্লিক করুন। Chat অ্যাপটি একটি টেক্সট মেসেজ দিয়ে উত্তর দেয় যাতে বলা হয় ✅ CONTACT NAME has been added to your contacts.।

  5. এছাড়াও, আপনি ঐচ্ছিকভাবে নিম্নলিখিত উপায়ে যোগাযোগ ফর্ম পরীক্ষা করে জমা দিতে পারেন:

    • /about স্ল্যাশ কমান্ড ব্যবহার করুন। Chat অ্যাপ একটি টেক্সট মেসেজ ও অ্যাক্সেসরি উইজেট বোতামের মাধ্যমে উত্তর দেয়, যেখানে লেখা থাকে Add a contact। পরিচিতি ফর্ম সহ একটি ডায়ালগ খুলতে আপনি বোতামে ক্লিক করতে পারেন।
    • স্ল্যাশ কমান্ড ছাড়া Chat অ্যাপকে সরাসরি মেসেজ পাঠান, যেমন Hello। Chat অ্যাপ পরিচিতি ফর্ম সহ একটি টেক্সট ও কার্ডের মাধ্যমে উত্তর দেয়।

অপ্রয়োজনীয়গুলি মুছুন

এই টিউটোরিয়ালে ব্যবহৃত রিসোর্সের জন্য আপনার Google Cloud অ্যাকাউন্টে চার্জ যাতে না লাগে, তার জন্য আমরা Cloud প্রোজেক্টটি মুছে দেওয়ার সাজেস্ট করি।

  1. Google API কনসোলে, রিসোর্স ম্যানেজ করুন পৃষ্ঠায় যান। মেনু > IAM ও অ্যাডমিন > রিসোর্স ম্যানেজ করুন বিকল্পে ক্লিক করুন।

    রিসোর্স ম্যানেজারে যান

  2. প্রোজেক্টের তালিকা থেকে, যে প্রোজেক্টটি মুছতে চান সেটি বেছে নিন এবং তারপরে মুছুন বিকল্পে ক্লিক করুন।
  3. ডায়ালগে, প্রোজেক্ট আইডি টাইপ করুন এবং তারপর প্রোজেক্ট মুছে দিতে বন্ধ করুন বিকল্পে ক্লিক করুন ।

অ্যাড-অন নয় এমন চ্যাট অ্যাপ: Google Chat থেকে পরিচিতি ম্যানেজ করা

নিম্নলিখিত নির্দেশাবলী ও কোড স্যাম্পেল এমন Chat অ্যাপের ক্ষেত্রে প্রযোজ্য যা Google Workspace অ্যাড-অন নয় (GitHub-এ দেখুন)।

Apps স্ক্রিপ্ট ফাইল

main.gs

ব্যবহারকারীরা Chat অ্যাপে মেসেজ পাঠালে, Chat অ্যাপ মেসেজ থেকে বোতামে ক্লিক করলে অথবা ডায়ালগ খুললে ও বন্ধ করলে, সেইসব ইন্টার‍্যাকশন ইভেন্ট সহ সমস্ত অ্যাপ লজিক হ্যান্ডেল করে।

apps-script/contact-form-app/main.gs
/**
 * Copyright 2024 Google Inc.
 *
 * 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.
 */

/**
 * Responds to a MESSAGE interaction event in Google Chat.
 *
 * @param {Object} event the MESSAGE interaction event from Chat API.
 * @return {Object} message response that opens a dialog or sends private
 *                          message with text and card.
 */
function onMessage(event) {
  if (event.message.slashCommand) {
    switch (event.message.slashCommand.commandId) {
      case 1:
        // If the slash command is "/about", responds with a text message and button
        // that opens a dialog.
        return {
          text: "Manage your personal and business contacts 📇. To add a " +
                  "contact, use the slash command `/addContact`.",
          accessoryWidgets: [{
            buttonList: { buttons: [{
              text: "Add Contact",
              onClick: { action: {
                function: "openInitialDialog",
                interaction: "OPEN_DIALOG"
              }}
            }]}
          }]
        }
      case 2:
        // If the slash command is "/addContact", opens a dialog.
        return openInitialDialog();
    }
  }

  // If user sends the Chat app a message without a slash command, the app responds
  // privately with a text and card to add a contact.
  return {
    privateMessageViewer: event.user,
    text: "To add a contact, try `/addContact` or complete the form below:",
    cardsV2: [{
      cardId: "addContactForm",
      card: {
        header: { title: "Add a contact" },
        sections:[{ widgets: CONTACT_FORM_WIDGETS.concat([{
          buttonList: { buttons: [{
            text: "Review and submit",
            onClick: { action: { function : "openConfirmation" }}
          }]}
        }])}]
      }
    }]
  };
}

/**
 * Responds to CARD_CLICKED interaction events in Google Chat.
 *
 * @param {Object} event the CARD_CLICKED interaction event from Google Chat.
 * @return {Object} message responses specific to the dialog handling.
 */
function onCardClick(event) {
  // Initial dialog form page
  if (event.common.invokedFunction === "openInitialDialog") {
    return openInitialDialog();
  // Confirmation dialog form page
  } else if (event.common.invokedFunction === "openConfirmation") {
    return openConfirmation(event);
  // Submission dialog form page
  } else if (event.common.invokedFunction === "submitForm") {
    return submitForm(event);
  }
}

/**
 * Opens the initial step of the dialog that lets users add contact details.
 *
 * @return {Object} a message with an action response to open a dialog.
 */
function openInitialDialog() {
  return { actionResponse: {
    type: "DIALOG",
    dialogAction: { dialog: { body: { sections: [{
      header: "Add new contact",
      widgets: CONTACT_FORM_WIDGETS.concat([{
        buttonList: { buttons: [{
          text: "Review and submit",
          onClick: { action: { function: "openConfirmation" }}
        }]}
      }])
    }]}}}
  }};
}

/**
 * Returns the second step as a dialog or card message that lets users confirm details.
 *
 * @param {Object} event the interactive event with form inputs.
 * @return {Object} returns a dialog or private card message.
 */
function openConfirmation(event) {
  const name = fetchFormValue(event, "contactName") ?? "";
  const birthdate = fetchFormValue(event, "contactBirthdate") ?? "";
  const type = fetchFormValue(event, "contactType") ?? "";
  const cardConfirmation = {
    header: "Your contact",
    widgets: [{
      textParagraph: { text: "Confirm contact information and submit:" }}, {
      textParagraph: { text: "<b>Name:</b> " + name }}, {
      textParagraph: {
        text: "<b>Birthday:</b> " + convertMillisToDateString(birthdate)
      }}, {
      textParagraph: { text: "<b>Type:</b> " + type }}, {
      buttonList: { buttons: [{
        text: "Submit",
        onClick: { action: {
          function: "submitForm",
          parameters: [{
            key: "contactName", value: name }, {
            key: "contactBirthdate", value: birthdate }, {
            key: "contactType", value: type
          }]
        }}
      }]}
    }]
  };

  // Returns a dialog with contact information that the user input.
  if (event.isDialogEvent) {
    return { action_response: {
      type: "DIALOG",
      dialogAction: { dialog: { body: { sections: [ cardConfirmation ]}}}
    }};
  }

  // Updates existing card message with contact information that the user input.
  return {
    actionResponse: { type: "UPDATE_MESSAGE" },
    privateMessageViewer: event.user,
    cardsV2: [{
      card: { sections: [cardConfirmation]}
    }]
  }
}

/**
  * Validates and submits information from a dialog or card message
  * and notifies status.
  *
  * @param {Object} event the interactive event with parameters.
  * @return {Object} a message response that opens a dialog or posts a private
  *                  message.
  */
function submitForm(event) {
  const contactName = event.common.parameters["contactName"];
  // Checks to make sure the user entered a contact name.
  // If no name value detected, returns an error message.
  const errorMessage = "Don't forget to name your new contact!";
  if (!contactName && event.dialogEventType === "SUBMIT_DIALOG") {
    return { actionResponse: {
      type: "DIALOG",
      dialogAction: { actionStatus: {
        statusCode: "INVALID_ARGUMENT",
        userFacingMessage: errorMessage
      }}
    }};
  }
  if (!contactName) {
    return {
      privateMessageViewer: event.user,
      text: errorMessage
    };
  }

  // The Chat app indicates that it received form data from the dialog or card.
  // Sends private text message that confirms submission.
  const confirmationMessage = "✅ " + contactName + " has been added to your contacts.";
  if (event.dialogEventType === "SUBMIT_DIALOG") {
    return {
      actionResponse: {
        type: "DIALOG",
        dialogAction: { actionStatus: {
          statusCode: "OK",
          userFacingMessage: "Success " + contactName
        }}
      }
    };
  }
  return {
    actionResponse: { type: "NEW_MESSAGE" },
    privateMessageViewer: event.user,
    text: confirmationMessage
  };
}

/**
 * Extracts form input value for a given widget.
 *
 * @param {Object} event the CARD_CLICKED interaction event from Google Chat.
 * @param {String} widgetName a unique ID for the widget, specified in the widget's name field.
 * @returns the value inputted by the user, null if no value can be found.
 */
function fetchFormValue(event, widgetName) {
  const formItem = event.common.formInputs[widgetName][""];
  // For widgets that receive StringInputs data, the value input by the user.
  if (formItem.hasOwnProperty("stringInputs")) {
    const stringInput = event.common.formInputs[widgetName][""].stringInputs.value[0];
    if (stringInput != null) {
      return stringInput;
    }
  // For widgets that receive dateInput data, the value input by the user.
  } else if (formItem.hasOwnProperty("dateInput")) {
    const dateInput = event.common.formInputs[widgetName][""].dateInput.msSinceEpoch;
     if (dateInput != null) {
       return dateInput;
     }
  }

  return null;
}

/**
 * Converts date in milliseconds since epoch to user-friendly string.
 *
 * @param {Object} millis the milliseconds since epoch time.
 * @return {string} Display-friend date (English US).
 */
function convertMillisToDateString(millis) {
  const date = new Date(millis);
  const options = { year: 'numeric', month: 'long', day: 'numeric' };
  return date.toLocaleDateString('en-US', options);
}
contactForm.gs

ব্যবহারকারীদের থেকে ফর্ম ডেটা পাওয়া উইজেট এতে থাকে। এইসব ফর্ম ইনপুট উইজেট মেসেজ ও ডায়ালগে দেখানো কার্ডে দেখা যায়।

apps-script/contact-form-app/contactForm.gs
/**
 * Copyright 2024 Google Inc.
 *
 * 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.
 */

/**
 * The section of the contact card that contains the form input widgets. Used in a dialog and card message.
 * To add and preview widgets, use the Card Builder: https://addons.gsuite.google.com/uikit/builder
 */
const CONTACT_FORM_WIDGETS = [
  {
    "textInput": {
      "name": "contactName",
      "label": "First and last name",
      "type": "SINGLE_LINE"
    }
  },
  {
    "dateTimePicker": {
      "name": "contactBirthdate",
      "label": "Birthdate",
      "type": "DATE_ONLY"
    }
  },
  {
    "selectionInput": {
      "name": "contactType",
      "label": "Contact type",
      "type": "RADIO_BUTTON",
      "items": [
        {
          "text": "Work",
          "value": "Work",
          "selected": false
        },
        {
          "text": "Personal",
          "value": "Personal",
          "selected": false
        }
      ]
    }
  }
];
appsscript.json

Apps স্ক্রিপ্ট ম্যানিফেস্ট যা অ্যাড-অন নয় এমন Chat অ্যাপের জন্য Apps স্ক্রিপ্ট প্রোজেক্টকে সংজ্ঞায়িত ও কনফিগার করে।

apps-script/contact-form-app/appsscript.json
{
  "timeZone": "America/Los_Angeles",
  "dependencies": {},
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "chat": {}
}

Apps স্ক্রিপ্ট প্রোজেক্ট তৈরি ও কনফিগার করা

  1. অ্যাড-অন নয় এমন Google Chat-এ পরিচিতি ম্যানেজ করুন অ্যাপ স্ক্রিপ্ট প্রোজেক্ট খুলে তার একটি কপি তৈরি করুন।
  2. Google API কনসোলে Chat API কনফিগার করার সময়: এই Chat অ্যাপকে Google Workspace অ্যাড-অন হিসেবে তৈরি করুন বিকল্পটি থেকে টিকচিহ্ন সরিয়ে দিন। আপনাকে কনফার্ম করতে বলে একটি ডায়ালগ খুলবে। ডায়ালগে, বন্ধ করুন বিকল্পে ক্লিক করুন।