Conversion de texte en colonnes dans Google Spreadsheets


32

Comment effectuez-vous une conversion de texte en colonnes dans Google Spreadsheets?

Par exemple, j'ai la chaîne de données suivante dans une cellule:

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

Je veux le séparer par le séparateur de virgule en colonnes.

Edit: j'ai changé la réponse acceptée en une réponse qui n'utilise pas Google Apps Scripting, car Google semble très enclin à se mettre en difficulté.


Pourquoi avez-vous ajouté la balise google-apps-script? Est-ce que l'une des réponses correspondait?
Jacob Jan Tuinstra

1
@JacobJanTuinstra Parce que la fonctionnalité peut être ajoutée via Google Apps Scripting. J'ai fini par résoudre mon propre problème en écrivant un script 'Text To Columns' qui se trouve maintenant dans la galerie de scripts. Googlegooru a également publié un didacticiel vidéo démontrant son utilisation ici . Googlegooru.com/text-columns-google-spreadsheets .
Evan Plaice

Quelle est la différence à la solution déjà fournie par Google Tableur: SPLIT. Que les valeurs sont définies? Vous pouvez coller des valeurs que vous connaissez.
Jacob Jan Tuinstra

@JobobJanTuinstra Dans votre première solution, essayez de copier B2 à B3. Les cellules de résultat contiennent des formules de continuation, pas des données brutes. Les cellules générées à partir du script contiennent les données brutes réelles pour pouvoir être copiées / déplacées sans problème. Le but de cette question est de trouver un équivalent à la fonctionnalité "Texte en colonnes" d'Excel. En attendant, Google ajoute officiellement que le script est aussi proche que possible.
Evan Plaice

1
@ Rubén Voilà pour la stabilité. J'ai vérifié plus tôt et j'avais l'impression que le script avait complètement disparu. Il s'avère qu'ils ont seulement tué la galerie de scripts. Je vais avec la réponse que vous avez recommandée parce que c'est la solution scriptable la plus simple. Merci pour les commentaires.
Evan Plaice le

Réponses:


14

La formule suivante fera exactement cela; texte à colonne:

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

Et la prochaine; text-to-row:

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

UPDATE 03-02-2013
Si vous scindez le résultat A1et collez les valeurs, le résultat sera identique à celui de toutes les lignes de code utilisées dans la réponse du PO. Je me suis aussi lancé avec Google Apps Script et voici ce que j'ai créé: texte en colonne

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

J'utilise simplement la fonction split intégrée pour scinder le résultat et l'ajouter à la feuille, rien de plus et rien de moins.


Nice ... Comment appelez-vous sans étendre l'interface utilisateur. Pouvez-vous ajouter un exemple rapide illustrant l'utilisation?
Evan Plaice

17

Utiliser Google Apps Scripting pour étendre l'interface utilisateur

Texte en colonnes est une fonctionnalité très pratique et l'une des raisons pour lesquelles de nombreux utilisateurs de Google Spreadsheet utilisent à nouveau Excel. En attendant que Google décide de prendre officiellement en charge cette fonctionnalité, cette solution peut être utilisée en tant que polyfill pour y ajouter des fonctionnalités.

Voici le code:

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

Enregistrez et fermez l'éditeur de script. Ensuite, actualisez la feuille de calcul. Cela prendra une seconde à charger, mais vous devriez voir un menu appelé "Avancé" après "Aide" dans la barre d'outils.

Usage:

  • Sélectionnez la ou les cellules contenant les valeurs à fractionner
  • Sélectionnez AvancéTexte en colonnes

C'est ça. Vous pouvez également effectuer une scission à l'aide d'un délimiteur personnalisé (via "Texte en colonnes (Custom)") et inverser le processus (via "Colonnes en texte").


Je viens d'installer ceci à partir de la galerie de scripts et cela ne fonctionnait pas. Je l'ai corrigé en allant dans Outils → Gestionnaire de scripts → bouton Éditer et en ajoutant un point-virgule après l'accolade fermante de chaque définition de fonction. Merci pour le script.
Bob Esponja

@bobesponja Merci pour le heads-up. Je sais qu’il existe un problème avec les scripts Google, où les déclencheurs d’événements à partir de scripts importés ne s’enregistrent pas correctement. Pour résoudre ce problème, ajoutez simplement le déclencheur onOpen manuellement.
Evan Plaice

Je ne le vois pas dans la galerie de scripts. Est-il toujours là?
Ellen Spertus

1
@ Espertus On dirait que Google s'est débarrassé de la galerie de scripts en faveur de ses nouveaux add-ons. Copiez simplement le code ci-dessus dans un script, fermez-le, puis rouvrez le document et cela devrait fonctionner.
Evan Plaice

Il y a quelques cas extrêmes où cela ne fonctionne pas. 1,421,873,190,017,370,000,000,000 1.42E+24 Cette ligne CSV aurait dû être divisée en 9 colonnes, mais en une seule.
haventchecked

3

J'ai utilisé la fonction split et cela a parfaitement fonctionné, car elle utilise également la formule continue et effectue exactement la traduction du texte de la colonne A en colonnes BCDE avec un espacement correct.

Mon exemple:

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

Le résultat en B1 est text1. Le résultat dans C1 est text2. Le résultat dans D1 est date1. Le résultat dans E1 est numéro1.

Il prend en charge le format, puisque la date a été orthographiée le 1 juin et s'est traduite en 01/06.

Les formules qui dédoublé est utilisé dans les cellules où BCDE CONTINUE(B1; 1; 2), CONTINUE(B1; 1; 3), CONTINUE(B1; 1; 4). Toute cette partie a été créée automatiquement.


2
Est-ce un commentaire ou une solution?
Jacob Jan Tuinstra

2

Convertissez vos données csv en tsv (valeurs séparées par des tabulations).
Collez-le ensuite.


Je viens d'essayer cela avec de la pâte régulière, n'a pas fonctionné. Le collage avec le style "Coller et assortir" du navigateur fonctionne (Chrome / MacOS)
nhed

1
A fonctionné parfaitement pour moi avec un simple ctrl + v. Cela semble être de loin la solution la plus simple!
Didier L

1

J'aime beaucoup la réponse d'Evan à l'aide du script Apps et j'ai apporté une petite amélioration: l'ajout de la prise en charge de la correspondance de délimiteur d'expression régulière. Au menuEntries de onOpen, j'ai ajouté:

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

Et ajouté la fonction référencée:

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

Aucune autre modification n'a été nécessaire, car Evan utilise le fichier Javascript String.prototype.split, qui accepte une chaîne ou un objet RegExp comme délimiteur. Alors bravo l'Evan!


0

De plus, après avoir utilisé la fonction SPLIT qui fournira le tableau contenant les valeurs séparées, vous pouvez isoler une ligne ou une colonne spécifique de ce tableau avec la fonction INDEX:

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

Peut être utile pour récupérer le nombre de résultats pour une requête Google par exemple


0

Il semble y avoir un élément de menu qui peut aider avec ceci, à savoir: Données → Fractionner le texte en colonnes ...

  1. Cliquez une fois sur une cellule et collez vos données.

    Il apparaîtra sur plusieurs lignes mais une seule colonne.

  2. En laissant les cellules nouvellement remplies en surbrillance, allez au menu Données → Fractionner le texte en colonnes ...

    Si l'application a réussi à détecter automatiquement vos séparateurs, alors félicitations: vous avez terminé!

    Sinon, un petit widget apparaîtra pour vous demander quel séparateur vous souhaitez scinder.

    Remarque: ce widget peut apparaître près du bas de la fenêtre, ce qui le rend un peu difficile à trouver!

  3. Utilisez le widget pour choisir le séparateur entre vos données: Virgule, Point-virgule, Période, Espace ou Personnalisé.

  4. Si vous vouliez vous séparer sur des onglets:

Tu ne peux pas!


-1

Et un équivalent de columnToText serait d'utiliser la =JOIN(delim, array)formule. Par exemple, =JOIN(",", A1:A10)il en résulterait une chaîne de valeurs concaténées des cellules A1 à A10.


1
C'est vrai, mais l'OP a indiqué qu'il avait des valeurs (séparées par des virgules) dans une cellule.
Jacob Jan Tuinstra

informations utiles, mais probablement mieux posté comme un commentaire sous l'une des réponses à scinder je suppose. Puisque cela ne répond pas à la question initiale.
David

-1

Avec la nouvelle version de Google Spreadsheets, Google App Scripts est désormais obsolète .

Vous pouvez utiliser les outils puissants de la galerie de compléments Google et utiliser la fonction Fractionner . Ça marche bien.


GAZ n'est pas obsolète. C'est la galerie de scripts qui est remplacée par le magasin complémentaire !!
Jacob Jan Tuinstra
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.