जब कॉलम 3 में डेटा संपादित किया जाता है या कॉपी-पेस्ट किया जाता है तो यह कोड ठीक काम करता है, लेकिन अगर पूरी पंक्ति को कॉपी/पेस्ट किए जाने के समय कर्सर कॉलम 1 पर रहता है, तो यह अपडेट नहीं होगा और दूसरी बात, अगर सेल्सफोर्स कॉलम को डेटा भेजता है 3, यह उस समय भी काम नहीं करता है, कृपया यहाँ मेरी मदद करें।

function onEdit() {
  var s = SpreadsheetApp.getActiveSheet();
  var sName = s.getName();

  var r = s.getActiveCell();
  var row = r.getRow();
  var ar = s.getActiveRange();
  var arRows = ar.getNumRows()
  // Logger.log("DEBUG: the active range = "+ar.getA1Notation()+", the number of rows = "+ar.getNumRows());
  

  if( r.getColumn() == 3 && sName == 'Sheet1') { //which column to watch on which sheet
   // loop through the number of rows
    for (var i = 0;i<arRows;i++){
      var rowstamp = row+i;
      SpreadsheetApp.getActiveSheet().getRange('F' + rowstamp.toString()).setValue(new Date()).setNumberFormat("MM/dd/yyyy hh:mm"); //which column to put timestamp in
    }
  }
 }//setValue(new Date()).setNumberFormat("MM/dd/yyyy hh:mm:ss");
1
Pratibha Rajpoot 14 जिंदा 2021, 13:21

1 उत्तर

सबसे बढ़िया उत्तर

व्याख्या:

जानने के लिए तीन महत्वपूर्ण बातें:

  • जैसा कि आधिकारिक दस्तावेज में भी कहा गया है, onEdit ट्रिगर उपयोगकर्ता संपादन पर ट्रिगर होते हैं। यह फ़ंक्शन सूत्र और न ही किसी अन्य स्क्रिप्ट द्वारा ट्रिगर नहीं किया जाएगा। यदि बिक्री बल या उपयोगकर्ता को छोड़कर कोई अन्य सेवा, कॉलम C संपादित करती है तो onEdit ट्रिगर सक्रिय नहीं होने वाला है। समाधान मौजूद हैं, लेकिन ये समाधान आपकी विशिष्ट समस्या के संदर्भ पर निर्भर करते हैं। मैं आपको इसके बारे में एक विशिष्ट प्रश्न खोजने या पूछने की सलाह दूंगा।

  • आपकी दूसरी समस्या के संबंध में, आपको सक्रिय श्रेणियों से छुटकारा पाना चाहिए और घटना वस्तु। इस ऑब्जेक्ट में उपयोगकर्ता द्वारा किए गए संपादन/संपादन के संबंध में जानकारी है।

  • जैसा कि सर्वोत्तम अभ्यास द्वारा अनुशंसित किया गया है, आपको सेट नहीं करना चाहिए शीट में मूल्यों को पुनरावृत्त रूप से लेकिन आप एक बार में कोशिकाओं की एक श्रृंखला का चयन करके और मूल्यों को सेट करके कर सकते हैं। आपके मामले में, आप वांछित श्रेणी में सभी कक्षों में समान मान सेट करना चाहते हैं, इसलिए setValues के बजाय setValue का उपयोग किया जाता है। लेकिन विचार for लूप से छुटकारा पाने का है।

समाधान:

function onEdit(e) {
  var s = e.source.getActiveSheet();
  var sName = s.getName();
  var ar = e.range;
  var row = ar.getRow();
  var arRows = ar.getNumRows()  
  if( ar.getColumn() == 3 && sName == 'Sheet1') { 
      s.getRange(row,6,arRows).setValue(new Date()).setNumberFormat("MM/dd/yyyy hh:mm");
  }
 }

नोट:

फिर से, onEdit एक ट्रिगर फ़ंक्शन है। आप इसे मैन्युअल रूप से निष्पादित करने वाले नहीं हैं और यदि आप ऐसा करते हैं तो आपको वास्तव में त्रुटियां मिलेंगी (ईवेंट ऑब्जेक्ट के उपयोग के कारण)। आपको बस इतना करना है कि इस कोड स्निपेट को स्क्रिप्ट संपादक में सहेजें और फिर इसे संपादित करने पर स्वचालित रूप से ट्रिगर किया जाएगा।

0
soMario 14 जिंदा 2021, 14:44
धन्यवाद, मारियोस, मैं आपकी त्वरित प्रतिक्रिया की सराहना करता हूं। मैंने आपका कोड चलाने की कोशिश की, लेकिन यह त्रुटि फेंक रहा है "अपरिभाषित की संपत्ति 'स्रोत' नहीं पढ़ सकता"। मैंने इसे स्प्रेडशीटऐप.गेटएक्टिवस्प्रेडशीट() से भी बदल दिया, लेकिन फिर इसने मुझे अपरिभाषित त्रुटि की सीमा दिखाई, कोई संकेत, अग्रिम धन्यवाद!
 – 
Pratibha Rajpoot
14 जिंदा 2021, 14:51
मुझे खेद है, मुझे एहसास हुआ कि अब यह ठीक काम कर रहा है जब कॉलम सी में एक सक्रिय कर्सर होता है और डेटा डाला या अपडेट किया जाता है। धन्यवाद
 – 
Pratibha Rajpoot
14 जिंदा 2021, 15:03
खुशी है कि यह काम कर गया। उत्तर के बाईं ओर टिक बटन पर क्लिक करके उत्तर को स्वीकार करने पर विचार करें।
 – 
soMario
14 जिंदा 2021, 15:05
ईवेंट ऑब्जेक्ट में: स्रोत = एक स्प्रेडशीट ऑब्जेक्ट, जो Google शीट्स फ़ाइल का प्रतिनिधित्व करता है जिससे स्क्रिप्ट बंधी हुई है। स्प्रेडशीट। जब मैं ईवेंट ऑब्जेक्ट को स्ट्रिंग करता हूं तो मुझे {} दिखाई देता है। इस बात का कोई संकेत नहीं है कि स्प्रैडशीट के भीतर कौन सी शीट बदली गई थी। क्या ट्रिगर केवल तभी उपयोगी होते हैं जब एक ही शीट हो या कौन सी शीट बदली जाए, इससे कोई फर्क नहीं पड़ता?
 – 
aNewb
15 जिंदा 2021, 04:28
आपकी टिप्पणी के लिए धन्यवाद। e.source आपको वास्तव में spreadsheet ऑब्जेक्ट देता है जो स्क्रिप्ट बाध्य है। उस ऑब्जेक्ट से आप वह शीट प्राप्त कर सकते हैं जिसे संपादित किया गया था: sheet = e.source.getActiveSheet()। और उससे आप शीट का नाम या उस शीट की कोई अन्य जानकारी (gid) या जो भी प्राप्त कर सकते हैं। उदाहरण के लिए sheet.getName()। इसलिए आप स्प्रेडशीट फ़ाइल में केवल विशेष शीट (टैब) के लिए कुछ कोड निष्पादित करने के लिए शीट का नाम एक शर्त के रूप में रख सकते हैं (जैसा कि ऊपर मेरा उत्तर है)।
 – 
soMario
15 जिंदा 2021, 04:34