समझिए
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। - खाली सेल
''(खाली स्ट्रिंग) के रूप में आते हैं। तारीख़ें JavaScriptDateऑब्जेक्ट के रूप में आती हैं।
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 मान लेना।