fx Google Apps Script for Sheets
ENहिन्दी

getRange / getValues / setValues — और batch ऑपरेशन क्यों ज़रूरी हैं

⏱ 15 min

आप क्या सीखेंगे

  • शीट की हर कॉल एक नेटवर्क चक्कर है
  • धीमा तरीका (ऐसा न करें)
  • getValues → 2D array

समझिए

1. शीट की हर कॉल एक नेटवर्क चक्कर है

आपकी स्क्रिप्ट Google के सर्वर पर चलती है; स्प्रेडशीट एक अलग सेवा है। हर getValue() या setValue() एक आना-जाना है। 1,000 रो × 2 कॉल = 2,000 चक्कर, जिसमें मिनट लग सकते हैं। Apps Script किसी भी रन को 6 मिनट बाद रोक भी देता है।

2. धीमा तरीका (ऐसा न करें)

function slowGST() {
  const sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Data');
  for (let r = 2; r <= sh.getLastRow(); r++) {
    const amt = sh.getRange(r, 3).getValue();     // read 1 cell
    sh.getRange(r, 4).setValue(amt * 0.18);       // write 1 cell
  }
}

3. getValues → 2D array

const values = sh.getRange('A2:C5').getValues();
// [ ['Laptop', 12, 55000],
//   ['Mobile',  3, 18000],
//   ['Chair',   0,  4500],
//   ['Desk',    8, 12000] ]
  • यह रो का array है; हर रो सेल का array है।
  • इंडेक्स 0 से शुरू: values[0][2] = पहली रो, तीसरा कॉलम = 55000।
  • खाली सेल '' (खाली स्ट्रिंग) के रूप में आते हैं। तारीख़ें JavaScript Date ऑब्जेक्ट के रूप में आती हैं।

4. तेज़ तरीका: एक बार पढ़ो, प्रोसेस करो, एक बार लिखो

function fastGST() {
  const sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Data');
  const lastRow = sh.getLastRow();
  if (lastRow < 2) return;

  const data = sh.getRange(2, 1, lastRow - 1, 3).getValues();   // A2:C(last)
  const out = data.map(row => {
    const qty = Number(row[1]) || 0;
    const rate = Number(row[2]) || 0;
    const amount = qty * rate;
    return [amount, amount * 0.18, amount * 1.18];               // D, E, F
  });

  sh.getRange(2, 4, out.length, 3).setValues(out);                // one write
  sh.getRange('D1:F1').setValues([['Amount', 'GST', 'Total']]);
}

getRange(row, column, numRows, numColumns) सबसे काम का रूप है: शुरुआती सेल + आकार।

5. setValues का आकार वाला नियम

array रेंज से बिल्कुल मेल खाना चाहिए: रो की संख्या वही, और हर रो में कॉलम की संख्या वही। वरना: "The number of rows in the data does not match the number of rows in the range."

एक रो भी 2D होती है: [['Amount', 'GST', 'Total']] — दोहरे ब्रैकेट पर ध्यान दें।

6. मेमोरी में रो फ़िल्टर करना

कम स्टॉक वाले आइटम "Reorder" शीट में:

function buildReorderList() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const data = ss.getSheetByName('Data').getDataRange().getValues();
  const header = data.shift();                         // remove and keep row 1
  const low = data.filter(row => Number(row[1]) < 5);

  const out = ss.getSheetByName('Reorder') || ss.insertSheet('Reorder');
  out.clearContents();
  out.getRange(1, 1, 1, header.length).setValues([header]);
  if (low.length) out.getRange(2, 1, low.length, header.length).setValues(low);
}

getDataRange() = A1 से डेटा वाली आख़िरी रो/कॉलम तक सब कुछ।

7. फ़ॉर्मेटिंग भी batch में

कई रेंज मेथड के बहुवचन रूप होते हैं जो array लेते हैं: setBackgrounds, setFontColors, setNumberFormats। पूरे ब्लॉक पर एक ही फ़ॉर्मेट के लिए रेंज पर एक कॉल काफ़ी है: range.setNumberFormat('#,##0')।

आम गलतियाँ

लूप के अंदर getValue/setValue कॉल करना। setValues में array का आकार मेल न खाना। भूल जाना कि array 0 से गिने जाते हैं जबकि शीट की रो/कॉलम 1 से। Number() के बिना '' (खाली) को 0 मान लेना।

अभ्यास

medium2,000 रो का टेस्ट डेटा (Product, Qty, Rate) बनाएँ। const t = Date.now(); ... Logger.log(Date.now() - t); से slowGST और fastGST का समय नापें। फिर Reorder लिस्ट बनाएँ और कमी (5 − Qty) वाला कॉलम जोड़ें।
Data को 2,000 rows तक बढ़ाएँ। A2:C एक बार पढ़ें, output map करें और समान आकार के 2D array से एक setValues() करें। Qty < 5 छाँटकर 5−Qty shortfall जोड़ें। Starter की 30 rows में 15 reorder rows और कुल shortfall 45 है। खाली results पर zero-height range न बनाएँ। समय के साथ नतीजे भी मिलाएँ।

प्रश्नोत्तरी

getValues() क्या लौटाता है?
2D array — सेल की रो
values[0][0] रेंज का कौन-सा सेल है?
सबसे ऊपर-बायाँ
स्क्रिप्ट के चलने का अधिकतम समय?
6 मिनट
getRange / getValues / setValues — और batch ऑपरेशन क्यों ज़रूरी हैं · हिंदी | ExcelWalaa