समझिए
वो limits जो असल में आड़े आती हैं
Google पूरी list अपने Quotas for Google Services page पर देता है, और numbers समय-समय पर बदलते हैं — मौजूदा values हमेशा वहीं जाँचें। ये सबसे ज़रूरी हैं:
| Limit | Personal Gmail account | Google Workspace account |
|---|---|---|
| एक execution का run time | ~6 मिनट | ~6 मिनट |
| Custom function का run time | ~30 सेकंड | ~30 सेकंड |
| रोज़ के email recipients | ~100 | ~1,500 |
| रोज़ का कुल trigger run time | ~90 मिनट | ~6 घंटे |
| हर script में प्रति user triggers | 20 | 20 |
ज़्यादातर beginners को email और 6 मिनट वाली limits ही परेशान करती हैं।
भेजने से पहले email quota देखें
function sendIfQuota(recipients) {
const left = MailApp.getRemainingDailyQuota();
if (left < recipients.length) {
console.warn(`Only ${left} emails left today; need ${recipients.length}.`);
return false;
}
// ... send ...
return true;
}
6 मिनट की limit का उपाय: टुकड़ों में काम
अपनी जगह save करें, समय ख़त्म होने से पहले रुकें, और अगले run में वहीं से आगे बढ़ें।
const MAX_MS = 5 * 60 * 1000; // stop after 5 minutes, leaving a safety margin
function processInChunks() {
const start = Date.now();
const props = PropertiesService.getScriptProperties();
let nextRow = Number(props.getProperty('NEXT_ROW') || 2);
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Customers');
const lastRow = sheet.getLastRow();
while (nextRow <= lastRow) {
if (Date.now() - start > MAX_MS) break;
const batchSize = Math.min(50, lastRow - nextRow + 1);
const rows = sheet.getRange(nextRow, 1, batchSize, 3).getValues();
rows.forEach(r => {
// ... slow work per row, e.g. an API call ...
});
nextRow += batchSize;
props.setProperty('NEXT_ROW', String(nextRow)); // save progress after each batch
}
if (nextRow > lastRow) {
props.setProperty('NEXT_ROW', String(nextRow)); // retain completion cursor
console.log('All rows done');
} else {
console.log(`Paused at row ${nextRow}; will continue on next run`);
}
}
इसे हर 10–15 मिनट चलने वाले ट्रिगर से जोड़ें। काम पूरा होने पर अगली पंक्ति का स्थान सुरक्षित रहता है; बाद के रन सिर्फ़ नई पंक्तियाँ पढ़ते हैं। पूरा काम दोबारा शुरू करने के लिए ही NEXT_ROW हटाएँ।
धीमे lookups को cache करें
अगर कई runs एक ही data लाते हैं (जैसे API से आज का gold rate), तो उसे cache करें:
function getRate() {
const cache = CacheService.getScriptCache();
const cached = cache.get('GOLD_RATE');
if (cached) return Number(cached);
const rate = fetchRateFromApi(); // slow call (your own function)
cache.put('GOLD_RATE', String(rate), 3600); // keep for 1 hour (max 6 hours)
return rate;
}
दो runs का टकराव रोकें
अगर trigger और user एक ही function एक साथ चला सकते हैं (जैसे दोनों invoice numbers जोड़ रहे हों), तो lock लगाएँ:
function nextInvoiceNumber() {
const lock = LockService.getScriptLock();
lock.waitLock(10000); // wait up to 10 s
try {
const props = PropertiesService.getScriptProperties();
const n = Number(props.getProperty('LAST_INVOICE') || 0) + 1;
props.setProperty('LAST_INVOICE', String(n));
return n;
} finally {
lock.releaseLock();
}
}
रफ़्तार के और tips
- Batch read/write (Module 2) से "बहुत धीमा" वाली ज़्यादातर समस्याएँ हल हो जाती हैं।
- loops के अंदर
SpreadsheetApp.flush()न लगाएँ। - एक ही file बार-बार न खोलें — एक बार खोलें और आगे pass करें।
मुख्य बातें
- हर run के लिए ~6 मिनट और रोज़ की email limits ध्यान में रखें; मौजूदा numbers Google के quota page पर देखें।
- बड़े jobs: progress Script Properties में save करें और अगले trigger पर आगे बढ़ें।
- बार-बार के lookups के लिए
CacheService, shared counters के लिएLockService।