2012-12-15 14 views
7

मैं स्प्रेडशीट के लिए कस्टम फ़ंक्शंस बनाने के लिए Google Apps स्क्रिप्ट का उपयोग करना चाहता हूं। मैंने एक बेहद सरल कार्य किया है:सेवा बहुत बार टाइम्स (Google Apps स्क्रिप्ट)

function foo(){ 
    return "bar"; 
}; 

समस्या यह है कि मुझे इस कार्य को दो सौ कोशिकाओं में चाहिए। जब मैं इन सभी कक्षों में फ़ंक्शन =foo() फ़ंक्शन पेस्ट करता हूं, तो फ़ंक्शन कुछ कक्षों में काम करता है, लेकिन अधिकांश में मुझे यह त्रुटि मिलती है: "सेवा कई बार आती है: स्प्रेडशीट। कॉल के बीच Utilities.sleep(1000) आज़माएं।"

[Screenshot here]

मुझे लगता है कि क्यों इस समारोह, सरल रूप में यह है, स्प्रेडशीट सेवा की एक मंगलाचरण माना जाता है मुझे समझ नहीं आता। मैं किसी भी डेटा का अनुरोध भी नहीं कर रहा हूं (फ़ंक्शन को छोड़कर)। क्या यह समस्या है? और यदि हां, तो क्या कोई कामकाज है? कस्टम फ़ंक्शंस Google स्प्रेडशीट्स को असीम रूप से अधिक शक्तिशाली बना सकता है, लेकिन यह समस्या एकाधिक कोशिकाओं में कस्टम फ़ंक्शन का उपयोग करने की संभावना को रोकती है। सुझाव?

(पी एस - के रूप में त्रुटि संदेश ने सुझाव दिया जब कोशिकाओं के सभी एक साथ उनके कार्यों फोन बिल्कुल मदद नहीं करता है Utilities.sleep() समारोह का उपयोग करना;। यह केवल जिस दर पर व्यक्तिगत कोशिकाओं को बार-बार फ़ंक्शन को कॉल धीमा कर देती है)

उत्तर

1

फ़्रेडशीट में फ़ंक्शन को कॉल करके, आप अपने फ़ंक्शन के परिणामों को चलाने के लिए सर्वर पर राउंड-ट्रिप जाने के लिए स्प्रेडशीट सेवा का आह्वान कर रहे हैं। नतीजतन, आपने बहुत कम समय में कुछ सौ अनुरोध किए हैं।

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

आपके फ़ंक्शन को पूरा करने का प्रयास करने के आधार पर, यह स्प्रेडशीट फ़ंक्शंस में निर्मित का उपयोग करने योग्य हो सकता है। वहाँ बहुत सारी शक्ति है। एक फ़ंक्शन लिखना जो एकल सेल की बजाय मानों की एक श्रृंखला पर कार्य करता है, एक और बेहतर, विकल्प हो सकता है। इसे एक कस्टम मेनू आइटम, या स्क्रिप्ट प्रबंधक का उपयोग करके ट्रिगर किया जा सकता है।

ध्यान रखें, जब स्प्रेडशीट के साथ काम करने की बात आती है तो बैच क्रियाएं आपके सबसे अच्छे दोस्त हैं।

+0

मुझे लगता है कि

इस तरह आपके मामले में

तो मुझे अपने प्रश्न में अपने अंतिम उद्देश्य के बारे में और अधिक पता होना चाहिए था। संक्षेप में, मैंने एक ऐसा फ़ंक्शन लिखा है जो "3 डी" योग (चादरों में एक योग) करता है।जबकि मुझे पता है कि आप अंतर्निहित कार्यों के साथ ऐसा कर सकते हैं, समस्या यह है कि मैं चादरें साप्ताहिक आधार पर जोड़ता हूं, जिसका अर्थ है कि मुझे नई शीट्स को शामिल करने के लिए उन कार्यों को वापस लेना और अपडेट करना होगा। जो मैं चाहता था वह सिर्फ एक ऐसा कार्य था जिसने सभी चादरों से मूल्यों को उठाया और हर हफ्ते समारोह को अपडेट किए बिना अपना योग वापस कर दिया। – jrc03c

+0

और मेरे पास एक और सवाल है: मेरे प्रश्न में एक साधारण कार्य के लिए एक सर्वर आवश्यक क्यों है? इस तरह की साधारण चीजों को क्लाइंट-साइड की गणना क्यों नहीं की जा सकती और फिर कोशिकाओं में धक्का दिया जा सकता है (या कम से कम स्प्रेडशीट पर एचयूडी की तरह दिखाया गया है)? मैं मानता हूं कि यह प्रक्रिया सभी प्रकार की अनुमतियों और सुरक्षा प्रश्नों का कारण बनती है, लेकिन क्या Google Apps स्क्रिप्ट्स में पहले से ही उपयोगकर्ता डेटा के साथ झुकाव से पहले अनुमति मांगने की क्षमता नहीं है? – jrc03c

+0

कृपया इस "3 डी" राशि की प्रकृति, या अधिक सहायता के लिए कुछ उदाहरण कोड के रूप में अधिक जानकारी प्रदान करें। Google Apps स्क्रिप्ट में जो कोड आप लिखते हैं वह अनिवार्य रूप से सर्वर-साइड कोड है। यह स्प्रेडशीट का हिस्सा नहीं है। मैं शर्त लगा रहा हूं कि यह एक सेवा की तरह काम करता है। प्रत्येक स्क्रिप्ट को अपना छोटा डेटाबेस दिया जाता है, इसमें सीपीयू भत्ते, टाइमआउट प्रतिबंध इत्यादि हैं। स्प्रेडशीट फ़ंक्शन के रूप में "' = "बार" 'का उपयोग करने के बजाय बहुत कुछ चल रहा है। भले ही, मुझे यकीन है कि एक तरीका है इन प्रतिबंधों को मारने के बिना अपना योग पूरा करने के लिए। – fooby

9

Apps स्क्रिप्ट का समारोह गाइड पर Optimization section के अनुसार:

Each time a custom function is used in a spreadsheet, Google Sheets makes a separate call to the Apps Script server. If your spreadsheet contains dozens (or hundreds, or thousands!) of custom function calls, this process can be quite slow.

Consequently, if you plan to use a custom function multiple times on a large range of data, consider modifying the function so that it accepts a range as input in the form of a two-dimensional array, then returns a two-dimensional array that can overflow into the appropriate cells.

ऐसा करने के लिए, एक इनपुट कि सरणी आप वापस आना चाहते हैं के आकार का प्रतिनिधित्व करता है में गुजरती हैं। जब आप अपने फ़ंक्शन को निष्पादित करना प्रारंभ करते हैं तो जांच करें कि इनपुट पैरामीटर input.map के साथ एक सरणी है या नहीं। यदि ऐसा है, तो आप प्रत्येक आइटम पर फ़ंक्शन को कॉल कर सकते हैं और उस पूरे संग्रह को वापस कर सकते हैं।

function foo(){ 
    return "bar"; 
}; 

आप इस तरह समारोह अद्यतन कर सकते हैं:

function foo(input){ 
    if (input.map) {   // Test whether input is an array. 
    return input.map(foo); // Recurse over array if so. 
    } else { 
    // do actual function work here 
    return "bar"; 
    } 
}; 

और फिर इसे इस तरह कहते हैं:

screenshot

+0

यदि 'foo' फ़ंक्शन एकाधिक तर्क लेता है लेकिन केवल पहला तर्क एक सरणी हो सकता है, तो क्या रिकर्स का एक समान तरीका है सरणी पर भी ई? – Argyll

संबंधित मुद्दे