1. परिचय
Google Sheets के साथ Apps Script की बुनियादी बातों के बारे में जानने के लिए, कोडलैब प्लेलिस्ट के चौथे हिस्से में आपका स्वागत है.
इस कोडलैब को पूरा करके, यह सीखा जा सकता है कि Apps Script में स्प्रेडशीट के डेटा को कैसे फ़ॉर्मैट किया जाता है. साथ ही, सार्वजनिक एपीआई से फ़ॉर्मैट किया गया डेटा फ़ेच करके, व्यवस्थित स्प्रेडशीट बनाने के लिए फ़ंक्शन कैसे लिखे जाते हैं.
आपको क्या सीखने को मिलेगा
- Apps Script में, Google Sheets की फ़ॉर्मैटिंग से जुड़ी अलग-अलग कार्रवाइयां करने का तरीका.
- Apps Script की मदद से, JSON ऑब्जेक्ट और उनके एट्रिब्यूट की सूची को व्यवस्थित डेटा शीट में बदलने का तरीका.
शुरू करने से पहले
यह Google Sheets के साथ Apps Script की बुनियादी बातों के बारे में जानकारी देने वाली प्लेलिस्ट का चौथा कोडलैब है. इस कोडलैब को शुरू करने से पहले, पिछले कोडलैब पूरे कर लें:
आपको किन चीज़ों की ज़रूरत होगी
- इस प्लेलिस्ट के पिछले कोडलैब में बताए गए Apps Script के बुनियादी विषयों की जानकारी.
- Apps Script एडिटर के बारे में बुनियादी जानकारी
- Google Sheets के बारे में बुनियादी जानकारी
- Sheets के A1 नोटेशन को पढ़ने की सुविधा
- JavaScript और इसकी
String
क्लास के बारे में बुनियादी जानकारी
2. सेट अप करें
आगे बढ़ने से पहले, आपके पास कुछ डेटा वाली स्प्रेडशीट होनी चाहिए. पहले की तरह, हमने एक डेटा शीट दी है. इसे कॉपी करके, इन एक्सरसाइज़ को पूरा किया जा सकता है. यह तरीका अपनाएं:
- डेटा शीट कॉपी करने के लिए, इस लिंक पर क्लिक करें. इसके बाद, कॉपी बनाएं पर क्लिक करें. नई स्प्रेडशीट को आपके Google Drive फ़ोल्डर में रखा जाता है. इसका नाम "डेटा फ़ॉर्मैटिंग की कॉपी" होता है.
- स्प्रेडशीट के टाइटल पर क्लिक करें और उसे "डेटा फ़ॉर्मैटिंग की कॉपी" से बदलकर "डेटा फ़ॉर्मैटिंग" करें. आपकी शीट ऐसी दिखनी चाहिए. इसमें Star Wars की पहली तीन फ़िल्मों के बारे में कुछ बुनियादी जानकारी होनी चाहिए:
- स्क्रिप्ट एडिटर खोलने के लिए, एक्सटेंशन > Apps Script को चुनें.
- Apps Script प्रोजेक्ट के टाइटल पर क्लिक करें और इसे "Untitled project" से बदलकर "Data Formatting" करें. टाइटल में किए गए बदलाव को सेव करने के लिए, नाम बदलें पर क्लिक करें.
इस स्प्रेडशीट और प्रोजेक्ट की मदद से, कोडलैब शुरू किया जा सकता है. Apps Script में बुनियादी फ़ॉर्मैटिंग के बारे में जानने के लिए, अगले सेक्शन पर जाएं.
3. कस्टम मेन्यू बनाना
Apps Script में, अपनी शीट में फ़ॉर्मैटिंग के कई सामान्य तरीके लागू किए जा सकते हैं. यहां दिए गए अभ्यास में, डेटा को फ़ॉर्मैट करने के कुछ तरीके बताए गए हैं. फ़ॉर्मैटिंग से जुड़ी कार्रवाइयों को कंट्रोल करने के लिए, चलिए एक कस्टम मेन्यू बनाते हैं. इसमें वे आइटम शामिल होंगे जिनकी आपको ज़रूरत होगी. कस्टम मेन्यू बनाने की प्रोसेस के बारे में, डेटा के साथ काम करना कोडलैब में बताया गया था. हालांकि, हम यहां इसे फिर से दोहराएंगे.
लागू करना
आइए, पसंद के मुताबिक मेन्यू बनाते हैं.
- Apps Script एडिटर में, अपने स्क्रिप्ट प्रोजेक्ट के कोड को इससे बदलें:
/**
* 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();
}
- अपने स्क्रिप्ट प्रोजेक्ट को सेव करें.
- स्क्रिप्ट एडिटर में, फ़ंक्शन की सूची से
onOpen
चुनें और चलाएं पर क्लिक करें. इससे स्प्रेडशीट मेन्यू को फिर से बनाने के लिए,onOpen()
चलता है. इसलिए, आपको स्प्रेडशीट को फिर से लोड करने की ज़रूरत नहीं होती.
कोड की समीक्षा
आइए, इस कोड की समीक्षा करके समझते हैं कि यह कैसे काम करता है. onOpen()
में, पहली लाइन में getUi()
तरीके का इस्तेमाल करके, Ui
ऑब्जेक्ट को हासिल किया जाता है. यह ऑब्जेक्ट, उस ऐक्टिव स्प्रेडशीट के यूज़र इंटरफ़ेस को दिखाता है जिससे यह स्क्रिप्ट जुड़ी हुई है.
अगली लाइनों में, एक मेन्यू (Quick formats
) बनाया गया है. साथ ही, मेन्यू में मेन्यू आइटम (Format row header
, Format column header
, और Format dataset
) जोड़े गए हैं. इसके बाद, मेन्यू को स्प्रेडशीट के इंटरफ़ेस में जोड़ा गया है. ऐसा करने के लिए, क्रम से createMenu(caption)
, addItem(caption, functionName)
, और addToUi()
तरीकों का इस्तेमाल किया जाता है.
addItem(caption, functionName)
तरीके से, मेन्यू आइटम के लेबल और Apps Script फ़ंक्शन के बीच कनेक्शन बनाया जाता है. जब मेन्यू आइटम चुना जाता है, तब यह फ़ंक्शन काम करता है. उदाहरण के लिए, Format row header
मेन्यू आइटम चुनने पर, Sheets formatRowHeader()
फ़ंक्शन को चलाने की कोशिश करता है. हालांकि, यह फ़ंक्शन अभी मौजूद नहीं है.
नतीजे
अपनी स्प्रेडशीट में, Quick formats
मेन्यू पर क्लिक करके, मेन्यू के नए आइटम देखें:
इन आइटम पर क्लिक करने से गड़बड़ी होती है, क्योंकि आपने इनसे जुड़े फ़ंक्शन लागू नहीं किए हैं. इसलिए, आइए अब हम ऐसा करते हैं.
4. हेडर वाली लाइन को फ़ॉर्मैट करना
स्प्रेडशीट में मौजूद डेटासेट में अक्सर हेडर वाली लाइनें होती हैं. इनसे हर कॉलम में मौजूद डेटा की पहचान की जाती है. हेडर वाली लाइनों को फ़ॉर्मैट करना अच्छा होता है, ताकि वे स्प्रेडशीट में मौजूद बाकी डेटा से अलग दिखें.
पहले कोडलैब में, आपने अपने हेडर के लिए एक मैक्रो बनाया था और उसके कोड में बदलाव किया था. यहां, Apps Script का इस्तेमाल करके हेडर वाली लाइन को शुरू से फ़ॉर्मैट किया जाएगा. हेडर वाली जो लाइन बनाई जाएगी उसमें हेडर टेक्स्ट को बोल्ड किया जाएगा, बैकग्राउंड का रंग गहरा नीला-हरा होगा, टेक्स्ट का रंग सफ़ेद होगा, और कुछ सॉलिड बॉर्डरलाइन जोड़ी जाएंगी.
लागू करना
फ़ॉर्मैटिंग ऑपरेशन लागू करने के लिए, आपको स्प्रेडशीट सेवा के उन्हीं तरीकों का इस्तेमाल करना होगा जिनका इस्तेमाल आपने पहले किया था. हालांकि, अब आपको सेवा के कुछ फ़ॉर्मैटिंग तरीकों का भी इस्तेमाल करना होगा. यह तरीका अपनाएं:
- Apps Script एडिटर में, अपनी स्क्रिप्ट प्रोजेक्ट के आखिर में यह फ़ंक्शन जोड़ें:
/**
* 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);
}
- अपने स्क्रिप्ट प्रोजेक्ट को सेव करें.
कोड की समीक्षा
फ़ॉर्मैटिंग से जुड़े कई टास्क की तरह, इसे लागू करने के लिए Apps Script कोड का इस्तेमाल करना आसान है. पहली दो लाइनों में, मौजूदा ऐक्टिव शीट (sheet
) और शीट की सबसे ऊपर वाली लाइन (headerRange)
) का रेफ़रंस पाने के लिए, उन तरीकों का इस्तेमाल किया गया है जिन्हें आपने पहले देखा है. Sheet.getRange(row, column, numRows, numColumns)
तरीके से सबसे ऊपर वाली लाइन के बारे में पता चलता है. इसमें सिर्फ़ वे कॉलम शामिल होते हैं जिनमें डेटा मौजूद होता है. Sheet.getLastColumn()
तरीके से, उस आखिरी कॉलम का इंडेक्स मिलता है जिसमें शीट में डेटा मौजूद है. हमारे उदाहरण में, यह कॉलम E (url) है.
बाकी कोड, Range
के अलग-अलग तरीकों को कॉल करता है, ताकि headerRange
की सभी सेल में फ़ॉर्मैटिंग के विकल्प लागू किए जा सकें. कोड को आसानी से पढ़ने के लिए, हम मेथड चेनिंग का इस्तेमाल करते हैं, ताकि फ़ॉर्मैटिंग के हर तरीके को एक के बाद एक कॉल किया जा सके:
Range.setFontWeight(fontWeight)
का इस्तेमाल, फ़ॉन्ट को बोल्ड करने के लिए किया जाता है.Range.setFontColor(color)
का इस्तेमाल, फ़ॉन्ट के रंग को सफ़ेद पर सेट करने के लिए किया जाता है.Range.setBackground(color)
का इस्तेमाल, बैकग्राउंड के रंग को गहरे नीले-हरे रंग पर सेट करने के लिए किया जाता है.setBorder(top, left, bottom, right, vertical, horizontal, color, style)
से, रेंज की सेल के चारों ओर काले रंग का बॉर्डर बन जाता है.
आखिरी तरीके में कई पैरामीटर होते हैं. इसलिए, आइए देखते हैं कि हर पैरामीटर क्या करता है. यहां पहले चार पैरामीटर (सभी true
पर सेट हैं) से Apps Script को पता चलता है कि बॉर्डर को रेंज के ऊपर, नीचे, बाईं ओर, और दाईं ओर जोड़ा जाना चाहिए. पांचवें और छठे पैरामीटर (null
और null
) से Apps Script को यह निर्देश मिलता है कि वह चुनी गई रेंज में किसी भी बॉर्डर लाइन में बदलाव न करे. सातवां पैरामीटर (null
) बताता है कि बॉर्डर का रंग डिफ़ॉल्ट रूप से काला होना चाहिए. आखिर में, आखिरी पैरामीटर यह तय करता है कि किस तरह की बॉर्डर स्टाइल का इस्तेमाल करना है. यह SpreadsheetApp.BorderStyle
से मिले विकल्पों में से चुना जाता है.
नतीजे
फ़ॉर्मैटिंग फ़ंक्शन को काम करते हुए देखने के लिए, यह तरीका अपनाएं:
- अगर आपने अब तक ऐसा नहीं किया है, तो Apps Script एडिटर में अपना स्क्रिप्ट प्रोजेक्ट सेव करें.
- क्विक फ़ॉर्मैट > लाइन के हेडर को फ़ॉर्मैट करें मेन्यू आइटम पर क्लिक करें.
नतीजे कुछ इस तरह दिखने चाहिए:
अब आपने फ़ॉर्मैटिंग के टास्क को अपने-आप होने की सुविधा के साथ जोड़ दिया है. अगले सेक्शन में, कॉलम हेडर के लिए अलग फ़ॉर्मैट स्टाइल बनाने के लिए, इसी तकनीक का इस्तेमाल किया गया है.
5. कॉलम हेडर को फ़ॉर्मैट करना
अगर आपके पास पसंद के मुताबिक लाइन का हेडर बनाने का विकल्प है, तो आपके पास कॉलम का हेडर बनाने का विकल्प भी होगा. कॉलम हेडर की मदद से, कुछ डेटासेट को आसानी से समझा जा सकता है. उदाहरण के लिए, इस स्प्रेडशीट में मौजूद टाइटल कॉलम को, फ़ॉर्मैट के इन विकल्पों की मदद से बेहतर बनाया जा सकता है:
- टेक्स्ट को बोल्ड करना
- टेक्स्ट को इटैलिक करना
- सेल बॉर्डर जोड़ना
- url कॉलम के कॉन्टेंट का इस्तेमाल करके, हाइपरलिंक डालना. इन हाइपरलिंक को जोड़ने के बाद, शीट को बेहतर बनाने के लिए यूआरएल कॉलम को हटाया जा सकता है.
इसके बाद, आपको शीट के पहले कॉलम में इन बदलावों को लागू करने के लिए, formatColumnHeader()
फ़ंक्शन लागू करना होगा. कोड को थोड़ा आसान बनाने के लिए, दो हेल्पर फ़ंक्शन भी लागू किए जाएंगे.
लागू करना
पहले की तरह, आपको कॉलम हेडर की फ़ॉर्मैटिंग को अपने-आप लागू करने के लिए एक फ़ंक्शन जोड़ना होगा. यह तरीका अपनाएं:
- Apps Script एडिटर में, अपने स्क्रिप्ट प्रोजेक्ट के आखिर में यह
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);
}
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;
}
- अपने स्क्रिप्ट प्रोजेक्ट को सेव करें.
कोड की समीक्षा
आइए, इन तीनों फ़ंक्शन में मौजूद कोड की अलग-अलग समीक्षा करें:
formatColumnHeader()
जैसा कि आपको शायद पता होगा, इस फ़ंक्शन की शुरुआती कुछ लाइनें, उन वैरिएबल को सेट करती हैं जो उस शीट और रेंज को रेफ़रंस करती हैं जिसमें हमारी दिलचस्पी है:
- ऐक्टिव शीट,
sheet
में सेव है. - कॉलम हेडर में मौजूद पंक्तियों की संख्या का हिसाब लगाया जाता है और उसे
numRows
में सेव किया जाता है. यहां कोड में से एक घटाया गया है, ताकि लाइन की गिनती में कॉलम हेडर शामिल न हो:title
. - कॉलम हेडर वाली रेंज को
columnHeaderRange
में सेव किया जाता है.
इसके बाद, कोड कॉलम हेडर की रेंज पर बॉर्डर और बोल्ड फ़ॉर्मैटिंग लागू करता है. यह ठीक वैसा ही है जैसा formatRowHeader()
में दिखाया गया है. यहां, टेक्स्ट को इटैलिक करने के लिए Range.setFontStyle(fontStyle)
का भी इस्तेमाल किया गया है.
हेडर कॉलम में हाइपरलिंक जोड़ने का काम ज़्यादा मुश्किल होता है. इसलिए, formatColumnHeader()
इस काम को पूरा करने के लिए hyperlinkColumnHeaders_(headerRange, numRows)
को कॉल करता है. इससे कोड को व्यवस्थित और पढ़ने में आसान बनाने में मदद मिलती है.
hyperlinkColumnHeaders_(headerRange, numRows)
यह हेल्पर फ़ंक्शन, सबसे पहले हेडर (मान लिया गया है कि यह इंडेक्स 1 है) और url
कॉलम के कॉलम इंडेक्स की पहचान करता है. यह यूआरएल कॉलम इंडेक्स पाने के लिए, columnIndexOf_('url')
को कॉल करता है. अगर url
कॉलम नहीं मिलता है, तो यह तरीका बिना किसी डेटा में बदलाव किए बंद हो जाता है.
इस फ़ंक्शन को एक नई रेंज (urlRange
) मिलती है. इसमें हेडर कॉलम की लाइनों से जुड़े यूआरएल शामिल होते हैं. ऐसा Range.offset(rowOffset, columnOffset)
तरीके से किया जाता है. इससे यह पक्का होता है कि दोनों रेंज का साइज़ एक जैसा होगा. इसके बाद, headerColumn
और url
कॉलम में मौजूद वैल्यू को वापस पाया जाता है (headerValues
और urlValues
).
इसके बाद, फ़ंक्शन हर कॉलम हेडर सेल की वैल्यू पर लूप करता है और उसे हेडर और url
कॉलम के कॉन्टेंट से बनाए गए =HYPERLINK()
Sheets फ़ॉर्मूले से बदल देता है. इसके बाद, बदले गए हेडर की वैल्यू को Range.setValues(values)
का इस्तेमाल करके, शीट में डाला जाता है.
आखिर में, शीट को साफ़ रखने और काम की जानकारी को हटाने के लिए, Sheet.deleteColumn(columnPosition)
को कॉल किया जाता है, ताकि url
कॉलम को हटाया जा सके.
columnIndexOf_(colName)
यह हेल्पर फ़ंक्शन, सिर्फ़ एक सामान्य यूटिलिटी फ़ंक्शन है. यह शीट की पहली लाइन में किसी खास नाम को खोजता है. पहली तीन लाइनों में, उन तरीकों का इस्तेमाल किया गया है जिनके बारे में आपको पहले ही बताया जा चुका है. इनसे स्प्रेडशीट की पहली लाइन से कॉलम हेडर के नामों की सूची मिलती है. ये नाम, variable columnNames में सेव किए जाते हैं.
इसके बाद, फ़ंक्शन हर नाम की समीक्षा क्रम से करता है. अगर इसे खोजे जा रहे नाम से मैच करने वाला कोई नाम मिलता है, तो यह रुक जाता है और कॉलम का इंडेक्स दिखाता है. अगर नाम की सूची के आखिर तक नाम नहीं मिलता है, तो यह -1 दिखाता है. इससे पता चलता है कि नाम नहीं मिला.
नतीजे
फ़ॉर्मैटिंग फ़ंक्शन को काम करते हुए देखने के लिए, यह तरीका अपनाएं:
- अगर आपने अब तक ऐसा नहीं किया है, तो Apps Script एडिटर में अपना स्क्रिप्ट प्रोजेक्ट सेव करें.
- क्विक फ़ॉर्मैट > कॉलम हेडर फ़ॉर्मैट करें मेन्यू आइटम पर क्लिक करें.
नतीजे कुछ इस तरह दिखने चाहिए:
आपने अब फ़ॉर्मैटिंग से जुड़े एक और टास्क को अपने-आप होने की सुविधा के साथ सेट कर दिया है. कॉलम और लाइन के हेडर फ़ॉर्मैट करने के बाद, अगले सेक्शन में डेटा को फ़ॉर्मैट करने का तरीका बताया गया है.
6. अपने डेटासेट को फ़ॉर्मैट करना
अब आपके पास हेडर हैं. इसलिए, आइए एक ऐसा फ़ंक्शन बनाते हैं जो आपकी शीट में मौजूद बाकी डेटा को फ़ॉर्मैट करे. हम फ़ॉर्मैटिंग के इन विकल्पों का इस्तेमाल करेंगे:
- लाइनों के बैकग्राउंड में अलग-अलग रंग (इसे बैंडिंग कहा जाता है)
- तारीख के फ़ॉर्मैट बदलना
- बॉर्डर लागू करना
- सभी कॉलम और लाइनों का साइज़ अपने-आप बदलना
अब आपको अपनी शीट के डेटा पर इन फ़ॉर्मैट को लागू करने के लिए, formatDataset()
फ़ंक्शन और एक अतिरिक्त हेल्पर तरीका बनाना होगा.
लागू करना
डेटा फ़ॉर्मैटिंग को अपने-आप होने की सुविधा के लिए, पहले की तरह फ़ंक्शन जोड़ें. यह तरीका अपनाएं:
- Apps Script एडिटर में, अपने स्क्रिप्ट प्रोजेक्ट के आखिर में यह
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());
}
- अपनी स्क्रिप्ट प्रोजेक्ट के आखिर में,
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)");
}
- अपने स्क्रिप्ट प्रोजेक्ट को सेव करें.
कोड की समीक्षा
आइए, इन दोनों फ़ंक्शन में मौजूद कोड की अलग-अलग समीक्षा करें:
formatDataset()
यह फ़ंक्शन, पिछले फ़ॉर्मैट फ़ंक्शन की तरह ही काम करता है. सबसे पहले, यह वैरिएबल को ऐक्टिव शीट (sheet) और डेटा रेंज (fullDataRange) के रेफ़रंस को होल्ड करने के लिए मिलता है.
दूसरा, यह Range.offset(rowOffset, columnOffset, numRows, numColumns)
तरीके का इस्तेमाल करके, एक रेंज (noHeadersRange
) बनाता है. इसमें कॉलम और लाइन के हेडर को छोड़कर, शीट का पूरा डेटा शामिल होता है. इसके बाद, कोड यह पुष्टि करता है कि इस नई रेंज में पहले से बैंडिंग मौजूद है या नहीं. इसके लिए, Range.getBandings()
का इस्तेमाल किया जाता है. यह ज़रूरी है, क्योंकि अगर पहले से बैंडिंग मौजूद होने पर नई बैंडिंग लागू करने की कोशिश की जाती है, तो Apps Script एक गड़बड़ी दिखाती है. अगर बैंडिंग मौजूद नहीं है, तो फ़ंक्शन Range.applyRowBanding(bandingTheme, showHeader, showFooter)
का इस्तेमाल करके, हल्के ग्रे रंग की बैंडिंग जोड़ता है. ऐसा न होने पर, फ़ंक्शन आगे बढ़ता है.
अगले चरण में, formatDates_(colIndex)
हेल्पर फ़ंक्शन को कॉल किया जाता है. इससे ‘release_date
' लेबल वाले कॉलम में मौजूद तारीखों को फ़ॉर्मैट किया जाता है. इसके बारे में यहां बताया गया है. कॉलम को columnIndexOf_(colName)
हेल्पर फ़ंक्शन का इस्तेमाल करके तय किया जाता है. इस फ़ंक्शन को आपने पहले लागू किया था.
आखिर में, फ़ॉर्मैटिंग पूरी करने के लिए एक और बॉर्डर जोड़ा जाता है (जैसा पहले किया गया था). साथ ही, Sheet.autoResizeColumns(columnPosition)
और Sheet.autoResizeColumns(columnPosition)
तरीकों का इस्तेमाल करके, हर कॉलम और लाइन का साइज़ अपने-आप बदल जाता है, ताकि उनमें मौजूद डेटा फ़िट हो सके.
formatDates_(colIndex)
यह हेल्पर फ़ंक्शन, दिए गए कॉलम इंडेक्स का इस्तेमाल करके, किसी कॉलम में तारीख का फ़ॉर्मैट लागू करता है. खास तौर पर, यह तारीख की वैल्यू को "महीना दिन, साल (हफ़्ते का दिन)" के तौर पर फ़ॉर्मैट करता है.
सबसे पहले, फ़ंक्शन यह पुष्टि करता है कि दिया गया कॉलम इंडेक्स मान्य है. इसका मतलब है कि यह 0 या इससे ज़्यादा है. अगर ऐसा नहीं है, तो यह बिना कुछ किए ही वापस आ जाता है. इस जांच से ऐसी गड़बड़ियों को रोका जा सकता है जो तब हो सकती हैं, जब शीट में ‘release_date
' कॉलम मौजूद न हो.
कॉलम इंडेक्स की पुष्टि हो जाने के बाद, फ़ंक्शन को उस कॉलम को कवर करने वाली रेंज मिलती है. इसमें हेडर वाली लाइन शामिल नहीं होती है. इसके बाद, फ़ॉर्मैटिंग लागू करने के लिए Range.setNumberFormat(numberFormat)
का इस्तेमाल किया जाता है.
नतीजे
फ़ॉर्मैटिंग फ़ंक्शन को काम करते हुए देखने के लिए, यह तरीका अपनाएं:
- अगर आपने अब तक ऐसा नहीं किया है, तो Apps Script एडिटर में अपना स्क्रिप्ट प्रोजेक्ट सेव करें.
- क्विक फ़ॉर्मैट > डेटासेट फ़ॉर्मैट करें मेन्यू आइटम पर क्लिक करें.
नतीजे कुछ इस तरह दिखने चाहिए:
आपने फ़ॉर्मैटिंग से जुड़े एक और टास्क को अपने-आप होने की सुविधा के साथ सेट अप कर दिया है. अब आपके पास फ़ॉर्मैटिंग के ये निर्देश उपलब्ध हैं. इसलिए, आइए अब कुछ और डेटा जोड़ते हैं, ताकि इन निर्देशों को लागू किया जा सके.
7. एपीआई से डेटा फ़ेच करना और उसे फ़ॉर्मैट करना
इस कोडलैब में अब तक, आपने देखा कि Apps Script का इस्तेमाल करके, अपनी स्प्रेडशीट को फ़ॉर्मैट करने के लिए एक विकल्प के तौर पर कैसे किया जा सकता है. इसके बाद, आपको ऐसा कोड लिखना होगा जो किसी सार्वजनिक एपीआई से डेटा को आपकी स्प्रेडशीट में डाले और उसे इस तरह से फ़ॉर्मैट करे कि उसे पढ़ा जा सके.
पिछले कोडलैब में, आपने एपीआई से डेटा पाने का तरीका सीखा था. यहां भी वही तकनीकें इस्तेमाल की जाएंगी. इस अभ्यास में, हम आपकी स्प्रेडशीट में डेटा भरने के लिए, सार्वजनिक Star Wars API (SWAPI) का इस्तेमाल करेंगे. खास तौर पर, आपको एपीआई का इस्तेमाल करके, Star Wars की ओरिजनल तीन फ़िल्मों में दिखने वाले मुख्य किरदारों के बारे में जानकारी मिलेगी.
आपका कोड, एपीआई को कॉल करके बड़ी मात्रा में JSON डेटा हासिल करेगा. इसके बाद, रिस्पॉन्स को पार्स करेगा, डेटा को नई शीट में रखेगा, और फिर शीट को फ़ॉर्मैट करेगा.
लागू करना
इस सेक्शन में, आपको मेन्यू में कुछ और आइटम जोड़ने हैं. हर मेन्यू आइटम, रैपर स्क्रिप्ट को कॉल करता है. यह स्क्रिप्ट, आइटम के हिसाब से वैरिएबल को मुख्य फ़ंक्शन (createResourceSheet_()) में पास करती है. आपको इस फ़ंक्शन और तीन अन्य हेल्पर फ़ंक्शन को लागू करना होगा. पहले की तरह, हेल्पर फ़ंक्शन, टास्क के लॉजिकल कंपार्टमेंट वाले हिस्सों को अलग करने में मदद करते हैं. साथ ही, कोड को पढ़ने लायक बनाए रखते हैं.
ये कार्रवाइयां करें:
- Apps Script एडिटर में, अपने स्क्रिप्ट प्रोजेक्ट में मौजूद
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();
}
- अपने स्क्रिप्ट प्रोजेक्ट को सेव करें.
- स्क्रिप्ट एडिटर में, फ़ंक्शन की सूची से
onOpen
चुनें और चलाएं पर क्लिक करें. इससेonOpen()
फ़ंक्शन चलता है. यह फ़ंक्शन, स्प्रेडशीट मेन्यू को फिर से बनाता है. इसमें वे नए विकल्प शामिल होते हैं जिन्हें आपने जोड़ा है. - Apps Script फ़ाइल बनाने के लिए, फ़ाइलें के बगल में मौजूद, फ़ाइल जोड़ें
> स्क्रिप्ट पर क्लिक करें.
- नई स्क्रिप्ट का नाम "API" डालें और Enter दबाएं. (Apps Script, स्क्रिप्ट फ़ाइल के नाम में
.gs
एक्सटेंशन अपने-आप जोड़ देता है.) - नई 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();
}
- 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);
}
- अपने स्क्रिप्ट प्रोजेक्ट को सेव करें.
कोड की समीक्षा
आपने अभी-अभी बहुत सारा कोड जोड़ा है. आइए, हर फ़ंक्शन के बारे में अलग-अलग जानते हैं, ताकि यह समझा जा सके कि वे कैसे काम करते हैं:
onOpen()
यहां आपने Quick formats
मेन्यू में कुछ आइटम जोड़े हैं. आपने सेपरेटर लाइन सेट की है. इसके बाद, तीन नए आइटम के साथ नेस्ट किया गया मेन्यू स्ट्रक्चर बनाने के लिए, Menu.addSubMenu(menu)
तरीके का इस्तेमाल किया है. नए आइटम, Menu.addItem(caption, functionName)
तरीके से जोड़े जाते हैं.
रैपर फ़ंक्शन
जोड़े गए सभी मेन्यू आइटम एक जैसा काम करते हैं: वे SWAPI से डेटा खींचकर एक शीट बनाने की कोशिश कर रहे हैं. इनमें सिर्फ़ यह अंतर है कि हर वीडियो में अलग-अलग फ़िल्मों पर फ़ोकस किया गया है.
शीट बनाने के लिए, एक फ़ंक्शन लिखना आसान होगा. साथ ही, फ़ंक्शन में एक पैरामीटर होगा, ताकि यह तय किया जा सके कि किस फ़िल्म का इस्तेमाल करना है. हालांकि, मेन्यू से कॉल किए जाने पर Menu.addItem(caption, functionName)
तरीके से पैरामीटर पास नहीं किए जा सकते. इसलिए, एक ही कोड को तीन बार लिखने से कैसे बचा जा सकता है?
इसका जवाब रैपर फ़ंक्शन है. ये हल्के फ़ंक्शन होते हैं, जिन्हें कॉल किया जा सकता है. ये तुरंत सेट किए गए खास पैरामीटर के साथ किसी दूसरे फ़ंक्शन को कॉल करते हैं.
यहां कोड में तीन रैपर फ़ंक्शन इस्तेमाल किए गए हैं: createPeopleSheetIV()
, createPeopleSheetV()
, और createPeopleSheetVI()
. मेन्यू आइटम, इन फ़ंक्शन से लिंक होते हैं. जब मेन्यू के किसी आइटम पर क्लिक किया जाता है, तो रैपर फ़ंक्शन काम करता है. इसके बाद, वह तुरंत मुख्य शीट बिल्डर फ़ंक्शन createResourceSheet_(resourceType, idNumber, episodeNumber)
को कॉल करता है. साथ ही, मेन्यू आइटम के लिए सही पैरामीटर पास करता है. इस मामले में, इसका मतलब है कि शीट बनाने वाले फ़ंक्शन से, Star Wars की किसी फ़िल्म के मुख्य किरदार का डेटा वाली शीट बनाने के लिए कहा गया है.
createResourceSheet_(resourceType, idNumber, episodeNumber)
यह इस अभ्यास के लिए, मुख्य शीट बिल्डर फ़ंक्शन है. कुछ हेल्पर फ़ंक्शन की मदद से, यह एपीआई से डेटा हासिल करता है, उसे पार्स करता है, एक शीट बनाता है, एपीआई से मिले डेटा को शीट में लिखता है, और फिर शीट को फ़ॉर्मैट करता है. इसके लिए, यह उन फ़ंक्शन का इस्तेमाल करता है जिन्हें आपने पिछले सेक्शन में बनाया था. आइए, इस बारे में ज़्यादा जानें:
सबसे पहले, यह फ़ंक्शन fetchApiResourceObject_(url)
का इस्तेमाल करके, एपीआई से फ़िल्म की बुनियादी जानकारी पाने का अनुरोध करता है. एपीआई के जवाब में, यूआरएल का एक कलेक्शन शामिल होता है. कोड इसका इस्तेमाल करके, फ़िल्मों में मौजूद खास लोगों (जिन्हें यहां संसाधन कहा जाता है) के बारे में ज़्यादा जानकारी पा सकता है. यह कोड, सभी को resourceUrls
ऐरे में इकट्ठा करता है.
इसके बाद, कोड fetchApiResourceObject_(url)
का बार-बार इस्तेमाल करके, resourceUrls
में मौजूद हर संसाधन यूआरएल के लिए एपीआई को कॉल करता है. नतीजे, resourceDataList
ऐरे में सेव किए जाते हैं. इस कलेक्शन का हर एलिमेंट एक ऑब्जेक्ट होता है, जो फ़िल्म के किसी किरदार के बारे में बताता है.
संसाधन डेटा ऑब्जेक्ट में कई सामान्य कुंजियां होती हैं, जो उस वर्ण के बारे में जानकारी से मैप होती हैं. उदाहरण के लिए, कुंजी ‘name
' फ़िल्म में किरदार के नाम से मैप होती है. हम यह मानकर चलते हैं कि हर संसाधन डेटा ऑब्जेक्ट के लिए कुंजियां एक जैसी हैं, क्योंकि इनका इस्तेमाल सामान्य ऑब्जेक्ट स्ट्रक्चर के लिए किया जाता है. कुंजियों की सूची की ज़रूरत बाद में पड़ती है. इसलिए, कोड JavaScript के Object.keys() तरीके का इस्तेमाल करके, कुंजियों की सूची को resourceObjectKeys
में सेव करता है.
इसके बाद, बिल्डर फ़ंक्शन, createNewSheet_(name)
हेल्पर फ़ंक्शन को कॉल करता है. इससे वह शीट बनती है जिसमें नया डेटा रखा जाएगा. इस हेल्पर फ़ंक्शन को कॉल करने पर, नई शीट भी चालू हो जाती है.
शीट बन जाने के बाद, हेल्पर फ़ंक्शन fillSheetWithData_(resourceSheet, objectKeys, resourceDataList)
को कॉल किया जाता है, ताकि एपीआई के सभी डेटा को शीट में जोड़ा जा सके.
आखिर में, पहले बनाए गए सभी फ़ॉर्मैटिंग फ़ंक्शन को कॉल किया जाता है, ताकि नए डेटा पर फ़ॉर्मैटिंग के एक जैसे नियम लागू किए जा सकें. नई शीट चालू होने की वजह से, कोड में बिना किसी बदलाव के इन फ़ंक्शन का फिर से इस्तेमाल किया जा सकता है.
fetchApiResourceObject_(url)
यह हेल्पर फ़ंक्शन, पिछले कोडलैब डेटा के साथ काम करना में इस्तेमाल किए गए fetchBookData_(ISBN)
हेल्पर फ़ंक्शन जैसा ही है. यह दिए गए यूआरएल का इस्तेमाल करता है और जवाब पाने के लिए, UrlFetchApp.fetch(url, params)
तरीके का इस्तेमाल करता है. इसके बाद, HTTPResponse.getContextText()
और JavaScript JSON.parse(json)
तरीकों का इस्तेमाल करके, रिस्पॉन्स को JSON ऑब्जेक्ट में पार्स किया जाता है. इसके बाद, नतीजे के तौर पर मिले JSON ऑब्जेक्ट को वापस कर दिया जाता है.
createNewSheet_(name)
यह हेल्पर फ़ंक्शन काफ़ी आसान है. यह फ़ंक्शन सबसे पहले यह पुष्टि करता है कि स्प्रेडशीट में दिए गए नाम की कोई शीट मौजूद है या नहीं. अगर ऐसा होता है, तो फ़ंक्शन शीट को चालू करता है और उसे दिखाता है.
अगर शीट मौजूद नहीं है, तो फ़ंक्शन Spreadsheet.insertSheet(sheetName)
के साथ शीट बनाता है, उसे चालू करता है, और नई शीट दिखाता है.
fillSheetWithData_(resourceSheet, objectKeys, resourceDataList)
यह हेल्पर फ़ंक्शन, नई शीट में एपीआई डेटा भरने के लिए ज़िम्मेदार होता है. यह नई शीट, ऑब्जेक्ट कुंजियों की सूची, और एपीआई संसाधन ऑब्जेक्ट की सूची को पैरामीटर के तौर पर लेता है. हर ऑब्जेक्ट कुंजी, नई शीट में एक कॉलम को दिखाती है. साथ ही, हर संसाधन ऑब्जेक्ट एक लाइन को दिखाता है.
सबसे पहले, यह फ़ंक्शन नई एपीआई रिपोर्ट के डेटा को दिखाने के लिए ज़रूरी पंक्तियों और कॉलम की संख्या का हिसाब लगाता है. यह संसाधन और कुंजियों की सूची का साइज़ है. इसके बाद, फ़ंक्शन एक आउटपुट रेंज (resourceRange
) तय करता है, जहां डेटा रखा जाएगा. साथ ही, कॉलम हेडर रखने के लिए एक अतिरिक्त लाइन जोड़ता है. वैरिएबल resourceValues
में, resourceRange
से निकाली गई 2D वैल्यू की एक सरणी होती है.
इसके बाद, फ़ंक्शन objectKeys
सूची में मौजूद हर ऑब्जेक्ट की पर लूप करता है. कुंजी को कॉलम हेडर के तौर पर सेट किया जाता है. इसके बाद, दूसरा लूप हर संसाधन ऑब्जेक्ट से होकर गुज़रता है. हर (लाइन, कॉलम) जोड़े के लिए, उससे जुड़ी एपीआई जानकारी को resourceValues[row][column]
एलिमेंट में कॉपी किया जाता है.
resourceValues
भरने के बाद, डेस्टिनेशन शीट को साफ़ कर दिया जाता है. इसके लिए, Sheet.clear()
का इस्तेमाल किया जाता है. ऐसा तब किया जाता है, जब शीट में मेन्यू के पिछले आइटम पर किए गए क्लिक का डेटा मौजूद हो. आखिर में, नई वैल्यू को शीट में लिखा जाता है.
नतीजे
अपने काम के नतीजे देखने के लिए, यह तरीका अपनाएं:
- अगर आपने अब तक ऐसा नहीं किया है, तो Apps Script एडिटर में अपना स्क्रिप्ट प्रोजेक्ट सेव करें.
- क्विक फ़ॉर्मैट > कैरेक्टर शीट बनाएं > एपिसोड IV मेन्यू आइटम पर क्लिक करें.
नतीजे कुछ इस तरह दिखने चाहिए:
आपने अब Sheets में डेटा इंपोर्ट करने और उसे अपने-आप फ़ॉर्मैट करने के लिए कोड लिख लिया है.
8. नतीजा
इस कोडलैब को पूरा करने के लिए बधाई. आपने Sheets के कुछ फ़ॉर्मैटिंग विकल्पों के बारे में जाना है. इन्हें Apps Script प्रोजेक्ट में शामिल किया जा सकता है. साथ ही, आपने एक ऐसा बेहतरीन ऐप्लिकेशन बनाया है जो बड़े एपीआई डेटासेट को इंपोर्ट और फ़ॉर्मैट करता है.
क्या आपको यह कोडलैब काम का लगा?
आपने क्या सीखा
- Apps Script की मदद से, Sheets में फ़ॉर्मैटिंग से जुड़े अलग-अलग ऑपरेशन लागू करने का तरीका.
onOpen()
फ़ंक्शन का इस्तेमाल करके सब-मेन्यू बनाने का तरीका.- Apps Script की मदद से, फ़ेच की गई JSON ऑब्जेक्ट की सूची को डेटा की नई शीट में फ़ॉर्मैट करने का तरीका.
आगे क्या करना है
इस प्लेलिस्ट के अगले कोडलैब में, Apps Script का इस्तेमाल करके चार्ट में डेटा को विज़ुअलाइज़ करने और चार्ट को Google Slides प्रज़ेंटेशन में एक्सपोर्ट करने का तरीका बताया गया है.
अगला कोडलैब, Slides में डेटा को चार्ट में दिखाना और प्रज़ेंट करना पर उपलब्ध है.