6

जब मैं स्प्रेडशीट फ़ंक्शन कहता हूं, int(f2) कहें, तो फ़ंक्शन सेल में मान पर चलता है। यदि cell("F2") 3.14159 होता है, परिणाम 3. होगा लेकिन जब मैं समारोह के एक अलग प्रकार कहते हैं - उदाहरण के लिए: row(f8) - समारोह इस मामले में मूल्य कक्ष संदर्भ लेता है, और नहीं,, 8.स्प्रेडशीट फ़ंक्शन

लौटने मूल्य के बजाए संदर्भ के साथ काम करने के लिए मैं अपना कस्टम फ़ंक्शन कैसे प्राप्त करूं?

मैं एक स्ट्रिंग पास कर सकता हूं, और getRange() का उपयोग कर सकता हूं, लेकिन, यदि मैं शीट पर कोशिकाओं को स्थानांतरित या अद्यतन करता हूं, तो स्ट्रिंग्स नहीं बदलेगी।

सच सरल उदाहरण:

function GetFormula(cellname) { 
    return SpreadsheetApp.getActiveSheet().getRange(cellname).getFormula(); 
} 
मेरी चादर के कोड में इस के साथ

, मैं इस तरह सी 4 में सूत्र को पुनः प्राप्त कर सकते हैं: =GetFormula("C4")

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

कोई विचार?

+1

यहाँ एक समाधान है और एक समाधान है - '= GetFormula (ADDRESS (आरओडब्ल्यू (F8), स्तंभ (F8)))' – megabyte1024

+1

यही तो मैं चाहता हूँ, लेकिन, लड़के क्या करेंगे, यह बदसूरत है! अब, मुझे इसे किसी को भी समझा देना है, जो जानता है? – HardScale

+0

[webapps.se] पर संबंधित धागा: [Google स्प्रेडशीट्स में एक कस्टम फ़ंक्शन में सीमा कैसे पारित करें?] (Http://webapps.stackexchange.com/questions/10629/how-to-pass-a-range- इन-ए-कस्टम-फ़ंक्शन-इन-google-spreadsheets /) –

उत्तर

1

मैं इस पर कुछ महीने पहले काम कर रहा था और एक बहुत ही सरल kludge के साथ आया था: इसकी सामग्री के रूप में प्रत्येक कोशिका के नाम के साथ एक नया पत्रक बनाने: सेल A1 दिखाई दे सकता है जैसे:

= arrayformula(cell("address",a1:z500)) 

संपादित करें: उपरोक्त अब काम नहीं करता है। 'रेफरी' के लिए मेरा नया फॉर्मूला! ए 1

= ArrayFormula(char(64+column(A1:Z100))&row(A1:Z100)) 

शीट "रेफरी" नाम दें। फिर जब आप सामग्री के बजाय एक स्ट्रिंग के रूप में एक सेल के लिए एक संदर्भ की जरूरत है, तो आप का उपयोग करें:

= some_new_function('Ref'!C45) 
बेशक

, आप समारोह एक स्ट्रिंग (एक सेल) पारित कर दिया जाता है, तो जाँच करने के लिए की आवश्यकता होगी या एक 1 डी या 2 डी ऐरे। यदि आपको कोई सरणी मिलती है, तो इसमें सभी सेल पते स्ट्रिंग के रूप में होंगे, लेकिन पहले सेल और चौड़ाई और ऊंचाई से, आप यह जान सकते हैं कि आपको क्या चाहिए।

+0

आप कस्टम फ़ंक्शन के लिए _cell ("पता", a1: z500) _ पास कर सकते हैं और फिर वह फ़ंक्शन सेल सेल के रूप में स्ट्रिंग तर्क को 'सेल' ऑब्जेक्ट को पुनर्प्राप्त कर सकता है, अतिरिक्त शीट – mvidelgauz

+0

के लिए कोई आवश्यकता नहीं है मैंने नोट किया कि ओपी में। तारों को चारों ओर स्थानांतरित होने पर स्ट्रिंग्स अपडेट नहीं होते हैं। – HardScale

+0

सुनिश्चित नहीं है कि आपका क्या मतलब है। मैंने अभी एक फ़ंक्शन लागू किया है जिसे मैं इस तरह से कॉल करता हूं: _MyFunc (CELL ("पता", D17)) _ और जब मैं लक्ष्य सेल को स्थानांतरित करता हूं तो यह काम करता है ... – mvidelgauz

-2

जब आप कोई कस्टम समारोह पैरामीटर प्रकार Range की है, जिसे फिर आप मूल्यों लाने का उपयोग कर सकते करने के लिए एक सीमा के पास, आदि

संपादित: यह गलत है।

+1

यह सच है अगर मैं किसी अन्य फ़ंक्शन से फ़ंक्शन को कॉल करता हूं। लेकिन, अगर मैं किसी स्प्रेडशीट में फ़ंक्शन का उपयोग करता हूं, तो तर्क स्वचालित रूप से सेल की सामग्री में संदर्भित होता है। यदि आप मुझे एक स्प्रेडशीट फॉर्मूला का उदाहरण दे सकते हैं जो कस्टम फ़ंक्शन को कॉल करता है और उस फ़ंक्शन को रेंज पास कर सकता है, तो मैं वास्तव में आभारी रहूंगा। – HardScale

+0

मेरी माफी, मुझे गलत समझा गया था कि सीमा कैसे पारित की गई थी। आप सही हैं, केवल मूल्य पारित किए जाते हैं। –

3

(वेब ​​अनुप्रयोगों पर मेरे answer से)। कोई सक्रिय सेल में सूत्र को पार्स करके पारित सीमा का संदर्भ प्राप्त कर सकता है, जिसमें सूत्र है जिसमें सूत्र है। यह धारणा बनाता है कि कस्टम फ़ंक्शन का उपयोग स्वयं पर किया जाता है, न कि अधिक जटिल अभिव्यक्ति के हिस्से के रूप में: उदाहरण के लिए, =myfunction(A1:C3), =sqrt(4+myfunction(A1:C3)) नहीं।

विधि =myfunction(Sheet2!A3:B5) या =myfunction('Another Sheet'!B3:G7) जैसी अन्य चादरों के संदर्भों का भी समर्थन करती है।

डेमो के रूप में, यह फ़ंक्शन उत्तीर्ण सीमा की पहली कॉलम अनुक्रमणिका देता है। यह बिट फ़ंक्शन के बहुत अंत में है; इसमें से अधिकांश रेंज निष्कर्षण से संबंधित है।

function myfunction(reference) { 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var formula = SpreadsheetApp.getActiveRange().getFormula(); 
    var args = formula.match(/=\w+\((.*)\)/i)[1].split('!'); 
    try { 
    if (args.length == 1) { 
     var range = sheet.getRange(args[0]); 
    } 
    else { 
     sheet = ss.getSheetByName(args[0].replace(/'/g, '')); 
     range = sheet.getRange(args[1]); 
    } 
    } 
    catch(e) { 
    throw new Error(args.join('!') + ' is not a valid range'); 
    } 

    // everything so far was only range extraction 
    // the specific logic of the function begins here 

    var firstColumn = range.getColumn(); // or whatever you want to do with the range 
    return firstColumn; 
} 
संबंधित मुद्दे