समझिए
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 न मिटाएँ।