Konvertierung von Text in Spalten in Google Spreadsheets

32

Wie führen Sie eine Konvertierung von Text in Spalten in Google Spreadsheets durch?

Beispielsweise habe ich die folgende Datenzeichenfolge in einer Zelle:

5,233,6,2,6,7,2,2,6,6

Ich möchte es durch das Komma-Trennzeichen in Spalten aufteilen.

Bearbeiten: Ich habe die akzeptierte Antwort in eine Antwort geändert, die Google Apps Scripting nicht verwendet, da Google offensichtlich darauf aus ist, seine Fähigkeiten zu verfeinern.

Evan Scholle
quelle
Warum haben Sie das Google-Apps-Skript-Tag hinzugefügt? Hat eine der Antworten gepasst?
Jacob Jan Tuinstra
1
@JacobJanTuinstra Da die Funktion über Google Apps Scripting hinzugefügt werden kann. Am Ende habe ich mein eigenes Problem gelöst, indem ich ein 'Text To Columns'-Skript geschrieben habe, das jetzt in der Skriptgalerie zu finden ist. Googlegooru hat auch ein Video-Tutorial gepostet, das seine Verwendung hier demonstriert : googlegooru.com/text-columns-google-spreadsheets .
Evan Plaice
Was ist der Unterschied zu der Lösung bereits von Google - Tabelle zur Verfügung gestellt: SPLIT. Dass die Werte gesetzt sind? Sie können bekannte Werte einfügen.
Jacob Jan Tuinstra
@JacobJanTuinstra Versuchen Sie in Ihrer ersten Lösung, B2 nach B3 zu kopieren. Die Ergebniszellen enthalten Fortsetzungsformeln, keine Rohdaten. Die vom Skript ausgegebenen Zellen enthalten die eigentlichen Rohdaten, sodass sie problemlos kopiert / verschoben werden können. Mit dieser Frage soll eine Entsprechung zur Funktion "Text in Spalten" von Excel gefunden werden. Bis Google offiziell Unterstützung hinzufügt, ist das Skript so nah wie möglich.
Evan Plaice
1
@ Rubén Soviel zur Stabilität. Ich habe vorher nachgesehen und hatte den Eindruck, dass das Scripting komplett weg ist. Es stellte sich heraus, dass sie nur die Drehbuchgalerie getötet haben. Ich gehe mit der Antwort, die Sie empfohlen haben, weil es die einfachste skriptfähige Lösung ist. Danke für die Rückmeldung.
Evan Plaice

Antworten:

14

Die folgende Formel macht genau das; Text in Spalte:

A1=5,233,6,2,6,7,2,2,6,6
A2=SPLIT(A1;",")

Und der nächste; Text in Zeile:

A1=5,233,6,2,6,7,2,2,6,6
A2=TRANSPOSE(SPLIT(A1;","))

UPDATE 03-02-2013
Wenn Sie das Ergebnis von aufteilen A1und die Werte einfügen, erhalten Sie dasselbe Ergebnis wie alle Codezeilen, die in der Antwort des OP verwendet werden. Ich habe es auch mit Google Apps Script ausprobiert und Folgendes erstellt: Text in Spalte

function mySplit() {
  var sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var cell = sh.getActiveCell().getValues()[0];
  var sCell = cell[0].split(",");
  var row = sh.getActiveCell().getRowIndex();
  var col = sh.getActiveCell().getColumnIndex();

  sh.getRange(row,col+1,1,sCell.length).setValues([sCell]);  
}

Ich benutze einfach die eingebaute Split-Funktion, um das Ergebnis zu teilen und es dem Blatt hinzuzufügen, nicht mehr und nicht weniger.

Jacob Jan Tuinstra
quelle
Schön ... Wie nennt man das, ohne die Benutzeroberfläche zu erweitern? Können Sie ein kurzes Beispiel hinzufügen, das die Verwendung demonstriert?
Evan Plaice
17

Nutzen Sie Google Apps Scripting, um die Benutzeroberfläche zu erweitern

Text in Spalten ist eine sehr praktische Funktion und einer der Gründe, warum viele Benutzer von Google Spreadsheet wieder Excel verwenden. Bis sich Google dazu entschließt, das Feature offiziell zu unterstützen, kann diese Lösung als Polyfill verwendet werden, um die Funktionalität zu erweitern.

Hier ist der Code:

function onOpen() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var menuEntries = [];
  menuEntries.push({ name:"Text to columns", functionName:"textToColumns" });
  menuEntries.push({ name:"Text to columns (custom separator)", functionName:"textToColumnsCustom" });
  menuEntries.push(null);
  menuEntries.push({ name:"Columns to Text", functionName:"columnsToText" });
  menuEntries.push({ name:"Columns to Text (custom separator)", functionName:"columnsToTextCustom" });
  ss.addMenu("Advanced", menuEntries);
}

function textToColumnsCustom() {
  var separator = Browser.inputBox("Text to column","Enter the the separator",Browser.Buttons.OK);
  textToColumns(separator);
}

function columnsToTextCustom() {
  var separator = Browser.inputBox("Column to text","Enter the the separator",Browser.Buttons.OK);
  columnsToText(separator);
}

// Expands a single cell of CSV formatted text to multiple columns
function textToColumns(separator) {
  var sep = typeof(separator) !== 'undefined' ? separator : ',';
  var ss = SpreadsheetApp.getActiveSheet(); 
  var r = ss.getActiveRange();
  // check that only one column was selected
  var col = r.getColumn(); 
  if(col !== r.getLastColumn()) {
    Browser.msgBox("Error", "Invalid selection, too many columns.", Browser.Buttons.OK);
    return;
  }  
  var firstRow = r.getRow();
  // short cut the one row selection
  if(firstRow === r.getLastRow()) {
    var values = r.getValues().toString().split(sep);
    ss.getRange(firstRow,col+1,1,values.length).setValues(new Array(values));
    return;
  } else {
    var rows = r.getValues();
    var values = [];
    var cols = 0;
    for(var i = 0, len = rows.length; i < len; i++) {
      var rowValues = rows[i].toString().split(sep); 
      var rowValuesLen = rowValues.length;
      if(cols < rowValuesLen) { cols = rowValuesLen; }
      values.push(rowValues);
    }
    // set all values at once (padding required because setValues doesn't accept jagged 2d arrays)
    padRow(values, cols);
    ss.getRange(firstRow,col+1,values.length,cols).setValues(values);
  }
}

// Pads a row with empty values to the specified length
function padRow(array, length) {
  for(var i = 0; i < array.length; i++) {
    var arrLen = array[i].length;
    if(arrLen < length) {
      var padLen = length - arrLen;
      var padding = new Array(padLen);
      array[i].push.apply(array[i], padding);
      for(var j = 0, len = array[i].length; j < len; j++) {
        if(typeof(array[i][j]) === 'undefined') {
          array[i][j] = "";
        }
      }
    }
  }
  return array;
}

function columnsToText(separator) {
  var sep = typeof(separator) !== 'undefined' ? separator : ',';
  var ss = SpreadsheetApp.getActiveSheet(); 
  var r = ss.getActiveRange();
  var col = r.getColumn();  
  var firstRow = r.getRow();
  var rows = r.getValues();
  var values = [];
  for(var i = 0, len = rows.length; i < len; i++) {
    var value = rows[i].join(sep);
    values[i] = [value];
  }
  col -= 1;
  ss.getRange(firstRow,col,values.length,1).setValues(values);
}

Speichern und schließen Sie den Skripteditor. Aktualisieren Sie dann die Kalkulationstabelle. Das Laden dauert eine Sekunde, aber in der Symbolleiste sollte nach "Hilfe" ein Menü mit dem Namen "Erweitert" angezeigt werden.

Verwendung:

  • Wählen Sie die Zelle (n) mit den zu teilenden Werten aus
  • Wählen Sie ErweitertText in Spalten

Das ist es. Sie können einen Split auch mithilfe eines benutzerdefinierten Trennzeichens (über 'Text in Spalten (Benutzerdefiniert)') durchführen und den Vorgang umkehren (über 'Spalten in Text').

Evan Scholle
quelle
Ich habe das gerade aus der Scripts Gallery installiert und es hat nicht funktioniert. Ich habe das Problem behoben, indem ich zu Extras → Skript-Manager → Schaltfläche Bearbeiten gegangen bin und nach der schließenden Klammer jeder Funktionsdefinition ein Semikolon hinzugefügt habe. Danke für das Drehbuch.
Bob Esponja
@bobesponja Danke für das Heads-up. Ich weiß, dass es einen Fehler bei Google Scripts gibt, bei dem Ereignisauslöser von importierten Skripten nicht ordnungsgemäß registriert werden. Um dies zu beheben, fügen Sie den onOpen-Trigger einfach manuell hinzu.
Evan Plaice
Ich sehe es nicht in der Skriptgalerie. Ist es noch da
Ellen Spertus
1
@espertus Sieht so aus, als hätte Google die Skriptgalerie zugunsten der neuen Add-Ons entfernt. Kopieren Sie einfach den obigen Code in ein Skript, schließen Sie das Dokument und öffnen Sie es erneut.
Evan Plaice
Es gibt einige Randfälle, in denen dies nicht funktioniert. 1,421,873,190,017,370,000,000,000 1.42E+24 Diese CSV-Zeile hätte in 9 Spalten aufgeteilt werden sollen, sie wurde jedoch in nur 1 Spalten aufgeteilt.
Wurde
3

Ich habe die Split-Funktion verwendet, und sie hat einwandfrei funktioniert, da sie auch die Continue-Formel verwendet und genau die Übersetzung von Text in Spalte A in Spalten BCDE mit geeignetem Abstand vornimmt.

Mein Beispiel:

Cell A1= text1, text2, date1, number1
Cell B1= split(A1,",")

Ergebnis in B1 ist text1. Ergebnis in C1 ist text2 Ergebnis in D1 ist date1 Ergebnis in E1 ist number1.

Es kümmert sich um das Format, da das Datum als 1-jun geschrieben und in den 01/06 übersetzt wurde.

Die Formeln , die in Zellen verwendet spaltete BCDE wo CONTINUE(B1; 1; 2), CONTINUE(B1; 1; 3), CONTINUE(B1; 1; 4). All dieser Teil wurde automatisch erstellt.

user46580
quelle
2
Ist das ein Kommentar oder eine Lösung?
Jacob Jan Tuinstra
2

Konvertieren Sie Ihre CSV-Daten in TSV (tabulatorgetrennte Werte).
Fügen Sie es dann ein.

Ujjwal Singh
quelle
Ich habe gerade versucht, dass mit normaler Paste, nicht funktioniert. Das Einfügen mit dem "Einfügen und Anpassen" -Stil des Browsers funktioniert (Chrome / MacOS)
16:48
1
Arbeitete perfekt für mich mit einem einfachen Strg + V. Es scheint bei weitem die einfachste Lösung zu sein!
Didier L
1

Ich mag Evans Antwort mithilfe von Apps Script sehr und habe eine kleine Verbesserung vorgenommen: Unterstützung für das Abgleichen von Trennzeichen für reguläre Ausdrücke hinzugefügt. Zum MenüEinträge in onOpen habe ich hinzugefügt:

menuEntries.push({
  name: "Text to columns (regular expression separator)",
  functionName:"textToColumnsRegExp"
});

Und fügte die referenzierte Funktion hinzu:

function textToColumnsRegExp() {
  var separator = Browser.inputBox(
    "Text to column",
    "Enter the regular expression for the separator ",
    Browser.Buttons.OK);
  if (separator) {
    textToColumns(new RegExp(separator));
  }
}

Es waren keine weiteren Änderungen erforderlich, da Evan das Javascript-Objekt String.prototype.split verwendet, das entweder einen String oder ein RegExp-Objekt als Trennzeichen akzeptiert. Also ein dickes Lob an den Evan!

James Synge
quelle
0

Nachdem Sie die Funktion SPLIT verwendet haben, die das Array mit den getrennten Werten enthält, können Sie mit der Funktion INDEX eine bestimmte Zeile oder Spalte von diesem Array isolieren:

=index(split(importXML("https://www.google.com/search?q=stackexchange","//div[@id='resultStats']/text()")," "),1,2,1)

Kann nützlich sein, um beispielsweise die Anzahl der Ergebnisse für eine Google-Abfrage abzurufen

Giorgio M
quelle
0

Es scheint einen Menüpunkt zu geben, der dabei helfen kann: Daten → Text in Spalten aufteilen ...

  1. Klicken Sie einmal auf eine Zelle und fügen Sie Ihre Daten ein.

    Es wird über mehrere Zeilen, aber nur eine Spalte angezeigt.

  2. Lassen Sie die neu aufgefüllten Zellen hervorgehoben und gehen Sie zum Menü Daten → Text in Spalten aufteilen ...

    Wenn die App es geschafft hat, Ihre Separatoren automatisch zu erkennen, dann herzlichen Glückwunsch: Sie sind fertig!

    Andernfalls wird ein kleines Widget angezeigt, in dem Sie gefragt werden, auf welches Trennzeichen Sie aufteilen möchten.

    Hinweis: Dieses Widget wird möglicherweise unten im Fenster angezeigt, sodass es etwas schwer zu finden ist.

  3. Verwenden Sie das Widget, um auszuwählen, durch welches Trennzeichen Ihre Daten begrenzt werden: Komma, Semikolon, Punkt, Leerzeichen oder Benutzerdefiniert.

  4. Wenn Sie auf Tabs teilen wollten:

Das kannst du nicht!

joeytwiddle
quelle
-1

Und ein Äquivalent von columnToText wäre die Verwendung der =JOIN(delim, array)Formel. =JOIN(",", A1:A10)Dies würde beispielsweise dazu führen, dass eine Folge von Werten aus den Zellen A1 bis A10 verkettet wird.

Hari Narayanan
quelle
1
Das stimmt, aber das OP sagte, es habe Werte (durch Kommas getrennt) in einer Zelle.
Jacob Jan Tuinstra
nützliche infos, aber wahrscheinlich am besten als kommentar unter einer der antworten auf split gepostet, denke ich. Da dies nicht die ursprüngliche Frage beantwortet.
David
-1

Mit der neuen Version von Google Text & Tabellen, Google App Scripts jetzt veraltet .

Sie können die Power Tools der Google Add-on-Galerie und die Split- Funktion verwenden. Es läuft gut.

JMax
quelle
GAS ist nicht veraltet. Es ist die Skriptgalerie, die durch den Add-On-Store ersetzt wird !!
Jacob Jan Tuinstra