Conversión de texto a columnas en hojas de cálculo de Google

32

¿Cómo se realiza una conversión de texto a columnas en las hojas de cálculo de Google?

Por ejemplo, tengo la siguiente cadena de datos en una celda:

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

Quiero separarlo por el separador de coma en columnas.

Editar: cambié la respuesta aceptada a una que no utiliza las secuencias de comandos de Google Apps porque Google parece empeñado en alterar su capacidad.

Evan Plaice
fuente
¿Por qué ha agregado la etiqueta google-apps-script? ¿Encaja una de las respuestas?
Jacob Jan Tuinstra
1
@JacobJanTuinstra Porque la capacidad se puede agregar a través de Google Apps Scripting. Terminé resolviendo mi propio problema escribiendo un guión de 'Texto a columnas' que ahora se puede encontrar en la Galería de guiones. Googlegooru también publicó un video tutorial que demuestra su uso aquí googlegooru.com/text-columns-google-spreadsheets .
Evan Plaice el
¿Cuál es la diferencia con respecto a la solución ya proporcionada por Google hoja de cálculo: SPLIT. Que los valores están establecidos? Puede pegar valores que conozca.
Jacob Jan Tuinstra 01 de
@JacobJanTuinstra En su primera solución, intente copiar B2 a B3. Las celdas de resultados contienen fórmulas de continuación, no datos sin procesar. Las celdas generadas por el script contienen los datos sin procesar reales para que puedan copiarse / moverse sin ningún problema. La intención de esta pregunta es encontrar un equivalente a la función 'Texto a columnas' de Excel. Hasta que Google oficialmente agregue soporte, el script es lo más cercano posible.
Evan Plaice
1
@ Rubén Tanto por la estabilidad. Lo comprobé antes y tenía la impresión de que las secuencias de comandos habían desaparecido por completo. Resulta que solo mataron a la galería de guiones. Voy con la respuesta que me recomendó porque es la solución más fácil de escribir. Gracias por la respuesta.
Evan Plaice

Respuestas:

14

La siguiente fórmula hará exactamente eso; texto a columna:

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

Y el siguiente; texto a fila:

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

ACTUALIZACIÓN 03-02-2013
Si divide el resultado A1y pega los valores, dará el mismo resultado que todas las líneas de código utilizadas en la respuesta del OP. También lo probé con Google Apps Script y esto es lo que creé: texto a columna

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

Simplemente uso la función de división incorporada para dividir el resultado y agregarlo a la hoja, nada más y nada menos.

Jacob Jan Tuinstra
fuente
Bien ... ¿Cómo se llama sin extender la interfaz de usuario? ¿Puedes agregar un ejemplo rápido que demuestre el uso?
Evan Plaice
17

Aproveche las secuencias de comandos de Google Apps para ampliar la interfaz de usuario

Text to Columns, es una característica muy útil y una de las razones por las que muchos usuarios de Google Spreadsheet vuelven a usar Excel. Hasta que Google decida admitir oficialmente la función, esta solución se puede usar como un polyfill para agregar la funcionalidad.

Aquí está el 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);
}

Guarde y cierre el editor de guiones. Luego, actualice la hoja de cálculo. Tardará un segundo en cargarse, pero debería ver un menú llamado ventana emergente 'Avanzado' después de 'Ayuda' en la barra de herramientas.

Uso:

  • Seleccione las celdas que contienen los valores para dividir
  • Seleccione AvanzadoTexto a columnas

Eso es. También puede hacer una división utilizando un delimitador personalizado (a través de 'Texto a columnas (personalizado)') e invertir el proceso (a través de 'Columnas a texto').

Evan Plaice
fuente
Acabo de instalar esto desde la Galería de Scripts y no estaba funcionando. Lo arreglé yendo a Herramientas → Administrador de secuencias de comandos → Editar botón y agregando un punto y coma después de la llave de cierre de cada definición de función. Gracias por el guion.
bob esponja
@bobesponja Gracias por el aviso. Sé que hay un error con Google Scripts en el que los disparadores de eventos de scripts importados no se registran correctamente. Para solucionarlo, simplemente agregue el activador onOpen manualmente.
Evan Plaice
No lo veo en la Galería de secuencias de comandos. ¿Sigue ahí?
Ellen Spertus
1
@espertus Parece que Google se deshizo de la galería de scripts a favor de sus nuevos complementos. Simplemente copie el código anterior en un script, cierre, luego vuelva a abrir el documento y debería funcionar.
Evan Plaice
Hay algunos casos extremos en los que esto no funciona. 1,421,873,190,017,370,000,000,000 1.42E+24 Esa línea csv debería haberse dividido en 9 columnas, pero se dividió en solo 1.
he verificado el
3

Utilicé la función de división, y funcionó perfectamente, ya que también utiliza la fórmula de continuación y hace exactamente la traducción del texto en la columna A a las columnas BCDE con el espaciado adecuado.

Mi ejemplo:

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

El resultado en B1 es texto1. El resultado en C1 es texto2 El resultado en D1 es fecha1 El resultado en E1 es número1.

Se ocupa del formato, ya que la fecha se deletreaba como 1 de junio y se tradujo al 01/06.

Las fórmulas que fraccionados utilizados en las células BCDE donde CONTINUE(B1; 1; 2), CONTINUE(B1; 1; 3), CONTINUE(B1; 1; 4). Toda esta parte fue creada automáticamente.

usuario46580
fuente
2
¿Es esto un comentario o una solución?
Jacob Jan Tuinstra
2

Convierta sus datos csv en tsv (valores separados por tabulaciones).
Péguelo entonces.

Ujjwal Singh
fuente
Solo intenté eso con pasta regular, no funcionó. Pegar con el estilo "Pegar y combinar" del navegador funciona (Chrome / MacOS)
nhed
1
Funcionó perfectamente para mí con un simple ctrl + v. ¡Parece ser, con mucho, la solución más simple!
Didier L
1

Realmente me gusta la respuesta de Evan usando Apps Script e hice una pequeña mejora: agregué soporte para la coincidencia del delimitador de expresiones regulares. Al menú Entradas en onOpen agregué:

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

Y agregó la función 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));
  }
}

No se requirieron otros cambios porque Evan está utilizando String.prototype.split de Javascript, que acepta una cadena o un objeto RegExp como delimitador. ¡Así que felicitaciones a Evan!

James Synge
fuente
0

Además, después de usar la función SPLIT que proporcionará la matriz que contiene los valores separados, puede aislar una fila o columna específica de esta matriz con la función INDICE:

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

Puede ser útil para recuperar el número de resultados para una consulta de Google, por ejemplo

Giorgio M
fuente
0

Parece que hay un elemento de menú que puede ayudar con esto, en: Datos → Dividir texto en columnas ...

  1. Haga clic en una celda y pegue sus datos.

    Aparecerá en varias filas pero solo en una columna.

  2. Dejando resaltadas las celdas recién pobladas, vaya al menú Datos → Dividir texto en columnas ...

    Si la aplicación logró detectar automáticamente sus separadores, felicidades: ¡ya está!

    De lo contrario, aparecerá un pequeño widget preguntando en qué separador desea dividir.

    Nota: este widget puede aparecer cerca de la parte inferior de la ventana, lo que hace que sea un poco difícil de encontrar.

  3. Use el widget para elegir qué separador está delimitado por sus datos: coma, punto y coma, punto, espacio o personalizado.

  4. Si quisieras dividir en pestañas:

No puedes!

joeytwiddle
fuente
-1

Y un equivalente de columnToText sería usar la =JOIN(delim, array)fórmula. Por ejemplo, =JOIN(",", A1:A10)daría como resultado una cadena de valores concatenados de las celdas A1 a A10.

Hari Narayanan
fuente
1
Eso es cierto, pero el OP dijo que tenía valores (separados por comas) en una celda.
Jacob Jan Tuinstra
información útil, pero probablemente mejor publicado como un comentario en una de las respuestas para dividir, supongo. Dado que esto no responde a la pregunta original.
David
-1

Con la nueva versión de Google Spreadsheets, Google App Scripts ahora está en desuso .

Puede usar las Herramientas de poder de la Galería de complementos de Google y usar la función Dividir . Funciona bien.

JMax
fuente
GAS no está en desuso. ¡Es la galería de guiones que está siendo reemplazada por la tienda de complementos!
Jacob Jan Tuinstra