Conversione da testo a colonne in Fogli di lavoro Google


32

Come si fa una conversione da testo a colonne in Fogli di lavoro Google?

Ad esempio, ho la seguente stringa di dati in una cella:

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

Voglio dividerlo dal separatore virgola in colonne.

Modifica: ho cambiato la risposta accettata con una che non utilizza lo scripting di Google Apps perché Google sembra intenzionato a nerfing la sua abilità.


Perché hai aggiunto il tag google-apps-script? Delle risposte si adattavano?
Jacob Jan Tuinstra,

1
@JacobJanTuinstra Perché la funzionalità può essere aggiunta tramite gli script di Google Apps. Ho finito per risolvere il mio problema scrivendo uno script "Testo in colonne" che ora può essere trovato nella Galleria degli script. Googlegooru ha anche pubblicato un video tutorial che ne dimostra l'utilizzo qui googlegooru.com/text-columns-google-spreadsheets .
Evan Plaice,

Qual è la differenza alla soluzione già fornita da Google Spreadsheet: SPLIT. Che i valori sono impostati? Puoi incollare i valori che conosci.
Jacob Jan Tuinstra,

@JacobJanTuinstra Nella tua prima soluzione prova a copiare da B2 a B3. Le celle dei risultati contengono formule di continuazione, non dati non elaborati. Le celle emesse dallo script contengono i dati grezzi effettivi in ​​modo che possano essere copiati / spostati senza problemi. L'intento di questa domanda è trovare un equivalente della funzione "Testo in colonne" di Excel. Fino a quando, Google aggiunge ufficialmente il supporto, lo script è il più vicino possibile.
Evan Plaice,

1
@ Rubén Tanto per stabilità. Ho controllato prima e avevo l'impressione che lo scripting fosse sparito del tutto. Si scopre che hanno ucciso solo la galleria di sceneggiature. Vado con la risposta che mi hai consigliato perché è la soluzione di scripting più semplice. Grazie per il feedback.
Evan Plaice,

Risposte:


14

La seguente formula farà proprio questo; Text-To-colonna:

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

E il prossimo; text-to-fila:

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

AGGIORNAMENTO 03-02-2013
Se si divide il risultato A1e si incollano i valori, si otterrà lo stesso risultato di tutte le righe di codice utilizzate nella risposta del PO. Ci ho provato anche con Google Apps Script e questo è ciò che ho creato: da testo a colonna

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

Uso semplicemente la funzione di divisione integrata per dividere il risultato e aggiungerlo al foglio, niente di più e niente di meno.


Bello ... Come lo chiami senza estendere l'interfaccia utente. Potete aggiungere un rapido esempio che dimostri l'utilizzo?
Evan Plaice,

17

Sfrutta gli script di Google Apps per estendere l'interfaccia utente

Text to Columns, è una funzionalità molto utile e uno dei motivi per cui molti utenti di Google Spreadsheet tornano a utilizzare Excel. Fino a quando Google non decide di supportare ufficialmente la funzionalità, questa soluzione può essere utilizzata come polyfill per aggiungere funzionalità.

Ecco il codice:

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

Salvare e chiudere l'editor di script. Quindi, aggiorna il foglio di calcolo. Ci vorrà un secondo per caricare ma dovresti vedere un menu chiamato popup 'Avanzate' dopo 'Aiuto' nella barra degli strumenti.

Uso:

  • Seleziona le celle che contengono i valori da dividere
  • Seleziona AvanzateTesto in colonne

Questo è tutto. Puoi anche effettuare una divisione usando un delimitatore personalizzato (tramite "Testo in colonne (personalizzato)") e invertire il processo (tramite "Colonne in testo").


L'ho appena installato dalla Galleria degli script e non funzionava. L'ho risolto andando su Strumenti → Script Manager → Modifica pulsante e aggiungendo un punto e virgola dopo la parentesi graffa di definizione di ciascuna funzione. Grazie per la sceneggiatura.
bob esponja,

@bobesponja Grazie per l'heads-up. So che c'è un bug con gli script di Google in cui i trigger di eventi dagli script importati non si registrano correttamente. Per risolverlo, basta aggiungere il trigger onOpen manualmente.
Evan Plaice,

Non lo vedo nella Galleria degli script. È ancora lì?
Ellen Spertus,

1
@espertus Sembra che Google si sia sbarazzato della galleria di script a favore dei loro nuovi componenti aggiuntivi. Basta copiare il codice sopra in uno script, chiudere, quindi riaprire il documento e dovrebbe funzionare.
Evan Plaice,

Ci sono alcuni casi limite in cui questo non funziona. 1,421,873,190,017,370,000,000,000 1.42E+24 Quella linea CSV avrebbe dovuto essere divisa in 9 colonne, ma è stata divisa in solo 1
verificato il

3

Ho usato la funzione di divisione e ha funzionato perfettamente, poiché utilizza anche la formula continua e fa esattamente la traduzione dal testo sulla colonna A alle colonne BCDE con la spaziatura corretta.

Il mio esempio:

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

Il risultato in B1 è testo1. Il risultato in C1 è testo2 Il risultato in D1 è data1 Il risultato in E1 è numero1.

Si occupa del formato, dato che la data è stata scritta come 1-giu, e tradotta in 01/06.

Le formule che divise utilizzate nelle cellule BCDE dove CONTINUE(B1; 1; 2), CONTINUE(B1; 1; 3), CONTINUE(B1; 1; 4). Tutta questa parte è stata creata automaticamente.


2
È un commento o una soluzione?
Jacob Jan Tuinstra,

2

Converti i tuoi dati csv in tsv (valori separati da tabulazione).
Quindi incollalo.


Ho appena provato che con la pasta normale, non ha funzionato. Incollare con lo stile "Incolla e abbina" del browser funziona (Chrome / MacOS)
nhed

1
Ha funzionato perfettamente per me con un semplice ctrl + v. Sembra di gran lunga la soluzione più semplice!
Didier L

1

Mi piace molto la risposta di Evan utilizzando Apps Script e ho apportato un piccolo miglioramento: l'aggiunta del supporto per la corrispondenza del delimitatore di espressioni regolari. Al menuEntries in onOpen ho aggiunto:

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

E aggiunta la funzione di riferimento:

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

Non sono state richieste altre modifiche perché Evan utilizza String.prototype.split di Javascript, che accetta come delimitatore una stringa o un oggetto RegExp. Quindi complimenti Evan!


0

Inoltre, dopo aver utilizzato la funzione SPLIT che fornirà l'array contenente i valori separati, è possibile isolare una riga o una colonna specifica da questo array con la funzione INDICE:

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

Ad esempio, può essere utile per recuperare il numero di risultati per una query di Google


0

Sembra che ci sia una voce di menu che può aiutarti in questo, in: Dati → Dividi testo in colonne ...

  1. Fai clic su una cella e incolla i tuoi dati.

    Apparirà su più righe ma solo una colonna.

  2. Lasciando evidenziate le celle appena popolate, vai al menu Dati → Dividi testo in colonne ...

    Se l'app è riuscita a rilevare automaticamente i tuoi separatori, allora congratulazioni: il gioco è fatto!

    Altrimenti, apparirà un piccolo widget che chiede quale separatore vuoi dividere.

    Nota: questo widget potrebbe apparire nella parte inferiore della finestra rendendolo un po 'difficile da trovare!

  3. Usa il widget per scegliere da quale separatore i tuoi dati sono delimitati: virgola, punto e virgola, punto, spazio o personalizzato.

  4. Se desideri dividere su schede:

Non puoi!


-1

E un equivalente di columnToText sarebbe usare la =JOIN(delim, array)formula. Ad esempio, =JOIN(",", A1:A10)risulterebbe una stringa di valori concatenata dalle celle da A1 a A10.


1
È vero, ma l'OP ha detto che aveva valori (separati da virgola) in una cella.
Jacob Jan Tuinstra,

informazioni utili, ma probabilmente è meglio pubblicare come commento sotto una delle risposte da dividere, credo. Dal momento che questo non risponde alla domanda originale.
David,

-1

Con la nuova versione di Google Spreadsheets, gli script delle app di Google sono ora obsoleti .

Puoi utilizzare gli strumenti di potere della Galleria dei componenti aggiuntivi di Google e utilizzare la funzione Dividi . Funziona bene.


GAS non è obsoleto. È la galleria di script che viene sostituita dal negozio di componenti aggiuntivi !!
Jacob Jan Tuinstra,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.