Google पत्रक मल्टी-लाइन सेल को नई पंक्तियों में विभाजित करते हैं (+ आस-पास की पंक्ति प्रविष्टियों को डुप्लिकेट करते हैं)


15

मैं प्रत्येक व्यवसाय के लिए मुख्य कर्मचारियों सहित व्यवसाय पता जानकारी का एक डेटाबेस संकलित कर रहा हूं। इस परियोजना के लिए मुझे जो Google स्प्रेडशीट विरासत में मिली है, उसमें 'कुंजी कर्मचारी' (कॉलम B में) के लिए एक कॉलम शामिल है, जिसमें एक ही सेल में सूचीबद्ध कई प्रमुख कर्मचारियों के नाम, लाइन ब्रेक (यानी CHAR (10)) द्वारा अलग किए गए हैं। प्रति पंक्ति एक व्यवसाय है। 'की स्टाफ' सेल में लाइनों की संख्या पंक्ति-दर-पंक्ति बदलती है। मेरी प्रारंभिक शीट इस प्रकार है:

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

मुझे इस पत्रक को अनुकूलित करने के लिए निम्नलिखित करने की आवश्यकता है:

  1. प्रत्येक मल्टी-लाइन 'कुंजी स्टाफ' सेल को विभाजित करें ताकि प्रत्येक कुंजी कर्मचारी का नाम अपनी पंक्ति में दिखाई दे। इसके लिए आवश्यक है कि मूल पंक्ति के नीचे नई पंक्ति / एस डालें।
  2. मूल पंक्ति (स्तंभ A & C: E) से अन्य सभी कक्षों के डेटा की डुप्लिकेट करें, ताकि प्रत्येक नई पंक्ति में प्रत्येक व्यवसाय का पूरा डेटा हो
  3. मुझे एक स्वचालित प्रक्रिया की आवश्यकता है - मेरे पास लगभग 1000 व्यवसायों को संसाधित करने के लिए होगा ताकि किसी भी मैनुअल कदम के साथ ऐसा न किया जा सके

शीट को इस तरह दिखना चाहिए:

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

=TRANSPOSE(SPLIT(B1,CHAR(10)))स्पष्ट रूप से उपयोग करना केवल रास्ते का हिस्सा है - यह नई पंक्तियों को सम्मिलित नहीं करता है और आसपास के स्तंभ प्रविष्टियों की नकल नहीं करता है। सभी ने कृतज्ञतापूर्वक स्वीकार करने में मदद की!


जवाबों:


14

सबसे पहले, देर से जवाब के लिए खेद है, लेकिन मेरे पास आपके साथ काम करने के लिए एक समाधान है।

कोड

function result(range) {
  var output2 = [];
  for(var i=0, iLen=range.length; i<iLen; i++) {
    var s = range[i][1].split("\n");    
    for(var j=0, jLen=s.length; j<jLen; j++) {
      var output1 = []; 
      for(var k=0, kLen=range[0].length; k<kLen; k++) {
        if(k == 1) {
          output1.push(s[j]);
        } else {
          output1.push(range[i][k]);
        }
      }
      output2.push(output1);
    }    
  }
  return output2;
}

व्याख्या की

स्क्रिप्ट प्रत्येक पंक्ति का मूल्यांकन करती है, और विशेष रूप से प्रत्येक पंक्ति का दूसरा स्तंभ (जावास्क्रिप्ट सरणियों में शून्य आधारित है, इसलिए स्तंभ 2 सरणी के सूचकांक 1 से मेल खाता है)। यह उस सेल की सामग्री को कई मूल्यों "\n"में विभाजित करता है और सीमांकक (लाइन फीड) के रूप में उपयोग करता है । इसके बाद यह मौजूदा जानकारी को एक सरणी में जोड़ता है और केवल व्यक्तिगत परिणामों को जोड़ता है, जब यह सूचकांक 1 को हिट करता है ( k == 1)नई तैयार की गई पंक्ति को फिर दूसरे सरणी में जोड़ा जाता है, जो परिणाम दिखाने के लिए वापस आ रहा है।

स्क्रीनशॉट

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

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

उदाहरण

मैंने आपके लिए एक उदाहरण फ़ाइल बनाई है: नई पंक्तियों में बहु-पंक्ति कोशिकाएँउपकरण> स्क्रिप्ट संपादक के
तहत स्क्रिप्ट जोड़ें और सहेजें बटन दबाएं।


2
बहुत बढ़िया भयानक - इस आदमी को एक बीयर खरीदो! कई धन्यवाद याकूब, कि वास्तव में मुझे क्या चाहिए।
kirk टैब

2
और सीमा को कैसे परिभाषित किया जाए? (यह संदेश अपरिभाषित से "संपत्ति" लंबाई "नहीं पढ़ सकते हैं" धन्यवाद!
user2060451

वास्तव में बड़ी फ़ाइल पर, यह संभवतया विफल हो जाएगा ... परिणाम बहुत बड़ा है।
काइल पेनेल

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

3

एक दोहराने योग्य समाधान के लिए एक स्क्रिप्ट की आवश्यकता होगी।

लेकिन एक बार के प्रयास के लिए, आप बस इस्तेमाल कर सकते हैं =SPLIT(B3,CHAR(10))। यह आपको इस तरह से सभी व्यक्ति के नाम साइड-बाय-साइड हेल्पर कॉलम में देगा:

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

कॉपी / पेस्ट-विशेष, सहायक-स्तंभ सामग्री को महत्व देता है।

और उपयोग किए जाने वाले प्रत्येक सहायक कॉलम के लिए (उम्मीद से बहुत अधिक नहीं, 'उम्मीद है कि आपके पास किसी एक व्यवसाय में बहुत अधिक लोग नहीं हैं) वर्तमान ब्लॉक के अंत में पंक्तियों के ब्लॉक को मैन्युअल रूप से कॉपी-पेस्ट करें। (यह एक महान विवरण नहीं है, लेकिन आपको बहाव मिलता है।)


हाय मैरी, धन्यवाद, लेकिन मैं की जरूरत है। व्यक्ति के नाम नई ROWS में, (अतिरिक्त पंक्तियों के साथ ऑटो-जेनरेट करने के लिए उन्हें समायोजित करने के लिए), फिर आसपास की जानकारी को नए 'व्यक्ति' कोशिकाओं के पास कॉपी किया गया। और मुझे 100% स्वचालित प्रक्रिया की आवश्यकता है - मैं मैन्युअल रूप से एक हजार या-तो व्यवसायों के लिए ऐसा नहीं कर सकता!
kirk टैब

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

1
कोई व्यक्ति इसके लिए एक स्क्रिप्ट लिख सकता है (मैं ऐसा कोई नहीं हूँ!) - लेकिन वास्तव में समय बिताए हुए परीक्षण शायद इसे मैन्युअल रूप से करने में लगने वाले समय से अधिक होगा।
मैरीक.फ्रॉमएनजेड

2

उन लोगों के लिए जो तुरंत स्वीकार किए गए उत्तर में सहायक कस्टम फ़ंक्शन का उपयोग करने के लिए समझ नहीं सकते हैं :

  • आपको एक से अधिक शीट की आवश्यकता है, उदाहरण में दो शीट हैं DATAऔर RESULTRESULTशीट खाली जब तक क्वेरी चलाने की गई है। आप DATAयाकूब के स्क्रीनशॉट में शीट को संदर्भित क्वेरी देख सकते हैं ।

  • आपको kलाइन 8 के लिए तुलना मूल्य को संशोधित करने की आवश्यकता होगी जो उस स्तंभ को संदर्भित करता है जहां आपका डेटा पार्स करना चाहिए। उसी संख्या को पंक्ति 4 पर 2 सरणी मूल्य में जाने की आवश्यकता होगी।

  • आपको लाइन 4 पर परिसीमन को संशोधित करने की आवश्यकता हो सकती है जो वर्तमान में है \n

इस सब को एक नन्हा सा आसान बनाने के लिए, मैंने एक ही कोड लिया और फ़ंक्शन के शीर्ष पर सेट किए गए चर में सीमांकक और लक्ष्य कॉलम को निकाला । जैसा कि याकूब लक्ष्य कॉलम की गिनती पहले नंबर के रूप में 0 से शुरू करता है।

function result(range) {
  delimiter = ", "
  targetColumn = 10

  var output2 = [];
  for(var i=0, iLen=range.length; i<iLen; i++) {
    var s = range[i][targetColumn].split(delimiter);    
    for(var j=0, jLen=s.length; j<jLen; j++) {
      var output1 = []; 
      for(var k=0, kLen=range[0].length; k<kLen; k++) {
        if(k == targetColumn) {
          output1.push(s[j]);
        } else {
          output1.push(range[i][k]);
        }
      }
      output2.push(output1);
    }    
  }
  return output2;
}

संदर्भ


1
यदि मैं कोड चलाता हूं, तो यह कहता है: टाइपर्रर: अपरिभाषित से संपत्ति "लंबाई" नहीं पढ़ सकता है। बहुत बहुत धन्यवाद। उत्तर यहां होना चाहिए: उत्तर यहां कहीं भी होना चाहिए (Developers.google.com/apps-script/reference/spreadsheet/…) लेकिन मैं एक ही त्रुटि रखता हूं।
user2060451

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