Google Workspace অ্যাড-অন ব্যবহার করে ইমেলকে আরও কার্যকর করুন

1. ওভারভিউ

এই কোডল্যাবে, আপনি Gmail এর জন্য একটি Google Workspace অ্যাড-অন লিখতে Google Apps স্ক্রিপ্ট ব্যবহার করবেন যা ব্যবহারকারীদের সরাসরি Gmail-এর মধ্যে একটি ইমেল থেকে স্প্রেডশীটে রসিদ ডেটা যোগ করতে দেয়। যখন একজন ব্যবহারকারী ইমেলের মাধ্যমে একটি রসিদ পান, তখন তারা অ্যাড-অনটি খোলে যা স্বয়ংক্রিয়ভাবে ইমেল থেকে প্রাসঙ্গিক ব্যয়ের তথ্য পায়। ব্যবহারকারী ব্যয়ের তথ্য সম্পাদনা করতে পারে এবং তারপরে একটি Google পত্রক স্প্রেডশীটে তাদের খরচ লগ করার জন্য জমা দিতে পারে৷

আপনি কি শিখবেন

  • Google Apps স্ক্রিপ্ট ব্যবহার করে Gmail-এর জন্য একটি Google Workspace অ্যাড-অন তৈরি করুন
  • Google Apps স্ক্রিপ্ট দিয়ে একটি ইমেল পার্স করুন
  • Google Apps স্ক্রিপ্টের মাধ্যমে Google পত্রকের সাথে ইন্টারঅ্যাক্ট করুন
  • Google Apps স্ক্রিপ্টের বৈশিষ্ট্য পরিষেবা ব্যবহার করে ব্যবহারকারীর মান সংরক্ষণ করুন৷

আপনি কি প্রয়োজন হবে

  • ইন্টারনেট এবং একটি ওয়েব ব্রাউজারে অ্যাক্সেস
  • একটি Google অ্যাকাউন্ট
  • Gmail-এ কিছু বার্তা, বিশেষত ইমেল রসিদ

2. নমুনা কোড পান

আপনি এই কোডল্যাবের মাধ্যমে কাজ করার সময়, আপনি যে কোডটি লিখবেন তার একটি কার্যকরী সংস্করণ উল্লেখ করা সহায়ক হতে পারে। GitHub সংগ্রহস্থলে নমুনা কোড রয়েছে যা আপনি একটি রেফারেন্স হিসাবে ব্যবহার করতে পারেন।

কমান্ড লাইন থেকে নমুনা কোড পেতে, চালান:

git clone https://github.com/googleworkspace/gmail-add-on-codelab.git

3. একটি মৌলিক অ্যাড-অন তৈরি করুন

অ্যাড-অনের একটি সাধারণ সংস্করণের জন্য কোড লিখে শুরু করুন যা একটি ইমেলের পাশাপাশি একটি ব্যয় ফর্ম প্রদর্শন করে।

প্রথমে, একটি নতুন Apps Script প্রকল্প তৈরি করুন এবং এর ম্যানিফেস্ট ফাইল খুলুন।

  1. script.google.com- এ নেভিগেট করুন। এখান থেকে, আপনি আপনার Apps স্ক্রিপ্ট প্রকল্পগুলি তৈরি করতে, পরিচালনা করতে এবং নিরীক্ষণ করতে পারেন৷
  2. একটি নতুন প্রকল্প তৈরি করতে, উপরের বাম দিকে, নতুন প্রকল্পে ক্লিক করুন। নতুন প্রকল্প Code.gs নামে একটি ডিফল্ট ফাইলের সাথে খোলে। Code.gs আপাতত একা ছেড়ে দিন, আপনি পরে এটির সাথে কাজ করবেন।
  3. শিরোনামহীন প্রকল্পে ক্লিক করুন, আপনার প্রকল্পের নাম দিন ব্যয় করুন! , এবং Rename এ ক্লিক করুন।
  4. বাম দিকে, প্রকল্প সেটিংস ক্লিক করুন প্রকল্প সেটিংস .
  5. এডিটরে "appscript.json" ম্যানিফেস্ট ফাইল দেখান" চেকবক্স নির্বাচন করুন।
  6. Editor এ ক্লিক করুন সম্পাদক .
  7. ম্যানিফেস্ট ফাইলটি খুলতে, বামদিকে, appscript.json ক্লিক করুন।

appscript.json এ, অ্যাড-অনের সাথে সম্পর্কিত মেটাডেটা নির্দিষ্ট করুন, যেমন এর নাম এবং এর জন্য প্রয়োজনীয় অনুমতিগুলি৷ এই কনফিগারেশন সেটিংস দিয়ে appsscript.json এর বিষয়বস্তু প্রতিস্থাপন করুন:

{
  "timeZone": "GMT",
  "oauthScopes": [
    "https://www.googleapis.com/auth/gmail.addons.execute"
  ],
  "gmail": {
    "name": "Expense It!",
    "logoUrl": "https://www.gstatic.com/images/icons/material/system/1x/receipt_black_24dp.png",
    "contextualTriggers": [{
      "unconditional": {
      },
      "onTriggerFunction": "getContextualAddOn"
    }],
    "primaryColor": "#41f470",
    "secondaryColor": "#94f441"
  }
}

contextualTriggers নামক ম্যানিফেস্টের অংশে বিশেষ মনোযোগ দিন। ম্যানিফেস্টের এই অংশটি অ্যাড-অনটি প্রথম সক্রিয় হলে কল করার জন্য ব্যবহারকারী-সংজ্ঞায়িত ফাংশন সনাক্ত করে। এই ক্ষেত্রে, এটি getContextualAddOn কল করে, যা খোলা ইমেল সম্পর্কে বিশদ বিবরণ পায় এবং ব্যবহারকারীকে প্রদর্শনের জন্য কার্ডের একটি সেট ফেরত দেয়।

getContextualAddOn ফাংশন তৈরি করতে, এই পদক্ষেপগুলি অনুসরণ করুন:

  1. বাম দিকে, Code.gs উপরে পয়েন্টার ধরে রাখুন, তারপর মেনুতে ক্লিক করুন আরও মেনু > নাম পরিবর্তন করুন
  2. GetContextualAddOn টাইপ করুন এবং Enter কী টিপুন। অ্যাপস স্ক্রিপ্ট স্বয়ংক্রিয়ভাবে আপনার ফাইলের নামের সাথে .gs যুক্ত করে, তাই আপনাকে একটি ফাইল এক্সটেনশন টাইপ করতে হবে না। আপনি যদি GetContextualAddOn.gs টাইপ করেন তাহলে Apps স্ক্রিপ্ট আপনার ফাইলের নাম দেয় GetContextualAddOn.gs.gs
  3. GetContextualAddOn.gs এ, getContextualAddOn ফাংশন দিয়ে ডিফল্ট কোড প্রতিস্থাপন করুন:
/**
 * Returns the contextual add-on data that should be rendered for
 * the current e-mail thread. This function satisfies the requirements of
 * an 'onTriggerFunction' and is specified in the add-on's manifest.
 *
 * @param {Object} event Event containing the message ID and other context.
 * @returns {Card[]}
 */
function getContextualAddOn(event) {
  var card = CardService.newCardBuilder();
  card.setHeader(CardService.newCardHeader().setTitle('Log Your Expense'));

  var section = CardService.newCardSection();
  section.addWidget(CardService.newTextInput()
    .setFieldName('Date')
    .setTitle('Date'));
  section.addWidget(CardService.newTextInput()
    .setFieldName('Amount')
    .setTitle('Amount'));
  section.addWidget(CardService.newTextInput()
    .setFieldName('Description')
    .setTitle('Description'));
  section.addWidget(CardService.newTextInput()
    .setFieldName('Spreadsheet URL')
    .setTitle('Spreadsheet URL'));

  card.addSection(section);

  return [card.build()];
}

প্রতিটি Google Workspace অ্যাড-অন-এর অ্যাড-অন-এর ইউজার ইন্টারফেসে কার্ডগুলিকে এক বা একাধিক বিভাগে বিভক্ত করা হয়, প্রতিটিতে এমন উইজেট থাকে যা ব্যবহারকারীর কাছ থেকে তথ্য প্রদর্শন ও পেতে পারে। getContextualAddOn ফাংশন একটি একক কার্ড তৈরি করে যা একটি ইমেলে পাওয়া খরচের বিবরণ পায়। কার্ডটিতে প্রাসঙ্গিক ডেটার জন্য পাঠ্য ইনপুট ক্ষেত্র রয়েছে এমন একটি বিভাগ রয়েছে। ফাংশন অ্যাড-অন কার্ডগুলির একটি অ্যারে প্রদান করে। এই ক্ষেত্রে, প্রত্যাবর্তিত অ্যারেতে শুধুমাত্র একটি কার্ড রয়েছে।

মোতায়েন করার আগে এটা ব্যয়! অ্যাড-অন, আপনার একটি Google ক্লাউড প্ল্যাটফর্ম (GCP) প্রকল্প প্রয়োজন, যা অ্যাপস স্ক্রিপ্ট প্রকল্প অনুমোদন, উন্নত পরিষেবা এবং অন্যান্য বিবরণ পরিচালনা করতে ব্যবহার করে। আরও জানতে, Google Cloud Platform Projects দেখুন।

আপনার অ্যাড-অন স্থাপন এবং চালানোর জন্য, এই পদক্ষেপগুলি অনুসরণ করুন:

  1. আপনার GCP প্রোজেক্ট খুলুন এবং এর প্রোজেক্ট নম্বর কপি করুন
  2. আপনার Apps স্ক্রিপ্ট প্রকল্প থেকে, বাম দিকে, প্রকল্প সেটিংস ক্লিক করুন প্রকল্প সেটিংস .
  3. "Google ক্লাউড প্ল্যাটফর্ম (GCP) প্রকল্প"-এর অধীনে, প্রকল্প পরিবর্তন করুন-এ ক্লিক করুন।
  4. আপনার GCP প্রকল্পের প্রকল্প নম্বর লিখুন, তারপর প্রকল্প সেট করুন এ ক্লিক করুন।
  5. Deploy > Test deployments এ ক্লিক করুন।
  6. নিশ্চিত করুন যে ডিপ্লয়মেন্টের ধরনটি Google Workspace অ্যাড-অন । প্রয়োজনে, ডায়ালগের শীর্ষে, ডিপ্লয়মেন্ট প্রকার সক্ষম করুন ক্লিক করুন স্থাপনার ধরন সক্ষম করুন এবং Google Workspace অ্যাড-অনকে ডিপ্লোয়মেন্টের ধরন হিসেবে বেছে নিন।
  7. Application(s): Gmail এর পাশে Install এ ক্লিক করুন।
  8. সম্পন্ন ক্লিক করুন.

এখন আপনি আপনার Gmail ইনবক্সে অ্যাড-অন দেখতে পারেন।

  1. আপনার কম্পিউটারে, Gmail খুলুন।
  2. ডান পাশের প্যানেলে, এটি ব্যয়! এটা ব্যয়! রসিদ আইকন অ্যাড-অন প্রদর্শিত হয়। আপনাকে আরও অ্যাড-অনগুলিতে ক্লিক করতে হতে পারে৷ আরও অ্যাড-অন এটি খুঁজে পেতে
  3. একটি ইমেল খুলুন, বিশেষত খরচ সহ একটি রসিদ।
  4. অ্যাড-অন খুলতে ডান পাশের প্যানেলে, Expense It-এ ক্লিক করুন! এটা ব্যয়! রসিদ আইকন .
  5. খরচ এটা দিন! অ্যাক্সেস অনুমোদন ক্লিক করে আপনার Google অ্যাকাউন্টে অ্যাক্সেস করুন এবং প্রম্পটগুলি অনুসরণ করুন৷

অ্যাড-অনটি একটি খোলা জিমেইল বার্তার পাশাপাশি একটি সাধারণ ফর্ম দেখায়। এটি এখনও অন্য কিছু করে না, তবে আপনি পরবর্তী বিভাগে এর কার্যকারিতা তৈরি করবেন।

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

4. ইমেল বার্তা অ্যাক্সেস করুন

কোড যোগ করুন যা ইমেল বিষয়বস্তু নিয়ে আসে এবং আরও কিছু সংগঠনের জন্য কোডটি মডুলারাইজ করে।

Files এর পাশে, Add এ ক্লিক করুন একটি ফাইল যোগ করুন > স্ক্রিপ্ট এবং Cards নামে একটি ফাইল তৈরি করুন। Helpers নামে একটি দ্বিতীয় স্ক্রিপ্ট ফাইল তৈরি করুন। Cards.gs কার্ড তৈরি করে এবং ইমেলের বিষয়বস্তুর উপর ভিত্তি করে ফর্মে ক্ষেত্রগুলি পূরণ করতে Helpers.gs থেকে ফাংশন ব্যবহার করে।

এই কোড দিয়ে Cards.gs এ ডিফল্ট কোড প্রতিস্থাপন করুন:

var FIELDNAMES = ['Date', 'Amount', 'Description', 'Spreadsheet URL'];

/**
 * Creates the main card users see with form inputs to log expenses.
 * Form can be prefilled with values.
 *
 * @param {String[]} opt_prefills Default values for each input field.
 * @param {String} opt_status Optional status displayed at top of card.
 * @returns {Card}
 */
function createExpensesCard(opt_prefills, opt_status) {
  var card = CardService.newCardBuilder();
  card.setHeader(CardService.newCardHeader().setTitle('Log Your Expense'));
  
  if (opt_status) {
    if (opt_status.indexOf('Error: ') == 0) {
      opt_status = '<font color=\'#FF0000\'>' + opt_status + '</font>';
    } else {
      opt_status = '<font color=\'#228B22\'>' + opt_status + '</font>';
    }
    var statusSection = CardService.newCardSection();
    statusSection.addWidget(CardService.newTextParagraph()
      .setText('<b>' + opt_status + '</b>'));
    card.addSection(statusSection);
  }
  
  var formSection = createFormSection(CardService.newCardSection(),
                                      FIELDNAMES, opt_prefills);
  card.addSection(formSection);
  
  return card;
}

/**
 * Creates form section to be displayed on card.
 *
 * @param {CardSection} section The card section to which form items are added.
 * @param {String[]} inputNames Names of titles for each input field.
 * @param {String[]} opt_prefills Default values for each input field.
 * @returns {CardSection}
 */
function createFormSection(section, inputNames, opt_prefills) {
  for (var i = 0; i < inputNames.length; i++) {
    var widget = CardService.newTextInput()
      .setFieldName(inputNames[i])
      .setTitle(inputNames[i]);
    if (opt_prefills && opt_prefills[i]) {
      widget.setValue(opt_prefills[i]);
    }
    section.addWidget(widget);
  }
  return section;
}

createExpensesCard ফাংশনটি একটি ঐচ্ছিক আর্গুমেন্ট হিসাবে ফর্মটি প্রিফিল করতে মানগুলির একটি অ্যারে নেয়৷ ফাংশন একটি ঐচ্ছিক স্থিতি বার্তা প্রদর্শন করতে পারে, যা "ত্রুটি:" দিয়ে শুরু হলে লাল রঙের হয় এবং অন্যথায় সবুজ হয়। ম্যানুয়ালি ফর্মে প্রতিটি ক্ষেত্র যোগ করার পরিবর্তে, createFormSection নামক একটি সহায়ক ফাংশন টেক্সট ইনপুট উইজেট তৈরির প্রক্রিয়ার মধ্য দিয়ে লুপ করে, setValue দিয়ে প্রতিটি ডিফল্ট মান সেট করে এবং তারপরে কার্ডে তাদের নিজ নিজ বিভাগে উইজেট যোগ করে।

এখন, Helpers.gs এ এই কোড দিয়ে ডিফল্ট কোড প্রতিস্থাপন করুন:

/**
 * Finds largest dollar amount from email body.
 * Returns null if no dollar amount is found.
 *
 * @param {Message} message An email message.
 * @returns {String}
 */
function getLargestAmount(message) {
  return 'TODO';
}

/**
 * Determines date the email was received.
 *
 * @param {Message} message An email message.
 * @returns {String}
 */
function getReceivedDate(message) {
  return 'TODO';
}

/**
 * Determines expense description by joining sender name and message subject.
 *
 * @param {Message} message An email message.
 * @returns {String}
 */
function getExpenseDescription(message) {
  return 'TODO';
}

/**
 * Determines most recent spreadsheet URL.
 * Returns null if no URL was previously submitted.
 *
 * @returns {String}
 */
function getSheetUrl() {
  return 'TODO';
}

Helpers.gs এর ফাংশনগুলিকে getContextualAddon দ্বারা কল করা হয় ফর্মে প্রিফিল করা মানগুলি নির্ধারণ করতে। আপাতত, এই ফাংশনগুলি শুধুমাত্র "TODO" স্ট্রিংটি ফিরিয়ে দেবে কারণ আপনি পরবর্তী ধাপে প্রিফিল লজিক প্রয়োগ করবেন।

এরপরে, GetContextualAddon.gs এ কোড আপডেট করুন যাতে এটি Cards.gs এবং Helpers.gs এ কোডটি ব্যবহার করে। GetContextualAddon.gs এ কোডটি এই কোড দিয়ে প্রতিস্থাপন করুন:

/**
 * Copyright 2017 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
 *
 *   https://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.
 */

/**
 * Returns the contextual add-on data that should be rendered for
 * the current e-mail thread. This function satisfies the requirements of
 * an 'onTriggerFunction' and is specified in the add-on's manifest.
 *
 * @param {Object} event Event containing the message ID and other context.
 * @returns {Card[]}
 */
function getContextualAddOn(event) {
  var message = getCurrentMessage(event);
  var prefills = [getReceivedDate(message),
                  getLargestAmount(message),
                  getExpenseDescription(message),
                  getSheetUrl()];
  var card = createExpensesCard(prefills);

  return [card.build()];
}

/**
 * Retrieves the current message given an action event object.
 * @param {Event} event Action event object
 * @return {Message}
 */
function getCurrentMessage(event) {
  var accessToken = event.messageMetadata.accessToken;
  var messageId = event.messageMetadata.messageId;
  GmailApp.setCurrentMessageAccessToken(accessToken);
  return GmailApp.getMessageById(messageId);
}

নতুন getCurrentMessage ফাংশনটি নোট করুন, যা ব্যবহারকারীর বর্তমানে খোলা বার্তা পড়ার জন্য Gmail দ্বারা সরবরাহকৃত ইভেন্ট ব্যবহার করে। এই ফাংশনটি কাজ করার জন্য, স্ক্রিপ্ট ম্যানিফেস্টে একটি অতিরিক্ত সুযোগ যোগ করুন যা Gmail বার্তাগুলিতে শুধুমাত্র-পঠন অ্যাক্সেসের অনুমতি দেয়।

appscript.json এ, oauthScopes আপডেট করুন যাতে এটি https://www.googleapis.com/auth/gmail.addons.current.message.readonly স্কোপেরও অনুরোধ করে।

"oauthScopes": [
  "https://www.googleapis.com/auth/gmail.addons.execute",
   "https://www.googleapis.com/auth/gmail.addons.current.message.readonly"
],

Gmail-এ, আপনার অ্যাড-অন চালান এবং এক্সপেন্স ইট-এর জন্য অনুমোদন করুন! ইমেইল বার্তা দেখতে. ফর্ম ক্ষেত্রগুলি এখন "TODO" দিয়ে পূরণ করা হয়েছে।

5. Google পত্রকের সাথে ইন্টারঅ্যাক্ট করুন

এটা ব্যয়! অ্যাড-অনে ব্যবহারকারীর জন্য একটি ব্যয়ের বিবরণ লিখতে একটি ফর্ম রয়েছে, কিন্তু সেই বিবরণগুলির কোথাও যাওয়ার নেই। আসুন একটি বোতাম যোগ করি যা একটি Google পত্রকে ফর্ম ডেটা পাঠায়৷

একটি বোতাম যোগ করতে, আমরা ButtonSet ক্লাস ব্যবহার করব। Google পত্রকের সাথে ইন্টারফেস করতে, আমরা Google পত্রক পরিষেবা ব্যবহার করব৷

কার্ডের ফর্ম বিভাগের অংশ হিসাবে "জমা দিন" লেবেলযুক্ত একটি বোতাম ফেরাতে createFormSection পরিবর্তন করুন। নিম্নলিখিত পদক্ষেপ নিন:

  1. CardService.newTextButton() ব্যবহার করে একটি টেক্সট বোতাম তৈরি করুন, CardService.TextButton.setText() ব্যবহার করে "জমা দিন" বোতামটি লেবেল করুন।
  2. বোতামটি এমনভাবে ডিজাইন করুন যাতে এটি ক্লিক করা হলে নিম্নলিখিত submitForm অ্যাকশনটি CardService.TextButton.setOnClickAction() এর মাধ্যমে কল করা হয়:
/**
 * Logs form inputs into a spreadsheet given by URL from form.
 * Then displays edit card.
 *
 * @param {Event} e An event object containing form inputs and parameters.
 * @returns {Card}
 */
function submitForm(e) {
  var res = e['formInput'];
  try {
    FIELDNAMES.forEach(function(fieldName) {
      if (! res[fieldName]) {
        throw 'incomplete form';
      }
    });
    var sheet = SpreadsheetApp
      .openByUrl((res['Spreadsheet URL']))
      .getActiveSheet();
    sheet.appendRow(objToArray(res, FIELDNAMES.slice(0, FIELDNAMES.length - 1)));
    return createExpensesCard(null, 'Logged expense successfully!').build();
  }
  catch (err) {
    if (err == 'Exception: Invalid argument: url') {
      err = 'Invalid URL';
      res['Spreadsheet URL'] = null;
    }
    return createExpensesCard(objToArray(res, FIELDNAMES), 'Error: ' + err).build();
  }
}

/**
 * Returns an array corresponding to the given object and desired ordering of keys.
 *
 * @param {Object} obj Object whose values will be returned as an array.
 * @param {String[]} keys An array of key names in the desired order.
 * @returns {Object[]}
 */
function objToArray(obj, keys) {
  return keys.map(function(key) {
    return obj[key];
  });
}
  1. CardService.newButtonSet() ব্যবহার করে একটি বোতাম সেট উইজেট তৈরি করুন এবং CardService.ButtonSet.addButton() দিয়ে সেট করা বোতামে আপনার পাঠ্য বোতাম যোগ করুন।
  2. CardService.CardSection.addWidget() ব্যবহার করে কার্ডের ফর্ম সেকশনে বোতাম সেট উইজেট যোগ করুন।

কোডের মাত্র কয়েকটি লাইনে, আমরা একটি স্প্রেডশীট এর URL দ্বারা খুলতে এবং তারপর সেই শীটে ডেটার একটি সারি যুক্ত করতে সক্ষম হই। নোট করুন যে ইভেন্ট e এর অংশ হিসাবে ফর্ম ইনপুটগুলি ফাংশনে পাস হয় এবং আমরা পরীক্ষা করি যে ব্যবহারকারী সমস্ত ক্ষেত্র সরবরাহ করেছে। অনুমান করে কোন ত্রুটি ঘটেনি, আমরা একটি সুবিধাজনক অবস্থা সহ একটি ফাঁকা ব্যয় কার্ড তৈরি করি। যে ক্ষেত্রে আমরা একটি ত্রুটি ধরি, আমরা ত্রুটি বার্তা সহ আসল পূর্ণ কার্ডটি ফেরত দিই। objToArray সহায়ক ফাংশন ফর্ম প্রতিক্রিয়াগুলিকে একটি অ্যারেতে রূপান্তর করা সহজ করে তোলে, যা তারপর স্প্রেডশীটে যুক্ত করা যেতে পারে।

অবশেষে, appsscript.jsonoauthScopes বিভাগটি আপডেট করুন https://www.googleapis.com/auth/spreadsheets স্কোপের জন্য আবার অনুরোধ করুন। অনুমোদিত হলে এই সুযোগ অ্যাড-অনকে একজন ব্যবহারকারীর Google পত্রক পড়তে এবং সংশোধন করতে দেয়৷

"oauthScopes": [
  "https://www.googleapis.com/auth/gmail.addons.execute",
  "https://www.googleapis.com/auth/gmail.addons.current.message.readonly",
  "https://www.googleapis.com/auth/spreadsheets"
],

আপনি যদি ইতিমধ্যে একটি নতুন স্প্রেডশীট তৈরি না করে থাকেন তবে https://docs.google.com/spreadsheets/ এ একটি তৈরি করুন।

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

6. বৈশিষ্ট্য পরিষেবার সাথে মান সংরক্ষণ করুন৷

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

বৈশিষ্ট্য পরিষেবা আমাদের কী-মান জোড়া সঞ্চয় করতে দেয়৷ আমাদের ক্ষেত্রে, একটি যুক্তিসঙ্গত কী হবে "SPREADSHEET_URL" যেখানে মানটি নিজেই URL হবে৷ এই ধরনের মান সঞ্চয় করার জন্য, আপনাকে Cards.gssubmitForm পরিবর্তন করতে হবে যাতে স্প্রেডশীটের URL শীটে একটি নতুন সারি যুক্ত করার পরে একটি সম্পত্তি হিসাবে সংরক্ষণ করা হয়।

মনে রাখবেন যে বৈশিষ্ট্যগুলির তিনটি স্কোপের মধ্যে একটি থাকতে পারে: স্ক্রিপ্ট, ব্যবহারকারী বা নথিনথির সুযোগ Gmail অ্যাড-অনগুলিতে প্রযোজ্য নয়, যদিও এটি একটি নির্দিষ্ট Google ডক বা পত্রকের জন্য নির্দিষ্ট তথ্য সংরক্ষণ করার সময় একটি পৃথক ধরনের অ্যাড-অনের সাথে প্রাসঙ্গিক। আমাদের অ্যাড-অনের জন্য, পছন্দসই আচরণ হল একজন ব্যক্তির নিজের (অন্য কারোর বিপরীতে) ফর্মের ডিফল্ট বিকল্প হিসাবে সাম্প্রতিক স্প্রেডশীট দেখতে। ফলস্বরূপ, আমরা স্ক্রিপ্ট সুযোগের পরিবর্তে ব্যবহারকারীর সুযোগ নির্বাচন করি।

স্প্রেডশীট ইউআরএল সংরক্ষণ করতে PropertiesService.getUserProperties().setProperty() ব্যবহার করুন। Cards.gssubmitForm নিম্নলিখিত যোগ করুন:

PropertiesService.getUserProperties().setProperty('SPREADSHEET_URL', 
    res['Spreadsheet URL']);

তারপরে সংরক্ষিত সম্পত্তি ফেরত দিতে Helpers.gsgetSheetUrl ফাংশনটি পরিবর্তন করুন যাতে ব্যবহারকারী প্রতিবার অ্যাড-অন ব্যবহার করার সময় সবচেয়ে সাম্প্রতিক URL দেখতে পাবে। সম্পত্তির মান পেতে PropertiesService.getUserProperties().getProperty() ব্যবহার করুন।

/**
 * Determines most recent spreadsheet URL.
 * Returns null if no URL was previously submitted.
 *
 * @returns {String}
 */
function getSheetUrl() {
  return PropertiesService.getUserProperties().getProperty('SPREADSHEET_URL');
}

অবশেষে, সম্পত্তি পরিষেবা অ্যাক্সেস করার জন্য, স্ক্রিপ্টটি অনুমোদিত হতে হবে। আপনার অ্যাড-অনকে সম্পত্তির তথ্য পড়তে এবং লিখতে অনুমতি দিতে আগের মতো ম্যানিফেস্টে https://www.googleapis.com/auth/script.storage স্কোপ যোগ করুন।

7. Gmail বার্তাটি পার্স করুন

সত্যিই ব্যবহারকারীদের সময় বাঁচাতে, ইমেল থেকে খরচ সম্পর্কে প্রাসঙ্গিক তথ্য সহ ফর্মটি আগে থেকে পূরণ করা যাক। আমরা ইতিমধ্যে Helpers.gs এ ফাংশন তৈরি করেছি যা এই ভূমিকা পালন করে, কিন্তু এখনও পর্যন্ত আমরা শুধুমাত্র তারিখ, পরিমাণ এবং খরচের বিবরণের জন্য "TODO" ফেরত দিয়েছি।

উদাহরণস্বরূপ, আমরা ইমেলটি প্রাপ্তির তারিখটি পেতে পারি এবং ব্যয়ের তারিখের জন্য এটিকে ডিফল্ট মান হিসাবে ব্যবহার করতে পারি।

/**
 * Determines date the email was received.
 *
 * @param {Message} message - The message currently open.
 * @returns {String}
 */
function getReceivedDate(message) {
  return message.getDate().toLocaleDateString();
}

অবশিষ্ট দুটি ফাংশন বাস্তবায়ন করুন:

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

আপনার যদি কিছু অতিরিক্ত অনুপ্রেরণার প্রয়োজন হয়, GmailMessage এর জন্য রেফারেন্স ডকুমেন্টেশন অন্বেষণ করুন বা কোডল্যাবের শুরুতে আপনার ডাউনলোড করা সমাধান কোডটি দেখুন। একবার আপনি Helpers.gs এর সমস্ত ফাংশনগুলির জন্য আপনার নিজস্ব প্রয়োগগুলি তৈরি করে নিলে, একটি স্পিন করার জন্য আপনার অ্যাড-অন নিন! রসিদগুলি খুলুন এবং একটি স্প্রেডশীটে লগ করা শুরু করুন!

8. কার্ড ক্রিয়া সহ ফর্মটি সাফ করুন

এটা খরচ করলে কি হবে! একটি খোলা ইমেলে একটি খরচ ভুল শনাক্ত করে এবং ভুল তথ্য দিয়ে ফর্মটি প্রিফিল করে? ব্যবহারকারী ফর্মটি সাফ করে। CardAction ক্লাস আমাদের একটি ফাংশন নির্দিষ্ট করতে দেয় যা অ্যাকশনটি ক্লিক করা হলে কল করা হয়। আসুন ব্যবহারকারীকে ফর্মটি পরিষ্কার করার দ্রুত উপায় দিতে এটি ব্যবহার করি।

createExpensesCard পরিবর্তন করুন যাতে এটি যে কার্ডটি ফেরত দেয় তাতে "ক্লিয়ার ফর্ম" লেবেলযুক্ত একটি কার্ড অ্যাকশন থাকে এবং ক্লিক করা হলে নিম্নলিখিত clearForm ফাংশনটি কল করে, যা আপনি Cards.gs এ পেস্ট করতে পারেন। ফর্মটি সাফ হয়ে গেলে স্ট্যাটাস মেসেজটি থেকে যায় তা নিশ্চিত করতে আপনাকে "স্থিতি" নামের একটি প্যারামিটার হিসাবে opt_status এ পাস করতে হবে৷ মনে রাখবেন যে কর্মের জন্য ঐচ্ছিক পরামিতি অবশ্যই অবজেক্টের হতে হবে।<string, string>, তাই যদি opt_status উপলব্ধ না হয়, তাহলে আপনাকে {'Status' : ''} পাস করতে হবে।

/**
 * Recreates the main card without prefilled data.
 *
 * @param {Event} e An event object containing form inputs and parameters.
 * @returns {Card}
 */
function clearForm(e) {
  return createExpensesCard(null, e['parameters']['Status']).build();
}

9. একটি স্প্রেডশীট তৈরি করুন

একটি বিদ্যমান স্প্রেডশীট সম্পাদনা করতে Google Apps স্ক্রিপ্ট ব্যবহার করার বাইরে, আপনি প্রোগ্রামগতভাবে একটি সম্পূর্ণ নতুন স্প্রেডশীট তৈরি করতে পারেন৷ আমাদের অ্যাড-অনের জন্য, ব্যবহারকারীকে খরচের জন্য একটি স্প্রেডশীট তৈরি করার অনুমতি দিন। শুরু করতে, কার্ডে নিম্নলিখিত কার্ড বিভাগটি যোগ করুন যা এক্সপেনসেসকার্ড রিটার্ন createExpensesCard

var newSheetSection = CardService.newCardSection();
var sheetName = CardService.newTextInput()
  .setFieldName('Sheet Name')
  .setTitle('Sheet Name');
var createExpensesSheet = CardService.newAction()
  .setFunctionName('createExpensesSheet');
var newSheetButton = CardService.newTextButton()
  .setText('New Sheet')
  .setOnClickAction(createExpensesSheet);
newSheetSection.addWidget(sheetName);
newSheetSection.addWidget(CardService.newButtonSet().addButton(newSheetButton));
card.addSection(newSheetSection);

এখন, যখন ব্যবহারকারী "নতুন পত্রক" বোতামে ক্লিক করেন তখন অ্যাড-অন একটি নতুন স্প্রেডশীট তৈরি করে যা একটি শিরোনাম সারি সহ বিন্যাসিত হয় যা এমনভাবে হিমায়িত থাকে যাতে এটি সর্বদা দৃশ্যমান হয়। ব্যবহারকারী ফর্মটিতে নতুন স্প্রেডশীটের জন্য একটি শিরোনাম নির্দিষ্ট করে, যদিও ফর্মটি ফাঁকা থাকলে একটি ডিফল্ট মান অন্তর্ভুক্ত করা একটি ভাল পছন্দ হতে পারে। আপনার createExpensesSheet এর বাস্তবায়নে, একটি উপযুক্ত স্থিতি বার্তা যোগ করার পাশাপাশি নতুন স্প্রেডশীটের URL এর সাথে URL ক্ষেত্রটি প্রিফিলিং সহ বিদ্যমান কার্ডে একটি প্রায় অভিন্ন কার্ড ফিরিয়ে দিন।

10. অভিনন্দন!

আপনি সফলভাবে একটি Gmail অ্যাড-অন ডিজাইন এবং প্রয়োগ করেছেন যা একটি ইমেলে একটি খরচ খুঁজে পায় এবং ব্যবহারকারীদের মাত্র কয়েক সেকেন্ডের মধ্যে একটি স্প্রেডশীটে খরচ লগ করতে সাহায্য করে৷ আপনি একাধিক Google API-এর সাথে ইন্টারফেস করতে Google Apps Script ব্যবহার করেছেন এবং অ্যাড-অনের একাধিক এক্সিকিউশনের মধ্যে স্থায়ী ডেটা ব্যবহার করেছেন।

সম্ভাব্য উন্নতি

খরচ বাড়াতে গিয়ে আপনার কল্পনাকে আপনাকে গাইড করতে দিন!, তবে আরও দরকারী পণ্য তৈরির জন্য এখানে কিছু ধারণা রয়েছে:

  • একবার ব্যবহারকারী একটি খরচ লগইন করার পরে স্প্রেডশীটের সাথে লিঙ্ক করুন৷
  • একটি খরচের লগিং সম্পাদনা/পূর্বাবস্থায় ফেরানোর ক্ষমতা যোগ করুন
  • ব্যবহারকারীদের অর্থপ্রদান করতে এবং অর্থের অনুরোধ করতে বাহ্যিক APIগুলিকে একীভূত করুন৷

আরও জানুন