Google Sheets teilen mehrzeilige Zellen in neue Zeilen auf (+ doppelte umgebende Zeileneinträge)


13

Ich erstelle eine Datenbank mit Geschäftsadressinformationen, einschließlich der wichtigsten Mitarbeiter für jedes Unternehmen. Die Google-Tabelle, die ich für dieses Projekt geerbt habe, enthält eine Spalte für "Schlüsselpersonal" (in Spalte B), in der mehrere Schlüsselpersonalnamen in derselben Zelle aufgeführt sind, die durch Zeilenumbrüche getrennt sind (dh CHAR (10)). Es gibt ein Geschäft pro Zeile. Die Anzahl der Zeilen in der Zelle "Schlüsselpersonal" variiert zeilenweise. Mein erstes Blatt sieht so aus:

Geben Sie hier die Bildbeschreibung ein

Ich muss Folgendes tun, um dieses Blatt zu optimieren:

  1. Teilen Sie jede mehrzeilige 'Schlüsselstab'-Zelle so auf, dass jeder Schlüsselstabname in einer eigenen Zeile angezeigt wird. Dies erfordert, dass neue Zeilen unter die ursprüngliche Zeile eingefügt werden.
  2. Duplizieren Sie die Daten aus allen anderen Zellen in der ursprünglichen Zeile (dh aus den Spalten A und C: E), sodass jede neue Zeile die vollständigen Daten für jedes Unternehmen enthält
  3. Ich brauche einen automatisierten Prozess - ich muss ungefähr 1000 Unternehmen verarbeiten, kann dies also nicht mit manuellen Schritten tun

Das Blatt sollte dann so aussehen:

Geben Sie hier die Bildbeschreibung ein

Die Verwendung ist =TRANSPOSE(SPLIT(B1,CHAR(10)))offensichtlich nur ein Teil des Weges - es werden keine neuen Zeilen eingefügt und die umgebenden Spalteneinträge werden nicht dupliziert. Alle Hilfe dankbar angenommen!


Antworten:


13

Entschuldigen Sie zunächst die späte Antwort, aber ich habe eine Lösung, mit der Sie arbeiten können.

Code

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

Erklärt

Das Skript wertet jede Zeile und insbesondere die zweite Spalte jeder Zeile aus (in JavaScript basieren Arrays auf Null, sodass Spalte 2 dem Index 1 des Arrays entspricht). Es teilt den Inhalt dieser Zelle in mehrere Werte auf und verwendet das "\n"als Trennzeichen (Zeilenvorschub). Danach werden die vorhandenen Informationen zu einem Array hinzugefügt und die einzelnen Ergebnisse erst hinzugefügt, wenn Index 1 erreicht wird k == 1). Die neu vorbereitete Zeile wird dann zu einem anderen Array hinzugefügt, das zurückgegeben wird, um das Ergebnis anzuzeigen.

Bildschirmfoto

Daten
Geben Sie hier die Bildbeschreibung ein

Ergebnis
Geben Sie hier die Bildbeschreibung ein

Beispiel

Ich habe eine Beispieldatei für Sie erstellt: Mehrzeilige Zellen in neue Zeilen .
Fügen Sie das Skript unter Extras> Skripteditor hinzu und klicken Sie auf die Schaltfläche Speichern.


2
Super super genial - kauf diesem Mann ein Bier! Vielen Dank Jacob, genau das brauche ich.
Kirk Tab

2
Und wie definiert man den Bereich? (
Erhalten

Bei einer wirklich großen Datei wird dies wahrscheinlich fehlschlagen ... Ergebnis zu groß.
Kyle Pennell

3

Eine wiederholbare Lösung benötigt ein Skript.

Aber für eine einmalige Anstrengung könnten Sie einfach verwenden =SPLIT(B3,CHAR(10)). Auf diese Weise erhalten Sie alle Namen der Person in Hilfsspalten nebeneinander wie folgt:

Geben Sie hier die Bildbeschreibung ein

Copy / Paste-special, bewertet den Inhalt der Hilfsspalte.

Und für jede verwendete Hilfsspalte (hoffentlich nicht zu viele, weil Sie hoffentlich nicht zu viele Personen in einem Unternehmen haben) kopieren Sie den Zeilenblock manuell und fügen Sie ihn bis zum Ende des aktuellen Blocks ein. (Das ist keine gute Beschreibung, aber Sie bekommen die Drift.)


Hallo Mary, danke, aber ich brauche den Einzelnen. Personennamen wurden in neue REIHEN eingefügt (mit zusätzlichen Zeilen, die automatisch generiert wurden, um sie aufzunehmen), und dann wurden die umgebenden Informationen neben die neuen 'Personen'-Zellen kopiert. Und ich brauche einen 100% automatisierten Prozess - ich kann dies für ungefähr tausend Unternehmen nicht manuell tun!
Kirk Tab

Sie müssen den manuellen Schritt nicht für die ganzen tausend Unternehmen ausführen. Sie müssen dies nur für die maximale Anzahl von Personen tun, die einem dieser Unternehmen zugeordnet sind: Wenn in einem Unternehmen beispielsweise sechs Personen beschäftigt sind, werden sechs neue Hilfsspalten erstellt, sodass Sie manuell kopieren und einfügen müssen sechsmal, eine für jede Spalte.
MaryC.fromNZ

1
Jemand könnte ein Skript dafür schreiben (ich bin nicht dieser Jemand!) - aber tatsächlich wäre der Zeitaufwand für das Testen wahrscheinlich größer als der Zeitaufwand für die manuelle Ausführung.
MaryC.fromNZ

2

Für Leute, die möglicherweise nicht sofort verstehen, wie die hilfreiche benutzerdefinierte Funktion in der akzeptierten Antwort verwendet wird :

  • Sie benötigen mehr als ein Blatt, im Beispiel sind die beiden Blätter DATAund RESULT. Das RESULTBlatt ist leer, bis die Abfrage ausgeführt wurde. Sie können die Abfrage sehen, die sich auf das DATABlatt in Jacobs Screenshot bezieht .

  • Sie müssen höchstwahrscheinlich den Vergleichswert für kZeile 8 ändern, der sich auf die Spalte bezieht, in der Ihre zu analysierenden Daten gefunden werden sollen. Die gleiche Zahl muss in den 2. Array-Wert in Zeile 4 eingegeben werden.

  • Möglicherweise müssen Sie das Trennzeichen in Zeile 4 ändern, das sich derzeit befindet \n

Um dies alles ein bisschen einfacher zu machen, habe ich denselben Code verwendet und das Trennzeichen und die Zielspalte in Variablen extrahiert, die oben in der Funktion festgelegt sind. Wie Jacob erwähnt, beginnt die Anzahl der Zielspalten mit 0 als erster Zahl.

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

Verweise


1
Wenn ich den Code ausführe, heißt es: TypeError: Die Eigenschaft "Länge" kann nicht von undefiniert gelesen werden. ich danke dir sehr. Die Antwort sollte hier sein: Die Antwort muss irgendwo hier sein (developer.google.com/apps-script/reference/spreadsheet/…), aber ich habe immer den gleichen Fehler.
user2060451

@ user2060451 Die Lösung für diese Antwort zeigt den Code der benutzerdefinierten Funktion. Sie soll nicht über den Skripteditor ausgeführt werden. Ich habe einen Link zum benutzerdefinierten Funktionshandbuch von Google hinzugefügt.
Rubén
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.