fx Google Sheets के साथ काम
ENहिन्दी

बैच रीड/राइट से तेज़ स्क्रिप्ट

⏱ 15 मिनट

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

  • loop के अंदर शीट को call करने से scripts धीमे क्यों होते हैं
  • read → process → write का तरीका
  • batch formatting और SpreadsheetApp.flush() कब लगाएँ

समझिए

Scripts धीमे क्यों होते हैं

हर getValue() या setValue() आपके script और Google Sheets के बीच एक चक्कर है। एक call तेज़ है; loop के अंदर 5,000 calls में मिनटों लग सकते हैं और ~6 मिनट की limit पार हो सकती है।

धीमा तरीका — हर cell के लिए एक call:

function slowTotals() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sales');
  const lastRow = sheet.getLastRow();
  for (let r = 2; r <= lastRow; r++) {
    const qty = sheet.getRange(r, 3).getValue();   // call
    const rate = sheet.getRange(r, 4).getValue();  // call
    sheet.getRange(r, 5).setValue(qty * rate);     // call
  }
}

2,000 rows के लिए यह 6,000 calls हैं।

तरीका: एक बार पढ़ो → memory में काम करो → एक बार लिखो

तेज़ तरीका — rows कितनी भी हों, कुल दो calls:

function fastTotals() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sales');
  const lastRow = sheet.getLastRow();
  if (lastRow < 2) return;

  // 1. Read once
  const rows = sheet.getRange(2, 1, lastRow - 1, 4).getValues();

  // 2. Process in memory (plain JavaScript, very fast)
  const out = rows.map(r => [r[2] * r[3]]);

  // 3. Write once
  sheet.getRange(2, 5, out.length, 1).setValues(out);
}

असली data पर यह अक्सर 50–100 गुना तेज़ होता है।

कुछ rows बदलना, बाक़ी नहीं

पूरा column पढ़ें, array में सिर्फ़ ज़रूरी चीज़ें बदलें, फिर पूरा column वापस लिखें:

function markPaid() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Invoices');
  const lastRow = sheet.getLastRow();
  const range = sheet.getRange(2, 1, lastRow - 1, 5); // A:E → No, Customer, Amount, Received, Status
  const rows = range.getValues();

  rows.forEach(r => {
    if (r[3] >= r[2]) r[4] = 'Paid';   // Received >= Amount
  });

  range.setValues(rows); // one write
}

सावधान: पूरी range वापस लिखने से उसमें मौजूद formulas उनकी values से बदल जाते हैं। अगर दूसरे columns में formulas हैं तो सिर्फ़ वही columns वापस लिखें जो आपने बदले हैं।

Batch formatting

Formatting के भी batch रूप हैं:

const range = sheet.getRange(2, 1, rows.length, 5);
const colours = rows.map(r => {
  const c = r[4] === 'Paid' ? '#d9ead3' : '#ffffff';
  return [c, c, c, c, c];
});
range.setBackgrounds(colours);  // one call instead of one per row

दूसरे batch setters: setFontWeights, setFontColors, setNumberFormats, setFormulas।

SpreadsheetApp.flush() कब लगाएँ

रफ़्तार के लिए Apps Script writes को इकट्ठा करके बाद में लागू करता है। अगर शीट को अभी update करना है — जैसे अभी लिखी value पर निर्भर formula का नतीजा पढ़ने से पहले, या user को progress दिखाने के लिए — तो लिखें:

SpreadsheetApp.flush();

मुख्य बातें

  • बड़े loop के अंदर कभी getValue/setValue न करें।
  • एक बार पढ़ें → arrays पर काम करें → एक बार लिखें।
  • formatting के लिए भी plural setters (setBackgrounds, setValues) लें।
  • वापस लिखते समय गलती से formula वाले columns न मिटाएँ।

अभ्यास

अभ्यासअभ्यास 1

इस धीमे function को batch तरीके से दोबारा लिखिए:

function slowUpper() {
  const sheet = SpreadsheetApp.getActiveSheet();
  for (let r = 2; r <= sheet.getLastRow(); r++) {
    const v = sheet.getRange(r, 2).getValue();
    sheet.getRange(r, 2).setValue(String(v).toUpperCase());
  }
}

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

1,000 rows के लिए तेज़ तरीके में कितने sheet calls लगते हैं? a) 1,000 b) 2,000 c) लगभग 2
लगभग 2
पूरी range पर setValues करने से क्या गड़बड़ हो सकती है? a) कुछ नहीं b) formulas values से बदल जाते हैं c) शीट delete हो जाती है
formulas values से बदल जाते हैं
बैच रीड/राइट से तेज़ स्क्रिप्ट · हिंदी | ExcelWalaa