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.


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.


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 Zaawansowane → Tekst 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”).


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.


2
Czy to komentarz czy rozwiązanie?
— Jacob Jan Tuinstra

2

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


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!


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


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!


-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.


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.


GAS nie jest przestarzały. To galeria skryptów, która jest zastępowana przez sklep z dodatkami !!
— Jacob Jan Tuinstra
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.