Conversão de texto em colunas nas planilhas do Google

32

Como você faz uma conversão de texto em colunas nas planilhas do Google?

Por exemplo, eu tenho a seguinte sequência de dados em uma célula:

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

Quero separá-lo pelo separador de vírgulas em colunas.

Editar: alterei a resposta aceita para uma que não use o Script do Google Apps, porque o Google parece muito interessado em diminuir sua capacidade.

Evan Plaice
fonte
Por que você adicionou a tag google-apps-script? Uma das respostas se encaixou?
precisa saber é o seguinte
1
@JacobJanTuinstra Porque o recurso pode ser adicionado via Script do Google Apps. Acabei resolvendo meu próprio problema escrevendo um script 'Text To Columns' que agora pode ser encontrado na Galeria de scripts. O Googlegooru também postou um tutorial em vídeo demonstrando seu uso aqui googlegooru.com/text-columns-google-spreadsheets .
Evan Plaice
Qual é a diferença para a solução já fornecida pelo Google Spreadsheet: SPLIT. Que os valores estão definidos? Você pode colar valores que conhece.
Jacob Jan Tuinstra
@JacobJanTuinstra Na sua primeira solução, tente copiar B2 para B3. As células resultantes contêm fórmulas de continuação, não dados brutos. As células produzidas a partir do script contêm os dados brutos reais, para que possam ser copiados / movidos sem problemas. O objetivo desta pergunta é encontrar um equivalente ao recurso 'Texto em colunas' do Excel. Até que o Google adicione oficialmente o suporte, o script é o mais próximo possível.
Evan Plaice
1
@ Rubén Tanto por estabilidade. Eu verifiquei anteriormente e tive a impressão de que o script havia desaparecido completamente. Acontece que eles só mataram a galeria de roteiros. Eu vou com a resposta que você recomendou, porque é a solução mais simples de script. Obrigado pelo feedback.
Evan Plaice

Respostas:

14

A fórmula a seguir fará exatamente isso; texto para coluna:

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

E o próximo; texto para linha:

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

ATUALIZAÇÃO 03-02-2013
Se você dividir o resultado A1e colar os valores, ele fornecerá o mesmo resultado que todas as linhas de código usadas na resposta do OP. Eu também experimentei isso com o Script do Google Apps e foi isso que criei: texto para coluna

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

Simplesmente uso a função de divisão incorporada para dividir o resultado e adicioná-lo à planilha, nada mais e nada menos.

Jacob Jan Tuinstra
fonte
Bom ... Como você chama isso sem estender a interface do usuário. Você pode adicionar um exemplo rápido demonstrando o uso?
Evan Plaice
17

Aproveite os scripts do Google Apps para estender a interface do usuário

Texto para colunas, é um recurso muito útil e um dos motivos pelos quais muitos usuários da planilha do Google voltam a usar o Excel. Até que o Google decida dar suporte oficial ao recurso, essa solução pode ser usada como um polyfill para adicionar a funcionalidade.

Aqui está o código:

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

Salve e feche o editor de scripts. Em seguida, atualize a planilha. Levará um segundo para carregar, mas você verá um menu chamado 'Avançado' pop-up após 'Ajuda' na barra de ferramentas.

Uso:

  • Selecione a (s) célula (s) que contém os valores a serem divididos
  • Selecione AvançadoTexto para colunas

É isso aí. Você também pode fazer uma divisão usando um delimitador personalizado (via 'Text to Columns (Custom)') e reverter o processo (via 'Columns to Text').

Evan Plaice
fonte
Acabei de instalar isso na Galeria de scripts e não estava funcionando. Corrigi-o acessando o botão Ferramentas → Gerenciador de scripts → Editar e adicionando um ponto e vírgula após a chave de fechamento de cada definição de função. Obrigado pelo script.
Bob esponja
Obrigado pela atenção. Sei que há um erro nos scripts do Google em que os gatilhos de eventos de scripts importados não são registrados corretamente. Para corrigi-lo, basta adicionar o gatilho onOpen manualmente.
Evan Plaice
Eu não vejo isso na Galeria de scripts. Ainda está lá?
Ellen Spertus
1
@espertus Parece que o Google se livrou da galeria de scripts em favor de seus novos complementos. Basta copiar o código acima em um script, fechar e reabrir o documento e ele deve funcionar.
Evan Plaice
Existem alguns casos extremos em que isso não está funcionando. 1,421,873,190,017,370,000,000,000 1.42E+24 Essa linha csv deveria ter sido dividida em 9 colunas, mas foi dividida em apenas 1.
conferiu
3

Eu usei a função split, e ela funcionou perfeitamente, pois também usa a fórmula continue e faz exatamente a tradução do texto na coluna A para as colunas BCDE com espaçamento adequado.

Meu exemplo:

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

O resultado em B1 é o texto1. Resultado em C1 é texto2 Resultado em D1 é data1 Resultado em E1 é número1.

Ele cuida do formato, pois a data foi escrita como 1 de junho e foi traduzida para 01/06.

As fórmulas que fendido usados em células BCDE onde CONTINUE(B1; 1; 2), CONTINUE(B1; 1; 3), CONTINUE(B1; 1; 4). Toda essa parte foi criada automaticamente.

user46580
fonte
2
Isso é um comentário ou uma solução?
Jacob Jan Tuinstra
2

Converta seus dados csv em tsv (valores separados por tabulação).
Cole-o então.

Ujjwal Singh
fonte
Eu apenas tentei isso com pasta regular, não funcionou. Colar com "Colar e combinar estilo" do navegador funciona (Chrome / MacOS)
encerrado em 10/11/15
1
Funcionou perfeitamente para mim com um simples ctrl + v. Parece de longe a solução mais simples!
Didier L
1

Gosto muito da resposta de Evan usando o Apps Script e fiz uma pequena melhoria: adicionando suporte à correspondência de delimitadores de expressões regulares. Para o menu Entradas no onOpen, adicionei:

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

E adicionou a função referenciada:

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

Nenhuma outra alteração foi necessária porque o Evan está usando o String.prototype.split do Javascript, que aceita uma string ou um objeto RegExp como delimitador. Então parabéns o Evan!

James Synge
fonte
0

Além disso, depois de usar a função SPLIT que fornecerá a matriz que contém os valores separados, você pode isolar uma linha ou coluna específica dessa matriz com a função INDEX:

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

Pode ser útil para recuperar o número de resultados de uma consulta do Google, por exemplo

Giorgio M
fonte
0

Parece haver um item de menu que pode ajudar com isso, em: Dados → Dividir texto em colunas ...

  1. Único clique em uma célula e cole seus dados.

    Ele aparecerá em várias linhas, mas apenas em uma coluna.

  2. Deixando as células recém-preenchidas destacadas, vá para o menu Dados → Dividir texto em colunas ...

    Se o aplicativo conseguiu detectar automaticamente seus separadores, parabéns: está pronto!

    Caso contrário, um pequeno widget aparecerá perguntando em qual separador você deseja dividir.

    Nota: esse widget pode aparecer próximo à parte inferior da janela , dificultando a localização!

  3. Use o widget para escolher em qual separador seus dados serão delimitados por: Vírgula, Ponto e Vírgula, Ponto, Espaço ou Personalizado.

  4. Se você deseja dividir as guias:

Você não pode!

joeytwiddle
fonte
-1

E um equivalente a columnToText seria usar a =JOIN(delim, array)fórmula. Por exemplo, =JOIN(",", A1:A10)resultaria que ela concatenou uma sequência de valores das células A1 a A10.

Hari Narayanan
fonte
1
Isso é verdade, mas o OP disse que tinha valores (separados por vírgula) em uma célula.
Jacob Jan Tuinstra
informações úteis, mas provavelmente melhor postadas como um comentário em uma das respostas para dividir, eu acho. Como isso não responde à pergunta original.
David
-1

Com a nova versão do Google Spreadsheets, o Google App Scripts agora está obsoleto .

Você pode usar as Ferramentas elétricas da Galeria de complementos do Google e a função Dividir . Isso funciona bem.

JMax
fonte
O GAS não está obsoleto. É a galeria de scripts que está sendo substituída pela loja de complementos !!
Jacob Jan Tuinstra