Konwersja tekstu na kolumny w arkuszach kalkulacyjnych Google

32

Jak przeprowadzić konwersję tekstu na kolumny w arkuszach kalkulacyjnych Google?

Na przykład mam następujący ciąg danych w jednej komórce:

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

Chcę go rozdzielić za pomocą separatora przecinków na kolumny.

Edycja: Zmieniłem zaakceptowaną odpowiedź na taką, która nie korzysta z Google Apps Scripting, ponieważ Google wydaje się być bardzo zajęty osłabieniem swoich możliwości.

Evan Plaice
źródło
Dlaczego dodałeś tag google-apps-script? Czy jedna z odpowiedzi pasowała?
Jacob Jan Tuinstra
1
@JacobJanTuinstra Ponieważ możliwość tę można dodać za pomocą Google Apps Scripting. Rozwiązałem swój problem, pisząc skrypt „Text To Columns”, który można teraz znaleźć w Galerii skryptów. Googlegooru opublikował również samouczek wideo demonstrujący jego użycie tutaj googlegooru.com/text-columns-google-spreadsheets .
Evan Plaice,
Jaka jest różnica w stosunku do rozwiązania już dostarczonych przez Google kalkulacyjnym: SPLIT. Czy wartości są ustawione? Możesz wkleić znane wartości.
Jacob Jan Tuinstra
@JacobJanTuinstra W swoim pierwszym rozwiązaniu spróbuj skopiować B2 do B3. Komórki wynikowe zawierają formuły kontynuacji, a nie surowe dane. Komórki wyprowadzone ze skryptu zawierają rzeczywiste surowe dane, dzięki czemu można je kopiować / przenosić bez żadnych problemów. Celem tego pytania jest znalezienie odpowiednika funkcji Excel „Tekst do kolumn”. Do tego czasu Google oficjalnie dodaje wsparcie, skrypt jest tak blisko, jak to będzie możliwe.
Evan Plaice
1
@ Rubén Tyle o stabilności. Sprawdziłem wcześniej i miałem wrażenie, że skrypty całkowicie zniknęły. Okazuje się, że zabili tylko galerię skryptów. Idę z odpowiedzią, którą poleciłeś, ponieważ jest to najprostsze rozwiązanie skryptowe. Dzięki za opinie.
Evan Plaice,

Odpowiedzi:

14

Wykona to następująca formuła; tekst do kolumny:

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

I następny; tekst do wiersza:

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

AKTUALIZACJA 03-02-2013
Jeśli podzielisz wynik A1i wkleisz wartości, da to ten sam wynik, co wszystkie wiersze kodu użyte w odpowiedzi PO. Wypróbowałem to również przy pomocy Google Apps Script i oto, co stworzyłem: tekst do kolumny

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

Po prostu używam wbudowanej funkcji podziału, aby podzielić wynik i dodać go do arkusza, nic więcej i nic mniej.

Jacob Jan Tuinstra
źródło
Fajnie ... Jak to nazwać bez rozszerzania interfejsu użytkownika. Czy możesz dodać szybki przykład demonstrujący użycie?
Evan Plaice,
17

Skorzystaj ze skryptów Google Apps, aby rozszerzyć interfejs użytkownika

Tekst do kolumn to bardzo przydatna funkcja i jeden z powodów, dla których wielu użytkowników Arkusza Google wraca do korzystania z programu Excel. Dopóki Google nie zdecyduje się oficjalnie wesprzeć tej funkcji, to rozwiązanie może być używane jako polifill w celu dodania funkcjonalności.

Oto kod:

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

Zapisz i zamknij edytor skryptów. Następnie odśwież arkusz kalkulacyjny. Załadowanie zajmie sekundę, ale po pasku „Pomoc” na pasku narzędzi powinno pojawić się menu „Zaawansowane”.

Stosowanie:

  • Wybierz komórki zawierające wartości do podzielenia
  • Wybierz ZaawansowaneTekst do kolumn

to jest to! Możesz także dokonać podziału za pomocą niestandardowego separatora (poprzez „Tekst na kolumny (niestandardowe)”) i odwrócić proces (poprzez „Kolumny na tekst”).

Evan Plaice
źródło
Właśnie zainstalowałem to z galerii skryptów i nie działało. Naprawiłem to, przechodząc do Narzędzia → Menedżer skryptów → Przycisk Edytuj i dodając średnik po nawiasie zamykającym definicji każdej funkcji. Dzięki za skrypt.
Bob Esponja
@bobesponja Dzięki za heads-up. Wiem, że występuje błąd w skryptach Google, w którym wyzwalacze zdarzeń z importowanych skryptów nie rejestrują się poprawnie. Aby to naprawić, wystarczy ręcznie dodać wyzwalacz onOpen.
Evan Plaice,
Nie widzę tego w galerii skryptów. Czy nadal tam jest?
Ellen Spertus,
1
@espertus Wygląda na to, że Google pozbył się galerii skryptów na rzecz swoich nowych dodatków. Wystarczy skopiować powyższy kod do skryptu, zamknąć, a następnie ponownie otworzyć dokument i powinien on działać.
Evan Plaice,
Istnieje kilka skrajnych przypadków, w których to nie działa. 1,421,873,190,017,370,000,000,000 1.42E+24 Ta linia CSV powinna była zostać podzielona na 9 kolumn, ale została podzielona tylko na 1.
haventcheck
3

Użyłem funkcji podziału i działała idealnie, ponieważ używa również formuły kontynuacji i wykonuje dokładnie tłumaczenie tekstu z kolumny A na kolumny BCDE z odpowiednimi odstępami.

Mój przykład:

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

Wynik w B1 to tekst 1. Wynik w C1 to tekst2 Wynik w D1 to data1 Wynik w E1 to liczba1.

Dba o format, ponieważ data została przeliterowana na 1 czerwca i przetłumaczona na 01/06.

Wzory, że rozstali stosowane w komórkach BCDE gdzie CONTINUE(B1; 1; 2), CONTINUE(B1; 1; 3), CONTINUE(B1; 1; 4). Cała ta część została utworzona automatycznie.

użytkownik46580
źródło
2
Czy to komentarz czy rozwiązanie?
Jacob Jan Tuinstra
2

Konwertuj dane csv na tsv (wartości rozdzielane tabulatorami).
Wklej to.

Ujjwal Singh
źródło
Właśnie próbowałem tego ze zwykłą pastą, nie działało. Wklejanie za pomocą przeglądarki „Wklej i dopasuj styl” działa (Chrome / MacOS)
nhed
1
Działa idealnie dla mnie z prostym ctrl + v. To zdecydowanie najprostsze rozwiązanie!
Didier L
1

Naprawdę podoba mi się odpowiedź Evana przy użyciu Apps Script i dokonałem niewielkiego ulepszenia: dodałem obsługę dopasowania ograniczników wyrażeń regularnych. Do menu Entries in onOpen dodałem:

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

I dodała funkcję, do której istnieje odwołanie:

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

Żadne inne zmiany nie były wymagane, ponieważ Evan używa String.prototype.split JavaScript, który przyjmuje jako ciąg ogranicznik albo ciąg RegExp. Więc uwielbiam Evana!

James Synge
źródło
0

Ponadto, po użyciu funkcji SPLIT, która zapewni tablicę zawierającą oddzielone wartości, możesz wyizolować określony wiersz lub kolumnę z tej tablicy za pomocą funkcji INDEKS:

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

Może być przydatny na przykład do wyszukiwania liczby wyników dla zapytania Google

Giorgio M.
źródło
0

Wydaje się, że istnieje element menu, który może w tym pomóc, w: Dane → Podziel tekst na kolumny ...

  1. Kliknij komórkę jednym kliknięciem i wklej swoje dane.

    Pojawi się w wielu wierszach, ale tylko w jednej kolumnie.

  2. Pozostawiając podświetlone nowo wypełnione komórki, przejdź do menu Dane → Podziel tekst na kolumny ...

    Jeśli aplikacja zdołała automatycznie wykryć separatory, gratulacje: gotowe!

    W przeciwnym razie pojawi się mały widget z pytaniem o separator, który chcesz podzielić.

    Uwaga: ten widget może pojawić się w dolnej części okna, co utrudnia jego znalezienie!

  3. Użyj widżetu, aby wybrać separator, w którym dane będą rozdzielane: przecinkiem, średnikiem, kropką, spacją lub niestandardową.

  4. Jeśli chcesz podzielić na Tabs:

Nie możesz!

joeytwiddle
źródło
-1

A odpowiednikiem columnToText byłoby użycie =JOIN(delim, array)formuły. Na przykład =JOIN(",", A1:A10)spowodowałoby to skonkatenowanie ciągu wartości z komórek A1 do A10.

Hari Narayanan
źródło
1
To prawda, ale OP powiedział, że ma wartości (oddzielone przecinkami) w jednej komórce.
Jacob Jan Tuinstra
przydatne informacje, ale chyba najlepiej opublikowane jako komentarz pod jedną z odpowiedzi na podzielenie. Ponieważ to nie odpowiada na pierwotne pytanie.
David
-1

W nowej wersji Arkuszy kalkulacyjnych Google skrypty aplikacji są teraz przestarzałe .

Można użyć Elektronarzędzia z Google Add-on Gallery i skorzystać z podziału funkcji. To dobrze działa.

JMax
źródło
GAS nie jest przestarzały. To galeria skryptów, która jest zastępowana przez sklep z dodatkami !!
Jacob Jan Tuinstra