समझिए
1. दो तरह के ट्रिगर
| Simple triggers | Installable triggers | |
|---|---|---|
| कैसे सेट होते हैं | बस फ़ंक्शन का नाम onOpen, onEdit रखकर |
Triggers पेज या कोड से |
| ईमेल भेज सकते हैं, दूसरी फ़ाइलें खोल सकते हैं | नहीं | हाँ (आपकी अनुमति से चलते हैं) |
| समय आधारित | नहीं | हाँ |
| किसके लिए अच्छे | मेन्यू, छोटे एडिट | रिपोर्ट, अलर्ट, शेड्यूल |
2. onOpen — अपना मेन्यू
function onOpen() {
SpreadsheetApp.getUi()
.createMenu('ExcelWalaa Tools')
.addItem('Calculate GST', 'fastGST')
.addItem('Build reorder list', 'buildReorderList')
.addSeparator()
.addItem('Send stock alert', 'sendStockAlert')
.addToUi();
}
शीट रीलोड करें — Help के बगल में नया मेन्यू दिखता है। दूसरा आर्ग्युमेंट फ़ंक्शन का नाम टेक्स्ट के रूप में है।
3. onEdit — अपने आप टाइमस्टैम्प
जब कोई ऑर्डर का Status (कॉलम D) बदले, तो कॉलम E में तारीख़ और समय लिखो:
function onEdit(e) {
const range = e.range;
const sheet = range.getSheet();
if (sheet.getName() !== 'Orders') return;
if (range.getColumn() !== 4 || range.getRow() < 2) return;
const stamp = range.getValue() === '' ? '' : new Date();
sheet.getRange(range.getRow(), 5).setValue(stamp);
}
eevent ऑब्जेक्ट है:e.range(एडिट हुआ सेल),e.value(नई वैल्यू),e.oldValue।- जिस एडिट से मतलब नहीं, उस पर हमेशा जल्दी बाहर निकलें (
return) — onEdit फ़ाइल के हर एडिट पर चलता है। - स्क्रिप्ट से हुए बदलाव पर onEdit नहीं चलता। एक साथ कई सेल पेस्ट होने पर
e.rangeसबको कवर करता है, पर यह कोड सिर्फ़ पहली रो पर स्टैम्प लगाता है — ज़्यादा चाहिए तो रो पर लूप चलाएँ। - एडिटर में
onEditपर Run न दबाएँ — वहाँeनहीं होता, इसलिए एरर आता है। शीट एडिट करके जाँचें।
4. Time-driven ट्रिगर — रोज़ सुबह 9 बजे रिपोर्ट
पहले काम लिखें:
function dailyReport() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const data = ss.getSheetByName('Data').getDataRange().getValues();
data.shift();
const low = data.filter(r => Number(r[1]) < 5).length;
ss.getSheetByName('Log').appendRow([new Date(), 'Items below reorder level', low]);
}
appendRow आख़िरी भरी रो के बाद एक रो जोड़ता है — लॉग के लिए बिल्कुल सही।
विकल्प A — Triggers पेज (सबसे आसान): बाईं साइडबार ⏰ Triggers → Add Trigger → फ़ंक्शन dailyReport → event source Time-driven → Day timer → 9am to 10am → Save।
विकल्प B — कोड में (एक बार चलाएँ):
function createDailyTrigger() {
ScriptApp.getProjectTriggers()
.filter(t => t.getHandlerFunction() === 'dailyReport')
.forEach(t => ScriptApp.deleteTrigger(t)); // avoid duplicates
ScriptApp.newTrigger('dailyReport')
.timeBased()
.everyDays(1)
.atHour(9)
.create();
}
5. समय की बारीकियाँ
- Google रोज़ाना ट्रिगर चुने हुए घंटे के अंदर कभी भी चलाता है (जैसे 9:00–10:00), किसी सटीक मिनट पर नहीं।
- घंटा स्क्रिप्ट के टाइम ज़ोन से चलता है: Project Settings (⚙️) → Time zone → (GMT+05:30) India Standard Time सेट करें।
- दूसरे शेड्यूल:
.everyHours(1),.everyMinutes(15),.onWeekDay(ScriptApp.WeekDay.MONDAY).atHour(9)।
6. जब कुछ गड़बड़ हो
फ़ेल हुए ट्रिगर रन Executions (बाईं साइडबार) में दिखते हैं, और Google आपको फ़ेलियर का सारांश ईमेल करता है। एरर को शीट में लॉग करने के लिए काम को try { … } catch (err) { … } में लपेटें।
आम गलतियाँ
सादे onEdit में ईमेल कोड डालना (चुपचाप फ़ेल होता है — इसकी जगह installable "On edit" ट्रिगर लगाएँ)। सेटअप फ़ंक्शन बार-बार चलाकर एक ही टाइम ट्रिगर कई बार बनाना। गलत टाइम ज़ोन, जिससे "9 AM" भारत में सुबह 3:30 बजे चलता है।