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.


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.


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çado → Texto 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').


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.


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.


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!


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


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!


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


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.


O GAS não está obsoleto. É a galeria de scripts que está sendo substituída pela loja de complementos !!
— Jacob Jan Tuinstra
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.