Google ชีตแบ่งเซลล์หลายบรรทัดเป็นแถวใหม่ (+ ซ้ำรายการแถวโดยรอบ)


15

ฉันกำลังรวบรวมฐานข้อมูลของข้อมูลที่อยู่ธุรกิจรวมถึงพนักงานคนสำคัญสำหรับแต่ละธุรกิจ สเปรดชีตของ Google ที่ฉันได้รับสำหรับโครงการนี้มีคอลัมน์สำหรับ 'พนักงานหลัก' (ในคอลัมน์ B) โดยมีชื่อพนักงานคีย์หลายคนที่ระบุไว้ในเซลล์เดียวกันโดยคั่นด้วยตัวแบ่งบรรทัด (เช่น CHAR (10)) มีหนึ่งธุรกิจต่อแถว จำนวนบรรทัดในเซลล์ 'พนักงานคีย์' จะแตกต่างกันไปในแต่ละแถว แผ่นงานเริ่มต้นของฉันมีลักษณะเช่นนี้:

ป้อนคำอธิบายรูปภาพที่นี่

ฉันต้องทำสิ่งต่อไปนี้เพื่อปรับแต่งชีตนี้:

  1. แยกแต่ละเซลล์ 'พนักงานคีย์' หลายบรรทัดดังนั้นชื่อพนักงานคีย์แต่ละคนจะปรากฏในแถวของตัวเอง ต้องการให้แทรกแถวใหม่ใต้แถวเดิม
  2. ทำซ้ำข้อมูลจากเซลล์อื่นทั้งหมดในแถวเดิม (เช่นจากคอลัมน์ A & C: E) เพื่อให้แต่ละแถวใหม่มีข้อมูลเต็มรูปแบบสำหรับแต่ละธุรกิจ
  3. ฉันต้องการกระบวนการอัตโนมัติ - ฉันมีธุรกิจประมาณ 1,000 แห่งในการดำเนินการดังนั้นจึงไม่สามารถทำได้ด้วยขั้นตอนที่ต้องทำด้วยตนเอง

แผ่นควรมีลักษณะเช่นนี้:

ป้อนคำอธิบายรูปภาพที่นี่

การใช้=TRANSPOSE(SPLIT(B1,CHAR(10)))เห็นได้ชัดว่าเป็นเพียงส่วนหนึ่งเท่านั้น - มันไม่ได้แทรกแถวใหม่และไม่ได้ทำซ้ำรายการคอลัมน์โดยรอบ ความช่วยเหลือทั้งหมดได้รับการยอมรับอย่างสุดซึ้ง!


ที่เกี่ยวข้อง: webapps.stackexchange.com/questions/88517/…
Rubén

คำตอบ:


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;
}

อธิบาย

สคริปต์ประเมินแต่ละแถวและโดยเฉพาะอย่างยิ่งคอลัมน์ที่สองของแต่ละแถว (ในอาร์เรย์ JavaScript มีค่าเป็นศูนย์ดังนั้นคอลัมน์ 2 จะสอดคล้องกับดัชนี 1 ของอาร์เรย์) มันแยกเนื้อหาของเซลล์นั้นออกเป็นหลายค่าและใช้"\n"เป็นตัวคั่น (ตัวดึงข้อมูลบรรทัด) หลังจากนั้นจะเพิ่มข้อมูลที่มีอยู่ในอาร์เรย์และเพิ่มเฉพาะผลลัพธ์แต่ละรายการเมื่อพบดัชนี 1 ( k == 1)จากนั้นแถวที่เพิ่งจัดเตรียมใหม่จะถูกเพิ่มไปยังอาร์เรย์อื่นซึ่งจะถูกส่งกลับเพื่อแสดงผลลัพธ์

ภาพหน้าจอ

ข้อมูล
ป้อนคำอธิบายรูปภาพที่นี่

ผลลัพธ์
ป้อนคำอธิบายรูปภาพที่นี่

ตัวอย่าง

ฉันได้สร้างไฟล์ตัวอย่างสำหรับคุณ: เซลล์หลายสายเข้าแถวใหม่
เพิ่มสคริปต์ภายใต้เครื่องมือ> เครื่องมือแก้ไขสคริปต์และกดปุ่มบันทึก


2
สุดยอดมาก ๆ - ซื้อเบียร์ให้คนนี้! ขอบคุณมากจาค็อบนั่นคือสิ่งที่ฉันต้องการ
โบสถ์แท็บ

2
และวิธีการกำหนดช่วง? (รับข้อความนี้ "ไม่สามารถอ่านคุณสมบัติ" ความยาว "จากไม่ได้กำหนด" ขอบคุณ!
user2060451

ในไฟล์ขนาดใหญ่จริง ๆ สิ่งนี้อาจล้มเหลว ... ส่งผลให้ใหญ่เกินไป
Kyle Pennell

ตอบได้อย่างยอดเยี่ยมเพียงข้อผิดพลาดเดียว คอลัมน์แรกในช่วงที่กำหนดไม่ควรมีตัวคั่น วิธีแก้ปัญหาชั่วคราวคือการมี serial numbes หรือค่าคงที่เป็นคอลัมน์แรก ไม่ได้ลอง แต่คอลัมน์ว่างคอลัมน์แรกควรแก้ปัญหาด้วย
Ashish Singh

3

โซลูชันที่ทำซ้ำได้จะต้องมีสคริปต์

=SPLIT(B3,CHAR(10))แต่สำหรับความพยายามครั้งเดียวคุณก็สามารถใช้ สิ่งนี้จะให้ชื่อของบุคคลทั้งหมดในคอลัมน์ผู้ช่วยเหลือแบบเคียงข้างกันดังนี้:

ป้อนคำอธิบายรูปภาพที่นี่

คัดลอก / วางพิเศษค่าเนื้อหาผู้ช่วยคอลัมน์

และสำหรับผู้ช่วยคอลัมน์แต่ละคอลัมน์ที่ใช้ (หวังว่าจะไม่มากเกินไป 'เพราะหวังว่าคุณจะไม่มีคนมากเกินไปในธุรกิจใดธุรกิจหนึ่ง) ด้วยตนเองคัดลอกและวางบล็อกแถวไปยังจุดสิ้นสุดของบล็อกปัจจุบัน (นั่นไม่ได้เป็นคำอธิบายที่ดี แต่คุณได้รับการเลื่อน)


สวัสดีแมรี่ขอบคุณ แต่ฉันต้องการคนในใจ ชื่อบุคคลตกอยู่ใน ROWS ใหม่ (พร้อมแถวพิเศษที่สร้างขึ้นอัตโนมัติเพื่อรองรับพวกเขา) จากนั้นข้อมูลที่อยู่รอบ ๆ จะถูกคัดลอกไว้ข้างเซลล์ 'person' ใหม่ และฉันต้องการกระบวนการอัตโนมัติ 100% - ฉันไม่สามารถทำสิ่งนี้ได้ด้วยตนเองสำหรับธุรกิจที่มีอยู่นับพัน!
แท็บเคิร์ก

คุณไม่จำเป็นต้องทำขั้นตอนแบบแมนนวลสำหรับธุรกิจทั้งพัน คุณต้องทำเพื่อจำนวน pepole สูงสุดที่เกี่ยวข้องกับธุรกิจใดธุรกิจหนึ่งเท่านั้น: เช่นหากธุรกิจหนึ่งมีหกคนจากนั้นจะมีคอลัมน์ผู้ช่วยใหม่หกคอลัมน์ที่สร้างขึ้นดังนั้นคุณต้องคัดลอกและวางด้วยตนเอง หกครั้งหนึ่งสำหรับแต่ละคอลัมน์
MaryC.fromNZ

1
บางคนสามารถเขียนสคริปต์สำหรับสิ่งนี้ (ฉันไม่ใช่คนที่!) - แต่จริงๆแล้วเวลาที่ใช้ในการทดสอบมันอาจจะมากกว่าเวลาที่ใช้ทำมันด้วยตนเอง
MaryC.fromNZ

2

สำหรับผู้ที่อาจไม่เข้าใจวิธีใช้ฟังก์ชันกำหนดเองที่มีประโยชน์ในคำตอบที่ยอมรับได้ทันที :

  • คุณจำเป็นต้องมีมากกว่าหนึ่งแผ่นในตัวอย่างที่สองแผ่นมีและDATA แผ่นว่างเปล่าจนกระทั่งข้อความค้นหาที่ได้รับการเรียกใช้ คุณสามารถดูข้อความค้นหาที่อ้างถึงชีตในสกรีนช็อตของ JacobRESULTRESULTDATA

  • คุณจะต้องแก้ไขค่าการเปรียบเทียบสำหรับkบรรทัดที่ 8 ซึ่งหมายถึงคอลัมน์ที่ควรพบข้อมูลของคุณในการแยกวิเคราะห์ หมายเลขเดียวกันจะต้องเข้าไปในค่าอาร์เรย์ที่ 2 ในบรรทัดที่ 4

  • คุณอาจจำเป็นต้องแก้ไขตัวคั่นในบรรทัดที่ 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
ถ้าฉันเรียกใช้รหัสมันบอกว่า: TypeError: ไม่สามารถอ่านคุณสมบัติ "ความยาว" จากไม่ได้กำหนด ขอบคุณมาก. คำตอบควรอยู่ที่นี่: คำตอบต้องอยู่ที่นี่ (developers.google.com/apps-script/reference/spreadsheet/…) แต่ฉันยังคงมีข้อผิดพลาดเดิมอยู่เรื่อย ๆ
user2060451

@ user2060451 คำตอบนี้แสดงให้เห็นถึงรหัสของฟังก์ชั่นที่กำหนดเองมันไม่ได้ตั้งใจที่จะเรียกใช้จากโปรแกรมแก้ไขสคริปต์ ฉันเพิ่มลิงก์ไปยังคู่มือฟังก์ชั่นที่กำหนดเองจาก Google
Rubén
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.