Google শীট #4 সহ অ্যাপস স্ক্রিপ্টের মৌলিক বিষয়গুলি: ডেটা ফর্ম্যাটিং৷

1। পরিচিতি

Google Sheets কোডল্যাব প্লেলিস্ট সহ অ্যাপস্ স্ক্রিপ্টের মৌলিক বিষয়গুলির চতুর্থ অংশে স্বাগতম৷

এই কোডল্যাবটি সম্পূর্ণ করার মাধ্যমে, আপনি Apps স্ক্রিপ্টে আপনার স্প্রেডশীট ডেটা কীভাবে ফর্ম্যাট করবেন তা শিখতে পারেন এবং একটি পাবলিক API থেকে আনা ফর্ম্যাটেড ডেটাতে পূর্ণ সংগঠিত স্প্রেডশীট তৈরি করতে ফাংশনগুলি লিখতে পারেন৷

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

  • অ্যাপস্ স্ক্রিপ্টে বিভিন্ন Google পত্রক ফর্ম্যাটিং অপারেশনগুলি কীভাবে প্রয়োগ করবেন।
  • অ্যাপস স্ক্রিপ্টের সাহায্যে JSON অবজেক্টের একটি তালিকা এবং তাদের বৈশিষ্ট্যগুলিকে ডেটার একটি সংগঠিত শীটে কীভাবে রূপান্তর করা যায়।

তুমি শুরু করার আগে

Google শীট প্লেলিস্ট সহ অ্যাপস্ স্ক্রিপ্টের মৌলিক বিষয়গুলির মধ্যে এটি চতুর্থ কোডল্যাব৷ এই কোডল্যাব শুরু করার আগে, পূর্ববর্তী কোডল্যাবগুলি সম্পূর্ণ করতে ভুলবেন না:

  1. ম্যাক্রো এবং কাস্টম ফাংশন
  2. স্প্রেডশীট, শীট, এবং রেঞ্জ
  3. ডেটা নিয়ে কাজ করা

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

  • এই প্লেলিস্টের পূর্ববর্তী কোডল্যাবগুলিতে অন্বেষণ করা প্রাথমিক Apps স্ক্রিপ্ট বিষয়গুলির একটি বোঝাপড়া৷
  • অ্যাপস স্ক্রিপ্ট সম্পাদকের সাথে প্রাথমিক পরিচিতি
  • Google পত্রকের সাথে প্রাথমিক পরিচিতি
  • পত্রক A1 স্বরলিপি পড়ার ক্ষমতা
  • জাভাস্ক্রিপ্ট এবং এর String ক্লাসের সাথে প্রাথমিক পরিচিতি

2. সেট আপ করুন

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

  1. ডেটা শীট অনুলিপি করতে এই লিঙ্কে ক্লিক করুন এবং তারপর একটি অনুলিপি তৈরি করুন ক্লিক করুন। নতুন স্প্রেডশীটটি আপনার Google ড্রাইভ ফোল্ডারে স্থাপন করা হয়েছে এবং "ডেটা ফর্ম্যাটিং এর অনুলিপি" নাম দেওয়া হয়েছে।
  2. স্প্রেডশীট শিরোনামে ক্লিক করুন এবং "ডেটা ফরম্যাটিং এর অনুলিপি" থেকে "ডেটা ফর্ম্যাটিং" এ পরিবর্তন করুন। প্রথম তিনটি স্টার ওয়ার চলচ্চিত্র সম্পর্কে কিছু প্রাথমিক তথ্য সহ আপনার শীটটি এইরকম হওয়া উচিত:

c4f49788ed82502b.png

  1. স্ক্রিপ্ট সম্পাদক খুলতে এক্সটেনশন > অ্যাপস স্ক্রিপ্ট নির্বাচন করুন।
  2. অ্যাপস স্ক্রিপ্ট প্রকল্পের শিরোনামে ক্লিক করুন এবং "শিরোনামহীন প্রকল্প" থেকে "ডেটা বিন্যাস" এ পরিবর্তন করুন। শিরোনাম পরিবর্তন সংরক্ষণ করতে পুনঃনামকরণ ক্লিক করুন.

এই স্প্রেডশীট এবং প্রকল্পের সাথে, আপনি কোডল্যাব শুরু করতে প্রস্তুত৷ অ্যাপস স্ক্রিপ্টে মৌলিক বিন্যাস সম্পর্কে শেখা শুরু করতে পরবর্তী বিভাগে যান।

3. একটি কাস্টম মেনু তৈরি করুন

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

বাস্তবায়ন

আসুন একটি কাস্টম মেনু তৈরি করি।

  1. অ্যাপস স্ক্রিপ্ট এডিটরে, আপনার স্ক্রিপ্ট প্রজেক্টের কোডটি নিম্নলিখিত দিয়ে প্রতিস্থাপন করুন:
/**
 * A special function that runs when the spreadsheet is opened
 * or reloaded, used to add a custom menu to the spreadsheet.
 */
function onOpen() {
  // Get the spreadsheet's user-interface object.
  var ui = SpreadsheetApp.getUi();

  // Create and add a named menu and its items to the menu bar.
  ui.createMenu('Quick formats')
   .addItem('Format row header', 'formatRowHeader')
   .addItem('Format column header', 'formatColumnHeader')
   .addItem('Format dataset', 'formatDataset') 
  .addToUi();
}
  1. আপনার স্ক্রিপ্ট প্রকল্প সংরক্ষণ করুন.
  2. স্ক্রিপ্ট এডিটরে, ফাংশন তালিকা থেকে onOpen নির্বাচন করুন এবং Run এ ক্লিক করুন। এটি স্প্রেডশীট মেনু পুনর্নির্মাণ করতে onOpen() এ চলে, তাই আপনাকে স্প্রেডশীটটি পুনরায় লোড করতে হবে না।

কোড পূনর্বিবেচনা

এটি কিভাবে কাজ করে তা বোঝার জন্য আসুন এই কোডটি পর্যালোচনা করি। onOpen() এ, প্রথম লাইনটি একটি Ui অবজেক্ট অর্জন করতে getUi() পদ্ধতি ব্যবহার করে যা এই স্ক্রিপ্টের সাথে আবদ্ধ সক্রিয় স্প্রেডশীটের ব্যবহারকারী ইন্টারফেসের প্রতিনিধিত্ব করে।

পরবর্তী লাইনগুলি একটি মেনু তৈরি করে ( Quick formats ), মেনুতে মেনু আইটেমগুলি ( Format row header , Format column header , এবং Format dataset ) যোগ করে এবং তারপরে স্প্রেডশীটের ইন্টারফেসে মেনু যোগ করে। এটি createMenu(caption) , addItem(caption, functionName) এবং addToUi() পদ্ধতির সাহায্যে করা হয়।

addItem(caption, functionName) পদ্ধতি মেনু আইটেম লেবেল এবং একটি Apps স্ক্রিপ্ট ফাংশনের মধ্যে একটি সংযোগ তৈরি করে যা মেনু আইটেমটি নির্বাচন করা হলে চলে। উদাহরণস্বরূপ, Format row header মেনু আইটেমটি নির্বাচন করার ফলে শীটগুলি ফর্ম্যাটরোহেডার formatRowHeader() ফাংশন চালানোর চেষ্টা করে (যা এখনও বিদ্যমান নেই)৷

ফলাফল

আপনার স্প্রেডশীটে, নতুন মেনু আইটেম দেখতে Quick formats মেনুতে ক্লিক করুন:

1d639a41f3104864.png

এই আইটেমগুলিতে ক্লিক করার ফলে একটি ত্রুটি দেখা দেয় যেহেতু আপনি তাদের সংশ্লিষ্ট ফাংশনগুলি প্রয়োগ করেননি, তাই এর পরে এটি করা যাক।

4. একটি হেডার সারি ফর্ম্যাট করুন

স্প্রেডশীটের ডেটাসেটগুলিতে প্রায়ই প্রতিটি কলামের ডেটা সনাক্ত করার জন্য হেডার সারি থাকে। স্প্রেডশীটের বাকি ডেটা থেকে দৃশ্যমানভাবে আলাদা করতে হেডার সারিগুলি ফর্ম্যাট করা একটি ভাল ধারণা৷

প্রথম কোডল্যাবে, আপনি আপনার হেডারের জন্য একটি ম্যাক্রো তৈরি করেছেন এবং এর কোড সামঞ্জস্য করেছেন। এখানে, আপনি Apps Script ব্যবহার করে স্ক্র্যাচ থেকে একটি হেডার সারি ফর্ম্যাট করবেন। আপনি যে হেডার সারি তৈরি করবেন তা হেডার টেক্সটকে বোল্ড করবে, পটভূমিকে গাঢ় নীল-সবুজ রঙ করবে, টেক্সটটিকে সাদা রঙ করবে এবং কিছু শক্ত সীমারেখা যোগ করবে।

বাস্তবায়ন

ফরম্যাটিং অপারেশন বাস্তবায়ন করতে, আপনি একই স্প্রেডশীট পরিষেবা পদ্ধতিগুলি ব্যবহার করবেন যা আপনি আগে ব্যবহার করেছেন, কিন্তু এখন আপনি পরিষেবার কিছু ফর্ম্যাটিং পদ্ধতিও ব্যবহার করবেন৷ নিম্নলিখিত পদক্ষেপ নিন:

  1. Apps স্ক্রিপ্ট সম্পাদকে, আপনার স্ক্রিপ্ট প্রকল্পের শেষে নিম্নলিখিত ফাংশন যোগ করুন:
/**
 * Formats top row of sheet using our header row style.
 */
function formatRowHeader() {
  // Get the current active sheet and the top row's range.
  var sheet = SpreadsheetApp.getActiveSheet();
  var headerRange = sheet.getRange(1, 1, 1, sheet.getLastColumn());
 
  // Apply each format to the top row: bold white text,
  // blue-green background, and a solid black border
  // around the cells.
  headerRange
    .setFontWeight('bold')
    .setFontColor('#ffffff')
    .setBackground('#007272')
    .setBorder(
      true, true, true, true, null, null,
      null,
      SpreadsheetApp.BorderStyle.SOLID_MEDIUM);

}
  1. আপনার স্ক্রিপ্ট প্রকল্প সংরক্ষণ করুন.

কোড পূনর্বিবেচনা

অনেক ফরম্যাটিং টাস্কের মতো, এটিকে বাস্তবায়ন করার জন্য অ্যাপস স্ক্রিপ্ট কোডটি সহজবোধ্য। প্রথম দুটি লাইন বর্তমান সক্রিয় শীট ( sheet ) এবং শীটের উপরের সারি ( headerRange) এর একটি রেফারেন্স পেতে আগে দেখেছেন এমন পদ্ধতিগুলি ব্যবহার করে। Sheet.getRange(row, column, numRows, numColumns) পদ্ধতি উপরের সারিটি নির্দিষ্ট করে, শুধুমাত্র সেই কলামগুলি সহ তাদের মধ্যে ডেটা রয়েছে। Sheet.getLastColumn() পদ্ধতিটি শেষ কলামের কলাম সূচী প্রদান করে যা শীটে ডেটা রয়েছে। আমাদের উদাহরণে, এটি কলাম E ( url )।

headerRange সমস্ত কক্ষে ফরম্যাটিং পছন্দ প্রয়োগ করার জন্য বাকি কোডটি কেবল বিভিন্ন Range পদ্ধতিকে কল করে। কোডটি সহজে পড়ার জন্য, আমরা প্রতিটি ফর্ম্যাটিং পদ্ধতিকে একের পর এক কল করার জন্য মেথড চেইনিং ব্যবহার করি:

শেষ পদ্ধতিতে বেশ কয়েকটি পরামিতি রয়েছে, তাই আসুন প্রতিটি কী করছে তা পর্যালোচনা করা যাক। এখানে প্রথম চারটি পরামিতি (সমস্তই true সেট) অ্যাপস স্ক্রিপ্টকে বলে যে সীমানাটি রেঞ্জের উপরে, নীচে এবং বাম এবং ডানে যোগ করা উচিত। পঞ্চম এবং ষষ্ঠ পরামিতি ( null এবং null ) সরাসরি Apps স্ক্রিপ্ট নির্বাচিত পরিসরের মধ্যে কোনো সীমানা রেখা পরিবর্তন এড়াতে। সপ্তম প্যারামিটার ( null ) নির্দেশ করে সীমানার রঙ ডিফল্ট কালো হওয়া উচিত। অবশেষে, শেষ প্যারামিটারটি ব্যবহার করার জন্য বর্ডার শৈলীর ধরন নির্দিষ্ট করে, যা SpreadsheetApp.BorderStyle দ্বারা প্রদত্ত বিকল্পগুলি থেকে নেওয়া হয়েছে।

ফলাফল

আপনি নিম্নলিখিত কাজ করে আপনার ফর্ম্যাটিং ফাংশনটি দেখতে পারেন:

  1. যদি আপনি ইতিমধ্যেই না করে থাকেন, তাহলে Apps স্ক্রিপ্ট এডিটরে আপনার স্ক্রিপ্ট প্রকল্প সংরক্ষণ করুন।
  2. কুইক ফরম্যাট > ফরম্যাট সারি হেডার মেনু আইটেমে ক্লিক করুন।

ফলাফল নিম্নলিখিত মত দেখতে হবে:

a1a63770c2c3becc.gif

আপনি এখন একটি ফর্ম্যাটিং টাস্ক স্বয়ংক্রিয় করেছেন৷ পরবর্তী বিভাগ কলাম শিরোনামগুলির জন্য একটি ভিন্ন বিন্যাস শৈলী তৈরি করতে একই কৌশল প্রয়োগ করে।

5. একটি কলাম হেডার ফরম্যাট করুন

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

  • টেক্সট বোল্ডিং
  • টেক্সট তির্যক করা
  • সেল সীমানা যোগ করা হচ্ছে
  • url কলামের বিষয়বস্তু ব্যবহার করে হাইপারলিঙ্ক সন্নিবেশ করানো হচ্ছে। একবার আপনি এই হাইপারলিঙ্কগুলি যোগ করলে, আপনি শীট পরিষ্কার করতে সাহায্য করার জন্য url কলামটি সরাতে পারেন।

পরবর্তীতে আপনি শীটের প্রথম কলামে এই পরিবর্তনগুলি প্রয়োগ করতে একটি formatColumnHeader() ফাংশন প্রয়োগ করবেন। কোডটি পড়তে কিছুটা সহজ করতে সাহায্য করার জন্য, আপনি দুটি সহায়ক ফাংশনও প্রয়োগ করবেন।

বাস্তবায়ন

আগের মতো, কলাম হেডার ফরম্যাটিং স্বয়ংক্রিয় করতে আপনাকে একটি ফাংশন যোগ করতে হবে। নিম্নলিখিত পদক্ষেপ নিন:

  1. Apps স্ক্রিপ্ট এডিটরে, আপনার স্ক্রিপ্ট প্রজেক্টের শেষে নিম্নলিখিত formatColumnHeader() ফাংশন যোগ করুন:
/**
 * Formats the column header of the active sheet.
 */ 
function formatColumnHeader() {  
  var sheet = SpreadsheetApp.getActiveSheet();
  
  // Get total number of rows in data range, not including
  // the header row.
  var numRows = sheet.getDataRange().getLastRow() - 1;
  
  // Get the range of the column header.
  var columnHeaderRange = sheet.getRange(2, 1, numRows, 1);
  
  // Apply text formatting and add borders.
  columnHeaderRange
    .setFontWeight('bold')
    .setFontStyle('italic')
    .setBorder(
      true, true, true, true, null, null,
      null,
      SpreadsheetApp.BorderStyle.SOLID_MEDIUM);
 
  // Call helper method to hyperlink the first column contents
  // to the url column contents.
  hyperlinkColumnHeaders_(columnHeaderRange, numRows); 
}
  1. formatColumnHeader() ফাংশনের পরে, আপনার স্ক্রিপ্ট প্রকল্পের শেষে নিম্নলিখিত সহায়ক ফাংশন যোগ করুন:
/**
 * Helper function that hyperlinks the column header with the
 * 'url' column contents. The function then removes the column.
 *
 * @param {object} headerRange The range of the column header
 *   to update.
 * @param {number} numRows The size of the column header.
 */
function hyperlinkColumnHeaders_(headerRange, numRows) {
  // Get header and url column indices.
  var headerColIndex = 1; 
  var urlColIndex = columnIndexOf_('url');  
  
  // Exit if the url column is missing.
  if(urlColIndex == -1)
    return; 
  
  // Get header and url cell values.
  var urlRange =
    headerRange.offset(0, urlColIndex - headerColIndex);
  var headerValues = headerRange.getValues();
  var urlValues = urlRange.getValues();
  
  // Updates header values to the hyperlinked header values.
  for(var row = 0; row < numRows; row++){
    headerValues[row][0] = '=HYPERLINK("' + urlValues[row]
      + '","' + headerValues[row] + '")';
  }
  headerRange.setValues(headerValues);
  
  // Delete the url column to clean up the sheet.
  SpreadsheetApp.getActiveSheet().deleteColumn(urlColIndex);
}

/**
 * Helper function that goes through the headers of all columns
 * and returns the index of the column with the specified name
 * in row 1. If a column with that name does not exist,
 * this function returns -1. If multiple columns have the same
 * name in row 1, the index of the first one discovered is
 * returned.
 * 
 * @param {string} colName The name to find in the column
 *   headers. 
 * @return The index of that column in the active sheet,
 *   or -1 if the name isn't found.
 */ 
function columnIndexOf_(colName) {
  // Get the current column names.
  var sheet = SpreadsheetApp.getActiveSheet();
  var columnHeaders =
    sheet.getRange(1, 1, 1, sheet.getLastColumn());
  var columnNames = columnHeaders.getValues();
  
  // Loops through every column and returns the column index
  // if the row 1 value of that column matches colName.
  for(var col = 1; col <= columnNames[0].length; col++)
  {
    if(columnNames[0][col-1] === colName)
      return col; 
  }

  // Returns -1 if a column named colName does not exist. 
  return -1; 
}
  1. আপনার স্ক্রিপ্ট প্রকল্প সংরক্ষণ করুন.

কোড পূনর্বিবেচনা

আসুন এই তিনটি ফাংশনের প্রতিটিতে আলাদাভাবে কোড পর্যালোচনা করি:

formatColumnHeader()

আপনি সম্ভবত আশা করতে এসেছেন, এই ফাংশনের প্রথম কয়েকটি লাইন ভেরিয়েবল সেট করে যা আমরা আগ্রহী সেই শীট এবং পরিসরের উল্লেখ করে:

  • সক্রিয় শীটটি sheet সংরক্ষণ করা হয়।
  • কলাম হেডারে সারির সংখ্যা গণনা করা হয় এবং numRows এ সংরক্ষিত হয়। এখানে কোডটি একটি বিয়োগ করে তাই সারি গণনা কলাম শিরোনাম অন্তর্ভুক্ত করে না: title
  • কলামের শিরোনামটি কভার করার columnHeaderRange এ সংরক্ষণ করা হয়।

কোডটি তখন বর্ডার এবং বোল্ডিং কলাম হেডার রেঞ্জে প্রয়োগ করে, ঠিক যেমন formatRowHeader() । এখানে, Range.setFontStyle(fontStyle) ও টেক্সটটিকে তির্যকভাবে ব্যবহার করা হয়।

হেডার কলামে হাইপারলিঙ্ক যোগ করা আরও জটিল, তাই formatColumnHeader() টাস্কের যত্ন নেওয়ার জন্য hyperlinkColumnHeaders_(headerRange, numRows) ) কল করে। এটি কোডটিকে পরিপাটি এবং পঠনযোগ্য রাখতে সহায়তা করে।

hyperlinkColumnHeaders_(headerRange, numRows)

এই হেল্পার ফাংশনটি প্রথমে হেডারের কলাম সূচকগুলিকে চিহ্নিত করে (এটি সূচক 1 বলে ধরে নেওয়া হয়) এবং url কলাম। url কলাম সূচক পেতে এটি columnIndexOf_('url') কল করে। যদি একটি url কলাম পাওয়া না যায়, পদ্ধতিটি কোনো তথ্য পরিবর্তন না করেই প্রস্থান করে।

ফাংশনটি একটি নতুন পরিসর ( urlRange ) পায় যা হেডার কলামের সারিগুলির সাথে সম্পর্কিত urlগুলিকে কভার করে৷ এটি Range.offset(rowOffset, columnOffset) পদ্ধতিতে করা হয়, যা গ্যারান্টি দেয় যে দুটি রেঞ্জ একই আকারের হবে। headerColumn এবং url কলাম উভয়ের মানগুলি তারপর পুনরুদ্ধার করা হয় ( শিরোনাম urlValues headerValues

তারপরে ফাংশনটি প্রতিটি কলাম হেডার সেল মানের উপর লুপ করে এবং হেডার এবং url কলামের বিষয়বস্তু দিয়ে তৈরি একটি =HYPERLINK() পত্রক সূত্র দিয়ে প্রতিস্থাপন করে। পরিবর্তিত হেডার মানগুলি তারপর Range.setValues(values) ব্যবহার করে শীটে ঢোকানো হয়।

অবশেষে, শীট পরিষ্কার রাখতে এবং অপ্রয়োজনীয় তথ্য দূর করতে সাহায্য করার জন্য, url কলাম সরাতে Sheet.deleteColumn(columnPosition) বলা হয়।

columnIndexOf_(colName)

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

ফাংশন তারপর ক্রমানুসারে প্রতিটি নাম পর্যালোচনা করে। যদি এটি এমন একটি খুঁজে পায় যা অনুসন্ধান করা নামের সাথে মেলে তবে এটি থামে এবং কলামের সূচী প্রদান করে। যদি এটি নাম খুঁজে না পেয়ে নামের তালিকার শেষে পৌঁছায়, তবে নামটি পাওয়া যায়নি বলে সংকেত দিতে এটি -1 ফেরত দেয়।

ফলাফল

আপনি নিম্নলিখিত কাজ করে আপনার ফর্ম্যাটিং ফাংশনটি দেখতে পারেন:

  1. যদি আপনি ইতিমধ্যেই না করে থাকেন, তাহলে Apps স্ক্রিপ্ট এডিটরে আপনার স্ক্রিপ্ট প্রকল্প সংরক্ষণ করুন।
  2. কুইক ফরম্যাট > ফরম্যাট কলাম হেডার মেনু আইটেমে ক্লিক করুন।

ফলাফল নিম্নলিখিত মত দেখতে হবে:

7497cf1b982aeff6.gif

আপনি এখন অন্য ফর্ম্যাটিং টাস্ক স্বয়ংক্রিয় করেছেন৷ কলাম এবং সারি হেডার ফরম্যাট করে, পরবর্তী বিভাগ দেখায় কিভাবে ডেটা ফরম্যাট করতে হয়।

6. আপনার ডেটাসেট ফর্ম্যাট করুন

এখন আপনার শিরোনাম আছে, আসুন একটি ফাংশন তৈরি করি যা আপনার শীটের বাকি ডেটা ফর্ম্যাট করে। আমরা নিম্নলিখিত ফর্ম্যাটিং বিকল্পগুলি ব্যবহার করব:

  • পর্যায়ক্রমে সারি পটভূমির রং ( ব্যান্ডিং নামে পরিচিত)
  • তারিখ বিন্যাস পরিবর্তন
  • সীমানা প্রয়োগ করা হচ্ছে
  • সমস্ত কলাম এবং সারি অটোসাইজ করা হচ্ছে

আপনার শীট ডেটাতে এই ফর্ম্যাটগুলি প্রয়োগ করার জন্য আপনি এখন একটি ফাংশন formatDataset() এবং একটি অতিরিক্ত সহায়ক পদ্ধতি তৈরি করবেন৷

বাস্তবায়ন

আগের মত, ডেটা ফরম্যাটিং স্বয়ংক্রিয় করতে একটি ফাংশন যোগ করুন। নিম্নলিখিত পদক্ষেপ নিন:

  1. Apps স্ক্রিপ্ট এডিটরে, আপনার স্ক্রিপ্ট প্রজেক্টের শেষে নিম্নলিখিত formatDataset() ফাংশন যোগ করুন:
/**
 * Formats the sheet data, excluding the header row and column.
 * Applies the border and banding, formats the 'release_date'
 * column, and autosizes the columns and rows.
 */
function formatDataset() {
  // Get the active sheet and data range.
  var sheet = SpreadsheetApp.getActiveSheet(); 
  var fullDataRange = sheet.getDataRange();

  // Apply row banding to the data, excluding the header
  // row and column. Only apply the banding if the range
  // doesn't already have banding set.
  var noHeadersRange = fullDataRange.offset(
    1, 1,
    fullDataRange.getNumRows() - 1,
    fullDataRange.getNumColumns() - 1);

  if (! noHeadersRange.getBandings()[0]) {
    // The range doesn't already have banding, so it's
    // safe to apply it.
    noHeadersRange.applyRowBanding(
      SpreadsheetApp.BandingTheme.LIGHT_GREY,
      false, false);
  }

  // Call a helper function to apply date formatting
  // to the column labeled 'release_date'.
  formatDates_( columnIndexOf_('release_date') );
  
  // Set a border around all the data, and resize the
  // columns and rows to fit.
  fullDataRange.setBorder(
    true, true, true, true, null, null,
    null,
    SpreadsheetApp.BorderStyle.SOLID_MEDIUM);

  sheet.autoResizeColumns(1, fullDataRange.getNumColumns());
  sheet.autoResizeRows(1, fullDataRange.getNumRows());
}
  1. আপনার স্ক্রিপ্ট প্রকল্পের শেষে, formatDataset() ফাংশনের পরে নিম্নলিখিত সহায়ক ফাংশন যোগ করুন:
/** 
 * Helper method that applies a
 * "Month Day, Year (Day of Week)" date format to the
 * indicated column in the active sheet. 
 *
 * @param {number} colIndex The index of the column
 *   to format.
 */ 
function formatDates_(colIndex) {
  // Exit if the given column index is -1, indicating
  // the column to format isn't present in the sheet.
  if (colIndex < 0)
    return; 

  // Set the date format for the date column, excluding
  // the header row.
  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.getRange(2, colIndex, sheet.getLastRow() - 1, 1)
    .setNumberFormat("mmmm dd, yyyy (dddd)");
}
  1. আপনার স্ক্রিপ্ট প্রকল্প সংরক্ষণ করুন.

কোড পূনর্বিবেচনা

আসুন এই দুটি ফাংশনের প্রতিটিতে আলাদাভাবে কোড পর্যালোচনা করি:

formatDataset()

এই ফাংশনটি পূর্ববর্তী ফরম্যাট ফাংশনগুলির অনুরূপ প্যাটার্ন অনুসরণ করে যা আপনি ইতিমধ্যে প্রয়োগ করেছেন। প্রথমত, এটি সক্রিয় শীট (শীট) এবং ডেটা পরিসীমা (পূর্ণ ডেটা রেঞ্জ) এর রেফারেন্স ধরে রাখার জন্য ভেরিয়েবল পায়।

দ্বিতীয়ত, এটি একটি পরিসর তৈরি করতে Range.offset(rowOffset, columnOffset, numRows, numColumns) noHeadersRange ব্যবহার করে যা কলাম এবং সারি শিরোনামগুলি বাদ দিয়ে শীটের সমস্ত ডেটা কভার করে। কোডটি তারপর এই নতুন পরিসরে বিদ্যমান ব্যান্ডিং আছে কিনা তা যাচাই করে ( Range.getBandings() ব্যবহার করে)। এটি প্রয়োজনীয় কারণ অ্যাপস স্ক্রিপ্ট যেখানে একটি বিদ্যমান সেখানে নতুন ব্যান্ডিং প্রয়োগ করার চেষ্টা করলে একটি ত্রুটি ছুড়ে দেয়। ব্যান্ডিং বিদ্যমান না থাকলে, ফাংশন Range.applyRowBanding(bandingTheme, showHeader, showFooter) ব্যবহার করে একটি হালকা ধূসর ব্যান্ডিং যোগ করে। অন্যথায়, ফাংশন এগিয়ে যায়।

পরবর্তী ধাপে ' release_date ' লেবেলযুক্ত কলামে তারিখগুলি ফর্ম্যাট করার জন্য formatDates_(colIndex) সহায়ক ফাংশনকে কল করা হয় (নীচে বর্ণিত)। কলামটি columnIndexOf_(colName) সহায়ক ফাংশন ব্যবহার করে নির্দিষ্ট করা হয়েছে যা আপনি আগে প্রয়োগ করেছেন।

অবশেষে, অন্য বর্ডার (আগের মতো) যোগ করে ফর্ম্যাটিং শেষ হয় এবং Sheet.autoResizeColumns(columnPosition) এবং Sheet.autoResizeColumns(columnPosition) পদ্ধতি ব্যবহার করে প্রতিটি কলাম এবং সারির স্বয়ংক্রিয়ভাবে আকার পরিবর্তন করে।

formatDates_(colIndex)

এই সহায়ক ফাংশন প্রদত্ত কলাম সূচী ব্যবহার করে একটি কলামে একটি নির্দিষ্ট তারিখ বিন্যাস প্রয়োগ করে। বিশেষ করে, এটি তারিখের মানগুলিকে "মাসের দিন, বছর (সপ্তাহের দিন)" হিসাবে ফর্ম্যাট করে।

প্রথমত, ফাংশনটি যাচাই করে যে প্রদত্ত কলাম সূচকটি বৈধ (অর্থাৎ 0 বা তার বেশি)। তা না হলে কিছু না করেই ফিরে আসে। এই চেক ত্রুটিগুলি প্রতিরোধ করে যা হতে পারে যদি, উদাহরণস্বরূপ, শীটে ' release_date ' কলাম না থাকে।

একবার কলামের সূচী যাচাই করা হলে, ফাংশনটি সেই কলামটি কভার করে (এর হেডার সারি ব্যতীত) পরিসীমা পায় এবং বিন্যাস প্রয়োগ করতে Range.setNumberFormat(numberFormat) ব্যবহার করে।

ফলাফল

আপনি নিম্নলিখিত কাজ করে আপনার ফর্ম্যাটিং ফাংশনটি দেখতে পারেন:

  1. যদি আপনি ইতিমধ্যেই না করে থাকেন, তাহলে Apps স্ক্রিপ্ট এডিটরে আপনার স্ক্রিপ্ট প্রকল্প সংরক্ষণ করুন।
  2. কুইক ফরম্যাট > ফরম্যাট ডেটাসেট মেনু আইটেমে ক্লিক করুন।

ফলাফল নিম্নলিখিত মত দেখতে হবে:

3cfedd78b3e25f3a.gif

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

7. API ডেটা আনুন এবং ফর্ম্যাট করুন৷

এখন পর্যন্ত এই কোডল্যাবে, আপনি দেখেছেন কিভাবে আপনি আপনার স্প্রেডশীট ফর্ম্যাট করার বিকল্প উপায় হিসেবে অ্যাপস স্ক্রিপ্ট ব্যবহার করতে পারেন। এরপরে আপনি কোড লিখবেন যা একটি পাবলিক API থেকে ডেটা টেনে আনে, এটি আপনার স্প্রেডশীটে সন্নিবেশ করে এবং এটিকে ফরম্যাট করে যাতে এটি পাঠযোগ্য হয়।

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

আপনার কোড প্রচুর পরিমাণে JSON ডেটা পেতে API-কে কল করবে, প্রতিক্রিয়া পার্স করবে, একটি নতুন শীটে ডেটা রাখবে এবং তারপর শীট ফর্ম্যাট করবে৷

বাস্তবায়ন

এই বিভাগে, আপনি কিছু অতিরিক্ত মেনু আইটেম যোগ করবেন। প্রতিটি মেনু আইটেম একটি র্যাপার স্ক্রিপ্ট কল করে যা আইটেম-নির্দিষ্ট ভেরিয়েবলগুলিকে প্রধান ফাংশনে (createResourceSheet_()) পাস করে। আপনি এই ফাংশন এবং তিনটি অতিরিক্ত সহায়ক ফাংশন বাস্তবায়ন করবেন। আগের মতো, হেল্পার ফাংশনগুলি টাস্কের যৌক্তিকভাবে কম্পার্টমেন্টাল অংশগুলিকে আলাদা করতে সাহায্য করে এবং কোডটিকে পাঠযোগ্য রাখতে সাহায্য করে।

নিম্নলিখিত পদক্ষেপ নিন:

  1. অ্যাপস স্ক্রিপ্ট এডিটরে, আপনার স্ক্রিপ্ট প্রোজেক্টে আপনার onOpen() ফাংশন আপডেট করুন যাতে নিম্নলিখিতগুলি মেলে:
/**
 * A special function that runs when the spreadsheet is opened
 * or reloaded, used to add a custom menu to the spreadsheet.
 */
function onOpen() {
  // Get the Ui object.
  var ui = SpreadsheetApp.getUi();

  // Create and add a named menu and its items to the menu bar.
  ui.createMenu('Quick formats')
    .addItem('Format row header', 'formatRowHeader')
    .addItem('Format column header', 'formatColumnHeader')
    .addItem('Format dataset', 'formatDataset')
    .addSeparator()
    .addSubMenu(ui.createMenu('Create character sheet')
                .addItem('Episode IV', 'createPeopleSheetIV')
                .addItem('Episode V', 'createPeopleSheetV')
                .addItem('Episode VI', 'createPeopleSheetVI')
                )
    .addToUi();
}
  1. আপনার স্ক্রিপ্ট প্রকল্প সংরক্ষণ করুন.
  2. স্ক্রিপ্ট এডিটরে, ফাংশন তালিকা থেকে onOpen নির্বাচন করুন এবং Run এ ক্লিক করুন। এটি আপনার যোগ করা নতুন বিকল্পগুলির সাথে স্প্রেডশীট মেনু পুনর্নির্মাণ করতে onOpen() এ চলে।
  3. একটি অ্যাপস স্ক্রিপ্ট ফাইল তৈরি করতে, ফাইলের পাশে একটি ফাইল যুক্ত করুন ক্লিক করুন একটি ফাইল যোগ করুন > স্ক্রিপ্ট
  4. নতুন স্ক্রিপ্টটির নাম দিন "API" এবং এন্টার টিপুন। (অ্যাপস স্ক্রিপ্ট স্বয়ংক্রিয়ভাবে স্ক্রিপ্ট ফাইলের নামের সাথে একটি .gs এক্সটেনশন যুক্ত করে।)
  5. নতুন API.gs ফাইলের কোডটি নিম্নলিখিত দিয়ে প্রতিস্থাপন করুন:
/**
 * Wrapper function that passes arguments to create a
 * resource sheet describing the characters from Episode IV.
 */
function createPeopleSheetIV() {
  createResourceSheet_('characters', 1, "IV");
}

/**
 * Wrapper function that passes arguments to create a
 * resource sheet describing the characters from Episode V.
 */
function createPeopleSheetV() {
  createResourceSheet_('characters', 2, "V");
}

/**
 * Wrapper function that passes arguments to create a
 * resource sheet describing the characters from Episode VI.
 */
function createPeopleSheetVI() {
  createResourceSheet_('characters', 3, "VI");
}

/** 
 * Creates a formatted sheet filled with user-specified
 * information from the Star Wars API. If the sheet with
 * this data exists, the sheet is overwritten with the API
 * information.
 *
 * @param {string} resourceType The type of resource.
 * @param {number} idNumber The identification number of the film.
 * @param {number} episodeNumber The Star Wars film episode number.
 *   This is only used in the sheet name.
 */
function createResourceSheet_(
    resourceType, idNumber, episodeNumber) { 
  
  // Fetch the basic film data from the API. 
  var filmData = fetchApiResourceObject_(
      "https://swapi.dev/api/films/" + idNumber);

  // Extract the API URLs for each resource so the code can
  // call the API to get more data about each individually.
  var resourceUrls = filmData[resourceType];
  
  // Fetch each resource from the API individually and push
  // them into a new object list.
  var resourceDataList = []; 
  for(var i = 0; i < resourceUrls.length; i++){
    resourceDataList.push(
      fetchApiResourceObject_(resourceUrls[i])
    ); 
  } 
  
  // Get the keys used to reference each part of data within
  // the resources. The keys are assumed to be identical for
  // each object since they're all the same resource type.
  var resourceObjectKeys = Object.keys(resourceDataList[0]);
  
  // Create the sheet with the appropriate name. It
  // automatically becomes the active sheet when it's created.
  var resourceSheet = createNewSheet_(
      "Episode " + episodeNumber + " " + resourceType);
  
  // Add the API data to the new sheet, using each object
  // key as a column header. 
  fillSheetWithData_(resourceSheet, resourceObjectKeys, resourceDataList);
  
  // Format the new sheet using the same styles the
  // 'Quick Formats' menu items apply. These methods all
  // act on the active sheet, which is the one just created.
  formatRowHeader();
  formatColumnHeader();   
  formatDataset();

}
  1. API.gs স্ক্রিপ্ট প্রকল্প ফাইলের শেষে নিম্নলিখিত সহায়ক ফাংশন যোগ করুন:
/** 
 * Helper function that retrieves a JSON object containing a
 * response from a public API.
 *
 * @param {string} url The URL of the API object being fetched.
 * @return {object} resourceObject The JSON object fetched
 *   from the URL request to the API.
 */
function fetchApiResourceObject_(url) {
  // Make request to API and get response.
  var response =
    UrlFetchApp.fetch(url, {'muteHttpExceptions': true});
  
  // Parse and return the response as a JSON object.
  var json = response.getContentText();
  var responseObject = JSON.parse(json); 
  return responseObject; 
}

/** 
 * Helper function that creates a sheet or returns an existing
 * sheet with the same name.
 *
 * @param {string} name The name of the sheet.
 * @return {object} The created or existing sheet
 *   of the same name. This sheet becomes active.
 */ 
function createNewSheet_(name) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  
  // Returns an existing sheet if it has the specified
  // name. Activates the sheet before returning.
  var sheet = ss.getSheetByName(name);
  if (sheet) {
    return sheet.activate();
  }
  
  // Otherwise it makes a sheet, set its name, and returns it.
  // New sheets created this way automatically become the active
  // sheet.
  sheet = ss.insertSheet(name); 
  return sheet; 
}

/** 
 * Helper function that adds API data to the sheet.
 * Each object key is used as a column header in the new sheet.
 *
 * @param {object} resourceSheet The sheet object being modified.
 * @param {object} objectKeys The list of keys for the resources.
 * @param {object} resourceDataList The list of API
 *   resource objects containing data to add to the sheet.
 */
function fillSheetWithData_(
    resourceSheet, objectKeys, resourceDataList) {
  // Set the dimensions of the data range being added to the sheet.
  var numRows = resourceDataList.length;
  var numColumns = objectKeys.length;
  
  // Get the resource range and associated values array. Add an
  // extra row for the column headers.
  var resourceRange =
    resourceSheet.getRange(1, 1, numRows + 1, numColumns);
  var resourceValues = resourceRange.getValues(); 
  
  // Loop over each key value and resource, extracting data to
  // place in the 2D resourceValues array.
  for (var column = 0; column < numColumns; column++) {

    // Set the column header.
    var columnHeader = objectKeys[column];
    resourceValues[0][column] = columnHeader;
    
    // Read and set each row in this column.
    for (var row = 1; row < numRows + 1; row++) {
      var resource = resourceDataList[row - 1];
      var value = resource[columnHeader];
      resourceValues[row][column] = value;
    }
  }
  
  // Remove any existing data in the sheet and set the new values.
  resourceSheet.clear()
  resourceRange.setValues(resourceValues);
}
  1. আপনার স্ক্রিপ্ট প্রকল্প সংরক্ষণ করুন.

কোড পূনর্বিবেচনা

আপনি শুধু কোড অনেক যোগ করেছেন. আসুন প্রতিটি ফাংশন কীভাবে কাজ করে তা বোঝার জন্য পৃথকভাবে দেখি:

onOpen()

এখানে আপনি আপনার Quick formats মেনুতে কয়েকটি মেনু আইটেম যোগ করেছেন। আপনি একটি বিভাজক লাইন সেট করেছেন এবং তারপরে তিনটি নতুন আইটেম সহ একটি নেস্টেড মেনু কাঠামো তৈরি করতে Menu.addSubMenu(menu) পদ্ধতি ব্যবহার করেছেন। নতুন আইটেম Menu.addItem(caption, functionName) পদ্ধতিতে যোগ করা হয়।

মোড়ক ফাংশন

যোগ করা মেনু আইটেমগুলি একই রকম কিছু করছে: তারা SWAPI থেকে টানা ডেটা সহ একটি শীট তৈরি করার চেষ্টা করছে। শুধুমাত্র পার্থক্য হল তারা প্রত্যেকে একটি ভিন্ন ফিল্মে ফোকাস করছে।

শীট তৈরি করার জন্য একটি একক ফাংশন লিখতে সুবিধাজনক হবে এবং কোন ফিল্ম ব্যবহার করতে হবে তা নির্ধারণ করতে ফাংশনটিকে একটি প্যারামিটার গ্রহণ করতে হবে। যাইহোক, Menu.addItem(caption, functionName) পদ্ধতি আপনাকে মেনু দ্বারা কল করার সময় এটিতে প্যারামিটার পাস করতে দেয় না। সুতরাং, আপনি কিভাবে একই কোড তিনবার লেখা এড়াবেন?

উত্তর হল wrapper ফাংশন . এইগুলি হালকা ওজনের ফাংশন যা আপনি অবিলম্বে নির্দিষ্ট পরামিতি সেট সহ অন্য ফাংশন কল করতে পারেন।

এখানে, কোডটি তিনটি র্যাপার ফাংশন ব্যবহার করে: createPeopleSheetIV() , createPeopleSheetV() , এবং createPeopleSheetVI() । মেনু আইটেম এই ফাংশন লিঙ্ক করা হয়. যখন একটি মেনু আইটেম ক্লিক করা হয়, র‍্যাপার ফাংশনটি কার্যকর করে এবং অবিলম্বে মেনু আইটেমের জন্য উপযুক্ত পরামিতিগুলি বরাবর পাস করে মেইন শীট বিল্ডার ফাংশন createResourceSheet_(resourceType, idNumber, episodeNumber) কল করে। এই ক্ষেত্রে, এর অর্থ হল শীট বিল্ডার ফাংশনকে স্টার ওয়ার্স চলচ্চিত্রগুলির একটি থেকে প্রধান চরিত্রের ডেটা দিয়ে ভরা একটি শীট তৈরি করতে বলা।

createResourceSheet_(resourceType, idNumber, episodeNumber)

এটি এই অনুশীলনের জন্য প্রধান শীট নির্মাতা ফাংশন। কিছু হেল্পার ফাংশনের সহায়তায়, এটি API ডেটা পায়, এটি পার্স করে, একটি শীট তৈরি করে, শীটে API ডেটা লিখে এবং তারপরে আপনি পূর্ববর্তী বিভাগগুলিতে তৈরি করা ফাংশনগুলি ব্যবহার করে শীটটিকে ফর্ম্যাট করে৷ আসুন বিস্তারিত পর্যালোচনা করা যাক:

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

এরপর, কোডটি resourceUrls-এ প্রতিটি resourceUrls URL-এর জন্য API-কে কল করতে বারবার fetchApiResourceObject_(url) ব্যবহার করে। ফলাফল resourceDataList অ্যারে সংরক্ষণ করা হয়. এই অ্যারের প্রতিটি উপাদান একটি বস্তু যা ফিল্ম থেকে একটি ভিন্ন চরিত্র বর্ণনা করে।

রিসোর্স ডেটা অবজেক্টের বেশ কয়েকটি সাধারণ কী রয়েছে যা সেই অক্ষর সম্পর্কে তথ্য ম্যাপ করে। উদাহরণস্বরূপ, কী ' name ' ফিল্মের চরিত্রের নামের সাথে মানচিত্র। আমরা অনুমান করি যে প্রতিটি রিসোর্স ডেটা অবজেক্টের কীগুলি সবই অভিন্ন, যেহেতু সেগুলি সাধারণ অবজেক্ট স্ট্রাকচার ব্যবহার করার জন্য। কীগুলির তালিকা পরে প্রয়োজন হয়, তাই কোডটি JavaScript Object.keys() পদ্ধতি ব্যবহার করে resourceObjectKeys এ কী তালিকা সংরক্ষণ করে।

এরপরে, বিল্ডার ফাংশনটি শীট তৈরি করতে createNewSheet_(name) সহায়ক ফাংশনকে কল করে যেখানে নতুন ডেটা স্থাপন করা হবে। এই সহায়ক ফাংশন কল করা নতুন শীট সক্রিয় করে।

শীটটি তৈরি হওয়ার পরে, শীটে সমস্ত API ডেটা যোগ করতে সহায়ক ফাংশন fillSheetWithData_(resourceSheet, objectKeys, resourceDataList) বলা হয়।

অবশেষে, আপনি পূর্বে তৈরি করা সমস্ত ফর্ম্যাটিং ফাংশনগুলিকে নতুন ডেটাতে একই ফর্ম্যাটিং নিয়ম প্রয়োগ করতে বলা হয়। যেহেতু নতুন শীটটি সক্রিয়, কোডটি পরিবর্তন ছাড়াই এই ফাংশনগুলি পুনরায় ব্যবহার করতে পারে৷

fetchApiResourceObject_(url)

এই হেল্পার ফাংশনটি fetchBookData_(ISBN) হেল্পার ফাংশনের অনুরূপ যা পূর্ববর্তী কোডল্যাবে ডেটার সাথে কাজ করে । এটি প্রদত্ত URLটি নেয় এবং একটি প্রতিক্রিয়া পেতে UrlFetchApp.fetch(url, params) পদ্ধতি ব্যবহার করে। প্রতিক্রিয়াটি তারপর HTTPResponse.getContextText() এবং JavaScript JSON.parse(json) পদ্ধতি ব্যবহার করে JSON অবজেক্টে পার্স করা হয়। ফলস্বরূপ JSON অবজেক্টটি ফেরত দেওয়া হয়।

createNewSheet_(name)

এই সহায়ক ফাংশন মোটামুটি সহজ. প্রদত্ত নামের একটি শীট স্প্রেডশীটে বিদ্যমান কিনা তা প্রথমে যাচাই করে। যদি এটি হয়, ফাংশনটি শীট সক্রিয় করে এবং এটি ফেরত দেয়।

শীটটি বিদ্যমান না থাকলে, ফাংশনটি Spreadsheet.insertSheet(sheetName) দিয়ে এটি তৈরি করে, এটি সক্রিয় করে এবং নতুন শীটটি ফেরত দেয়।

fillSheetWithData_(resourceSheet, objectKeys, resourceDataList)

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

প্রথমত, ফাংশনটি নতুন API ডেটা উপস্থাপন করার জন্য প্রয়োজনীয় সারি এবং কলামের সংখ্যা গণনা করে। এটি যথাক্রমে সম্পদ এবং কী তালিকার আকার। ফাংশন তারপর একটি আউটপুট পরিসীমা ( resourceRange ) সংজ্ঞায়িত করে যেখানে ডেটা স্থাপন করা হবে, কলাম শিরোনাম ধরে রাখতে একটি অতিরিক্ত সারি যোগ করে। পরিবর্তনশীল resourceValues resourceRange থেকে বের করা একটি 2D মান অ্যারে ধারণ করে।

ফাংশন তারপর অবজেক্টকি তালিকার প্রতিটি অবজেক্ট objectKeys লুপ করে। কীটি কলাম শিরোনাম হিসাবে সেট করা হয়, এবং তারপর একটি দ্বিতীয় লুপ প্রতিটি সম্পদ বস্তুর মধ্য দিয়ে যায়। প্রতিটি (সারি, কলাম) জোড়ার জন্য, সংশ্লিষ্ট API তথ্য resourceValues[row][column] উপাদানে অনুলিপি করা হয়।

resourceValues ​​পূরণ করার পরে, পূর্ববর্তী মেনু আইটেম ক্লিকের ডেটা Sheet.clear() ব্যবহার করে গন্তব্য পত্রকটি সাফ করা হয়। অবশেষে, নতুন মানগুলি শীটে লেখা হয়।

ফলাফল

আপনি নিম্নলিখিত কাজ করে আপনার কাজের ফলাফল দেখতে পারেন:

  1. যদি আপনি ইতিমধ্যেই না করে থাকেন, তাহলে Apps স্ক্রিপ্ট এডিটরে আপনার স্ক্রিপ্ট প্রকল্প সংরক্ষণ করুন।
  2. Quick formats > Create character sheet > Episode IV মেনু আইটেমে ক্লিক করুন।

ফলাফল নিম্নলিখিত মত দেখতে হবে:

d9c472ab518d8cef.gif

আপনি এখন পত্রকগুলিতে ডেটা আমদানি করতে এবং স্বয়ংক্রিয়ভাবে এটি ফর্ম্যাট করতে কোড লিখেছেন৷

8. উপসংহার

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

আপনি এই কোডল্যাব সহায়ক খুঁজে পেয়েছেন?

হ্যাঁ না

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

  • অ্যাপস স্ক্রিপ্টের সাহায্যে বিভিন্ন পত্রক বিন্যাস অপারেশন কীভাবে প্রয়োগ করবেন।
  • কিভাবে onOpen() ফাংশন দিয়ে সাবমেনু তৈরি করবেন।
  • অ্যাপস স্ক্রিপ্টের মাধ্যমে ডেটার একটি নতুন শীটে JSON অবজেক্টের একটি আনা তালিকা কীভাবে ফর্ম্যাট করবেন।

এরপর কি

এই প্লেলিস্টের পরবর্তী কোডল্যাব আপনাকে দেখায় কিভাবে একটি চার্টে ডেটা ভিজ্যুয়ালাইজ করতে এবং Google স্লাইড উপস্থাপনায় চার্ট রপ্তানি করতে অ্যাপস স্ক্রিপ্ট ব্যবহার করতে হয়।

চার্টে পরবর্তী কোডল্যাব খুঁজুন এবং স্লাইডে ডেটা উপস্থাপন করুন