Google Apps स्क्रिप्ट को डीबग कैसे करें (उर्फ जहां Logger.log लॉग इन करता है?)


129

Google पत्रक में, आप कुछ स्क्रिप्टिंग कार्यक्षमता जोड़ सकते हैं। मैं onEditघटना के लिए कुछ जोड़ रहा हूं , लेकिन मैं यह नहीं बता सकता कि यह काम कर रहा है या नहीं। जहां तक ​​मैं बता सकता हूं, आप Google शीट्स से लाइव ईवेंट को डिबेट नहीं कर सकते हैं, इसलिए आपको इसे डीबगर से करना होगा, जो कि व्यर्थ है क्योंकि onEdit()जब तक मैं इसे चलाता हूं, तो मेरे तर्क के लिए यह फ़ंक्शन तर्क हमेशा अपरिभाषित रहेगा। Script Editor

इसलिए, Logger.logजब भी onEditफ़ंक्शन को कॉल किया जाता है, तो मैं कुछ डेटा लॉग करने के लिए विधि का उपयोग करने की कोशिश कर रहा था , लेकिन यह भी ऐसा लगता है कि यह केवल तभी काम करता है जब से चलाया जाता है Script Editor। जब मैं इसे से चलाता हूं Script Editor, तो मैं लॉग ऑन करके देख सकता हूंView->Logs...

मैं उम्मीद कर रहा था कि जब वास्तव में घटना को अंजाम दिया जाएगा तो मैं उससे लॉग देख पाऊंगा, लेकिन मैं इसका पता नहीं लगा सकता।

मैं इस सामान को कैसे डीबग करूं?


3
यहाँ एक ही मुद्दा - स्वीकृत उत्तर इसका उत्तर नहीं देता है लेकिन बहुत सारी सादे गलत जानकारी देता है।
हिप्पिज्म

ऐसा लगता है जैसे उन्होंने अभी यह तय किया है। जब तक आप अपनी स्प्रैडशीट से स्क्रिप्ट एडिटर को खोलते हैं, तब तक उस टैब को खुला छोड़ दें जब आप अपनी शीट में सामान चलाते हैं। फिर स्क्रिप्ट टैब पर वापस जाएं और इसमें लॉगिंग जानकारी होगी।
फ्रेडहेड

2
tldr; कॉपी, पेस्ट और रनLogger.log('firstLog');MailApp.sendEmail({to:'yourEmailAddressHere@someone.com',subject: "subject here ^_^",body: Logger.getLog()});
कॉटी ने

Maby आपको स्वीकृत उत्तर को बदलना चाहिए या एक नोट जोड़ना चाहिए जो Stackdriver Logging उपलब्ध है।
बॉटनवॉवर

जवाबों:


83

अपडेट करें:

जैसा कि इस उत्तर में लिखा गया है ,


Logger.logया तो आपको त्रुटियों का एक ईमेल (अंततः) भेज देगा जो आपकी लिपियों में हुआ है, या, यदि आप चीजों को चला रहे हैं, तो आप Script Editorअंतिम रन फ़ंक्शन से लॉग को View->Logs(अभी भी स्क्रिप्ट संपादक में) जाकर देख सकते हैं । फिर, यह आपको केवल कुछ भी दिखाएगा जो आपके द्वारा अंदर सेScript Editor चलाए गए अंतिम फ़ंक्शन से लॉग किया गया था ।

जो स्क्रिप्ट मैं काम करने की कोशिश कर रहा था, उसका स्प्रेडशीट के साथ क्या करना था - मैंने स्प्रेडशीट को टूडू-चेकलिस्ट प्रकार की चीज़ बना दिया, जो प्राथमिकताओं और इस तरह से आइटम सॉर्ट करता है।

उस स्क्रिप्ट के लिए मैंने जो एकमात्र ट्रिगर्स स्थापित किया था, वे थे ऑनऑन और ऑनएड ट्रिगर्स। ऑनएडिट ट्रिगर को डीबग करना सबसे कठिन था, क्योंकि मैं सोचता रहा कि अगर मैंने अपने ऑनडाइट फ़ंक्शन में एक ब्रेकपॉइंट सेट किया, तो स्प्रेडशीट खोली, एक सेल को संपादित किया, जिससे मेरा ब्रेकपाइंट ट्रिगर हो जाएगा। यह मामला नहीं है।

एक सेल को संपादित करने के लिए अनुकरण करने के लिए, मैंने हालांकि वास्तविक स्प्रेडशीट में कुछ करने के लिए समाप्त किया । मैंने जो कुछ किया, वह यह सुनिश्चित करने के लिए किया गया था कि जिस सेल को मैं "एडिटेड" के रूप में मानता हूं, उसे चुना गया था, फिर अंदरScript Editor , मैं करने के लिए जाना होगा Run->onEdit। तब मेरा ब्रेकअप हो जाता।

हालाँकि, मुझे उस ईवेंट तर्क का उपयोग करना बंद करना पड़ा जो ऑनएडिट फ़ंक्शन में पास हो जाता है - आप ऐसा करके अनुकरण नहीं कर सकते Run->onEdit । स्प्रेडशीट से मुझे जो भी जानकारी चाहिए, जैसे सेल का चयन किया गया था, आदि, मुझे मैन्युअल रूप से पता लगाना था।

वैसे भी, लंबा जवाब है, लेकिन मुझे यह अंततः पता लगा।


संपादित करें :

यदि आप मेरे द्वारा बनाया गया टूडू चेकलिस्ट देखना चाहते हैं, तो आप इसे यहाँ देख सकते हैं

(हाँ, मुझे पता है कि कोई भी इसे संपादित कर सकता है - यह इसे साझा करने का बिंदु है!)

मैं उम्मीद कर रहा था कि यह आपको स्क्रिप्ट देखने देगा। चूँकि आप इसे वहाँ नहीं देख सकते, यहाँ यह है:

function onOpen() {
  setCheckboxes();
};

function setCheckboxes() {
  var checklist = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("checklist");
  var checklist_data_range = checklist.getDataRange();
  var checklist_num_rows = checklist_data_range.getNumRows();
  Logger.log("checklist num rows: " + checklist_num_rows);

  var coredata = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("core_data");
  var coredata_data_range = coredata.getDataRange();

  for(var i = 0 ; i < checklist_num_rows-1; i++) {
    var split = checklist_data_range.getCell(i+2, 3).getValue().split(" || ");
    var item_id = split[split.length - 1];
    if(item_id != "") {
      item_id = parseInt(item_id);
      Logger.log("setting value at ("+(i+2)+",2) to " + coredata_data_range.getCell(item_id+1, 3).getValue());
      checklist_data_range.getCell(i+2,2).setValue(coredata_data_range.getCell(item_id+1, 3).getValue());
    }
  }
}

function onEdit() {
  Logger.log("TESTING TESTING ON EDIT");
  var active_sheet = SpreadsheetApp.getActiveSheet();
  if(active_sheet.getName() == "checklist") {
    var active_range = SpreadsheetApp.getActiveSheet().getActiveRange();
    Logger.log("active_range: " + active_range);
    Logger.log("active range col: " + active_range.getColumn() + "active range row: " + active_range.getRow());
    Logger.log("active_range.value: " + active_range.getCell(1, 1).getValue());
    Logger.log("active_range. colidx: " + active_range.getColumnIndex());
    if(active_range.getCell(1,1).getValue() == "?" || active_range.getCell(1,1).getValue() == "?") {
      Logger.log("made it!");
      var next_cell = active_sheet.getRange(active_range.getRow(), active_range.getColumn()+1, 1, 1).getCell(1,1);
      var val = next_cell.getValue();
      Logger.log("val: " + val);
      var splits = val.split(" || ");
      var item_id = splits[splits.length-1];
      Logger.log("item_id: " + item_id);

      var core_data = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("core_data");
      var sheet_data_range = core_data.getDataRange();
      var num_rows = sheet_data_range.getNumRows();
      var sheet_values = sheet_data_range.getValues();
      Logger.log("num_rows: " + num_rows);

      for(var i = 0; i < num_rows; i++) {
        Logger.log("sheet_values[" + (i) + "][" + (8) + "] = " + sheet_values[i][8]);
        if(sheet_values[i][8] == item_id) {
          Logger.log("found it! tyring to set it...");
          sheet_data_range.getCell(i+1, 2+1).setValue(active_range.getCell(1,1).getValue());
        }
      }

    }
  }

  setCheckboxes();
};

Pff, लॉगिंग केवल मेल में दिखाई देगा? यह थोड़े इन सभी डिबगिंग और लॉगिंग सुविधाओं को बेकार बनाता है, क्योंकि प्रभावी रूप से हम स्प्रेडशीट से वास्तविक डेटा का उपयोग नहीं कर सकते हैं।
14

जैसा कि लेखक ने कहा, लॉगिंग लॉग में उपलब्ध है (स्क्रिप्ट एडिटर, व्यू, लॉग या Ctrl-Enter)
रेनबा

9
@rainabba हां, लॉगिंग स्क्रिप्ट एडिटर में उपलब्ध है। हालाँकि, जब कोई स्क्रिप्ट ईवेंट तर्क पर निर्भर करती है और स्क्रिप्ट एडिटर में ईवेंट तर्क उपलब्ध नहीं है, तो इसका प्रभावी रूप से अर्थ है कि इन प्रकार की स्क्रिप्ट के डेवलपर्स के पास लॉग्स तक पहुँचने का कोई वास्तविक समय नहीं है।
जेफ

1
मैं पहले कोई टिप्पणी नहीं कर सकता था, इसलिए मैंने नीचे एक उत्तर दिया, लेकिन: यदि आपके पास स्क्रिप्ट एडिटर खुला है और आप ओपन स्प्रेडशीट में कोई ईवेंट ट्रिगर करते हैं, तो आप स्क्रिप्ट एडिटर ब्राउज़र उदाहरण पर वापस जा सकते हैं और लॉग्स में जानकारी देख सकते हैं । यह तब तक अच्छी तरह से काम करता है जब तक आपको उपयोगकर्ता के तहत कुछ का परीक्षण नहीं करना पड़ता है जो स्क्रिप्ट नहीं खोल सकता है या एक जिसे आप लॉग इन नहीं कर सकते हैं।
कार्ल_एस

1
यह उत्तर पुराना है और इसे स्वीकृत उत्तर के रूप में नहीं देखा जाना चाहिए। स्टैकड्राइवर लॉगिंग उपलब्ध है और एक आकर्षण की तरह काम करता है। यादृच्छिक-भागों के उत्तर पर एक नज़र डालें!
बोटनवूवर

34

जहाँ तक मैं बता सकता हूँ, आप Google डॉक्स से लाइव ईवेंट को डिबेट नहीं कर सकते हैं, इसलिए आपको डीबगर से करना होगा, जो कि मेरे ऑनएडिट () फंक्शन में पास होने वाले ईवेंट तर्क के हमेशा बेकार होने के कारण है जो मैं चलाता हूँ यह स्क्रिप्ट संपादक से।

यह सच है - इसलिए डिबगिंग के लिए घटना तर्क को स्वयं परिभाषित करें। देखें कि मैं जीएएस में ट्रिगर फ़ंक्शन का परीक्षण कैसे कर सकता हूं?

जब भी onEdit फ़ंक्शन को कॉल किया जाता है, मैं कुछ डेटा लॉग करने के लिए Logger.log विधि का उपयोग करने की कोशिश कर रहा था, लेकिन यह भी ऐसा लगता है कि यह केवल स्क्रिप्ट एडिटर से चलने पर काम करता है। जब मैं इसे स्क्रिप्ट एडिटर से चलाता हूं, तो मैं व्यू-> लॉग पर जाकर लॉग देख सकता हूं ...

फिर से सच है, लेकिन मदद है। पीटर हरमन की बेटरलॉग लाइब्रेरी सभी लॉग को एक स्प्रेडशीट पर पुनर्निर्देशित करेगी, जो कोड से भी लॉगिंग को सक्षम करेगा जो कि संपादक / डिबगर के एक उदाहरण से जुड़ा नहीं है।

यदि आप एक स्प्रेडशीट-युक्त स्क्रिप्ट में कोडिंग कर रहे हैं, उदाहरण के लिए, आप अपनी स्क्रिप्ट फ़ाइल के शीर्ष पर सिर्फ एक पंक्ति जोड़ सकते हैं, और सभी लॉग स्प्रेडशीट में "लॉग्स" शीट पर जाएंगे। कोई अन्य कोड आवश्यक नहीं, Logger.log()जैसा कि आप आमतौर पर उपयोग करते हैं:

Logger = BetterLog.useSpreadsheet();

1
रगड़ा हुआ। console.log()अब सबसे अच्छा जवाब होना चाहिए
TheMaster

22

2017 अपडेट: स्टैकड्राइवर लॉगिंग अब Google Apps स्क्रिप्ट के लिए उपलब्ध है। स्क्रिप्ट एडिटर में मेनू बार से, गोटो: View > Stackdriver Loggingलॉग को देखने या स्ट्रीम करने के लिए।

कंसोल.लॉग ()DEBUG स्तर के संदेश लिखेंगे

उदाहरण onEdit()लॉगिंग:

function onEdit (e) {
  var debug_e = {
    authMode:  e.authMode,  
    range:  e.range.getA1Notation(),    
    source:  e.source.getId(),
    user:  e.user,   
    value:  e.value,
    oldValue: e. oldValue
  }

  console.log({message: 'onEdit() Event Object', eventObject: debug_e});
}

फिर आउटपुट देखने के लिए लेबल किए गए Stackdriver UI में लॉग की जाँच करेंonEdit() Event Object


मूल प्रश्न विशेष रूप से के बारे में पूछता है Logger.log। यह कैसे अलग है console.logजिससे आप उपयोग करते हैं? मैं उपकरणों के लिए बहुत नया हूँ तो बस यह पता लगाने की कोशिश कर रहा हूं कि सब कुछ क्या है।
अन्नानफे

5

थोड़ा हैसी, लेकिन मैंने "कंसोल" नामक एक सरणी बनाई, और कभी-कभी मैं कंसोल पर ध्यान केंद्रित करने के लिए आउटपुट करना चाहता था। फिर जब भी मैं वास्तविक आउटपुट देखना चाहता था, मैं consoleजो भी पहले लौट रहा था, उसके बजाय मैं वापस लौट आया ।

    //return 'console' //uncomment to output console
    return "actual output";
}

js में console.log('smth')पूरी तरह से काम करता है, लेकिन GAS में कैसे?
इगोर सैविंकिन

1
कंसोल.लॉग केवल इसलिए काम नहीं करेगा क्योंकि जीएएस आपकी स्प्रेडशीट के समान वेब पेज में चलने वाली स्क्रिप्ट नहीं हैं, वे स्क्रिप्ट हैं जो Google के ऐप इंजन द्वारा नियंत्रित की जाती हैं, ताकि आपको उनके अनजाने लॉगर.लॉग डीबगर का पालन करना पड़े या मेरी तरह हैक का उपयोग करें
woojoo666

कैसे अपने सरणी 'कंसोल' के बारे में? जब I just returned consoleआप इसे कैसे उत्पादन करते हैं?
इगोर सेविनकिन

2
क्षमा करें, मैंने बहुत अच्छी तरह से समझाया नहीं, लेकिन अनिवार्य रूप से स्प्रेडशीट फ़ंक्शन सेल में मान लौटाता है, इसलिए यदि आप अपना "कंसोल" वापस करते हैं, तो आप अपने स्प्रेडशीट सेल के अंदर लॉग इन सब कुछ देखेंगे
woojoo666

5

यदि आपके पास स्क्रिप्ट एडिटर खुला है, तो आप व्यू-> लॉग्स के तहत लॉग देखेंगे। यदि आपकी स्क्रिप्ट में एक onedit ट्रिगर है, तो स्प्रेडशीट में एक बदलाव करें, जो दूसरे टैब में खोले गए स्क्रिप्ट एडिटर के साथ फ़ंक्शन को ट्रिगर करना चाहिए। फिर स्क्रिप्ट एडिटर टैब पर जाएं और लॉग खोलें। आप देखेंगे कि लकड़हारा आपका कौन सा कार्य करता है।

मूल रूप से जब तक पटकथा संपादक खुला है, तब तक घटना लॉग को लिखकर आपके लिए दिखा देगी। यह नहीं दिखाएगा कि कोई अन्य व्यक्ति फ़ाइल में है या नहीं।


5

मैं इन पोस्टों से गुज़रा हूँ और किसी तरह से एक सरल उत्तर ढूंढ रहा हूँ, जिसे मैं यहाँ पोस्ट कर रहा हूँ, जो छोटे और मीठे समाधान चाहते हैं:

  1. console.log("Hello World")अपनी स्क्रिप्ट में उपयोग करें ।
  2. Https://script.google.com/home/my पर जाएं और अपना ऐड चुनें।
  3. प्रोजेक्ट विवरण पर ईलिप्सिस मेनू पर क्लिक करें, चयन करें।

यहाँ छवि विवरण दर्ज करें

  1. नवीनतम निष्पादन के हेडर पर क्लिक करें और लॉग पढ़ें।

यहाँ छवि विवरण दर्ज करें


यह अप्रैल 2019 के बाद बनाए गए Google Apps लिपियों के लिए मूल "स्टैकड्राइवर लॉगिंग" है (जो कि एप्लिकेशन स्क्रिप्स के पीछे "स्वचालित" परियोजनाओं के लिए Google क्लाउड प्रोजेक्ट तक पहुंचना असंभव हो गया था)। यदि आप Apps स्क्रिप्ट प्रोजेक्ट के लिए GCP बदलते हैं, तो नियमित Stackdriver लॉगिंग उत्तर लागू होते हैं।
तहहुच

1
मैं केवल यहां प्रत्यक्ष निष्पादन देखता हूं (यानी जिनके लिए मैंने स्क्रिप्ट संपादक में "रन" पर क्लिक किया है), लेकिन मैं शीट में डेटा के परिवर्तन के कारण निष्पादित नहीं देखता हूं। मैं उन लोगों को कैसे डिबग करूं?
संकट 70

मैंने कोशिश नहीं की है कि क्षमा करें। मुझे लगता है कि अगर शीट में बदलाव से कोई फंक्शन शुरू होता है और फंक्शन में लॉग होता है, तो लॉग साथ दिखाई देगा। परिवर्तन हमेशा उपयोगकर्ता-प्रेरित सही होगा?
बेंजामिन

1
हां, मैंने भी यही सोचा होगा। दुर्भाग्य से ऐसा नहीं होता है: :( डेटा में परिवर्तन मेरे फ़ंक्शन को ट्रिगर करते हैं, लेकिन Stackdriver लॉग में कंसोल (लॉग) संदेश नहीं दिखाए जाते हैं। मैंने एक परिवर्तन करने वाले कार्यकर्ता को जोड़ने की कोशिश की, लेकिन यह मेरे कार्य को मापदंडों के साथ आमंत्रित करता है: - (
Cr7070

4

मुझे वही समस्या हो रही है, मैंने नीचे वेब पर कहीं पाया ...।

डॉक्स में इवेंट हैंडलर हालांकि थोड़े पेचीदा हैं। क्योंकि डॉक्स एक साथ कई उपयोगकर्ताओं द्वारा एक साथ कई संपादनों को संभाल सकता है, इसलिए इवेंट हैंडलर को सर्वर-साइड हैंडल किया जाता है। इस संरचना के साथ प्रमुख मुद्दा यह है कि जब कोई ईवेंट ट्रिगर स्क्रिप्ट विफल हो जाती है, तो यह सर्वर पर विफल हो जाती है। यदि आप डिबग जानकारी देखना चाहते हैं, तो आपको ट्रिगर्स मेनू के तहत एक स्पष्ट ट्रिगर सेटअप करने की आवश्यकता होगी जो ईवेंट के विफल होने पर आपको डीबग जानकारी को ईमेल करता है अन्यथा यह चुपचाप विफल हो जाएगा।


हम्म, हाँ, मैंने इसमें भाग लिया - इसने मुझे अगली सुबह अपनी स्क्रिप्ट से त्रुटियों का एक पूरा गुच्छा ईमेल किया। हालांकि मैंने इसे समाप्त कर लिया है, हालांकि (अब अपना खुद का उत्तर पोस्ट कर रहा हूं)
d0c_s4vage

1

यह सुरुचिपूर्ण से बहुत दूर है, लेकिन डिबगिंग करते समय, मैं अक्सर लकड़हारे को लॉग करता हूं, और फिर उसकी सामग्री लाने के लिए गेटलॉग () का उपयोग करता हूं । फिर, मैं या तो:

  • परिणामों को एक चर में सहेजें (जो Google लिपियों के डिबगर में निरीक्षण किया जा सकता है - यह उन मामलों के आसपास काम करता है जहां मैं कुछ कोड में एक ब्रेकपॉइंट सेट नहीं कर सकता, लेकिन मैं बाद में निष्पादित होने वाले कोड में एक सेट कर सकता हूं )
  • इसे कुछ अस्थायी DOM तत्व पर लिखें
  • इसे अलर्ट में प्रदर्शित करें

अनिवार्य रूप से, यह सिर्फ एक जावास्क्रिप्ट आउटपुट मुद्दा बन जाता है ।

इसमें आधुनिक console.log()कार्यान्वयन की कार्यक्षमता का अभाव है , लेकिन लकड़हारा अभी भी Google लिपियों को डीबग करने में मदद करता है।


1

बस एक सूचना के रूप में। मैंने अपनी स्प्रेडशीट के लिए एक परीक्षण कार्य किया। मैं onEdit (e) फ़ंक्शन में वेरिएबल google थ्रो का उपयोग करता हूं (मैंने इसे e कहा है)। फिर मैंने इस तरह एक परीक्षण समारोह बनाया:

function test(){
var testRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(GetItemInfoSheetName).getRange(2,7)
var testObject = {
    range:testRange,
    value:"someValue"
}
onEdit(testObject)
SpreadsheetApp.getActiveSpreadsheet().getSheetByName(GetItemInfoSheetName).getRange(2,6).setValue(Logger.getLog())
}

इस परीक्षण फ़ंक्शन को कॉल करने से सभी कोड चलते हैं, क्योंकि आपके पास स्प्रेडशीट में एक घटना थी। मैंने अभी सेल के कब्जे में डाल दिया था जिसे मैंने संपादित किया था, मुझे एक अप्रत्याशित परिणाम मिला था, जिससे मैंने सेल में रखे मूल्य को मान दिया था। OBS! अधिक चर के लिए googles फ़ंक्शन को यहां जाता है: https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events


0

वर्तमान में आप डॉक्स के भीतर स्क्रिप्ट का उपयोग करने के लिए कंटेनर बाउंड प्रकृति तक ही सीमित हैं। यदि आप डॉक्स के बाहर एक नई स्क्रिप्ट बनाते हैं तो आप Google स्प्रेडशीट को जानकारी निर्यात करने में सक्षम होंगे और इसे लॉगिंग टूल की तरह उपयोग कर सकते हैं।

उदाहरण के लिए अपने पहले कोड ब्लॉक में

function setCheckboxes() {

    // Add your spreadsheet data
    var errorSheet = SpreadsheetApp.openById('EnterSpreadSheetIDHere').getSheetByName('EnterSheetNameHere');
    var cell = errorSheet.getRange('A1').offset(errorSheet.getLastRow(),0);

    // existing code
    var checklist = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("checklist");
    var checklist_data_range = checklist.getDataRange();
    var checklist_num_rows = checklist_data_range.getNumRows();

    // existing logger
    Logger.log("checklist num rows: " + checklist_num_rows);

   //We can pass the information to the sheet using cell.setValue()
    cell.setValue(new Date() + "Checklist num rows: " + checklist_num_rows);

जब मैं जीएएस के साथ काम कर रहा हूं तो मेरे पास दो मॉनिटर हैं (आप दो विंडो का उपयोग कर सकते हैं) जिसमें एक जीएएस पर्यावरण से युक्त है और दूसरा एसएस से युक्त है इसलिए मैं जानकारी लिख सकता हूं और लॉग इन कर सकता हूं।


0

देव कंसोल ऐप स्क्रिप्ट द्वारा फेंकी गई त्रुटियों को लॉग करेगा, इसलिए आप इसे सामान्य कंसोल के रूप में लॉग इन करने के लिए एक त्रुटि फेंक सकते हैं। यह निष्पादन को रोक देगा, लेकिन यह कदम दर कदम डिबगिंग के लिए उपयोगी हो सकता है।

throw Error('hello world!');

इसी तरह कंसोल में दिखाई देगा console.log('hello world')


0

अपना स्प्रेडशीट कोड इस तरह डिबग करें:

...
throw whatAmI;
...

इस तरह दिखाता है:

यहाँ छवि विवरण दर्ज करें


मुझे लगता है कि आपको यह उल्लेख करना चाहिए कि छवि दिखाती है कि एक कस्टम फ़ंक्शन एक त्रुटि कैसे दिखाता है, लेकिन ओपी का उल्लेख है कि वह एक सरल ट्रिगर का उपयोग कर रहा है ( onEdit)
रूबेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.