web-dev-qa-db-fra.com

Les feuilles Google divisent une cellule multiligne en nouvelles lignes (+ les entrées de lignes adjacentes dupliquées)

Je compile une base de données d'informations sur les adresses commerciales, y compris le personnel clé de chaque entreprise. La feuille de calcul Google dont j'ai hérité pour ce projet inclut une colonne pour "personnel clé" (dans la colonne B), avec plusieurs noms de personnel clé répertoriés dans la même cellule, séparés par des sauts de ligne (ie CHAR (10)). Il y a une entreprise par ligne. Le nombre de lignes dans la cellule "Personnel clé" varie ligne par ligne. Ma feuille initiale ressemble à ceci:

enter image description here

Je dois procéder comme suit pour optimiser cette fiche:

  1. divisez chaque cellule multiligne "personnel clé" de sorte que chaque nom de personnel clé apparaisse sur sa propre ligne. Cela nécessite que les nouvelles rangées soient insérées sous la rangée d'origine.
  2. dupliquer les données de toutes les autres cellules de la ligne d'origine (c'est-à-dire des colonnes A & C: E), de sorte que chaque nouvelle ligne contienne les données complètes de chaque entreprise
  3. J'ai besoin d'un processus automatisé - Je devrai traiter environ 1000 entreprises, je ne peux donc pas le faire avec des étapes manuelles.

La feuille devrait alors ressembler à ceci:

enter image description here

Utiliser =TRANSPOSE(SPLIT(B1,CHAR(10))) ne fait évidemment qu’une partie du chemin - il n’insère pas de nouvelles lignes et ne duplique pas les entrées de colonne environnantes. Toute aide acceptée avec reconnaissance!

11
kirk tab

Tout d'abord, désolé pour la réponse tardive, mais j'ai une solution pour vous de travailler.

Code

function result(range) {
  var output2 = [];
  for(var i=0, iLen=range.length; i<iLen; i++) {
    var s = range[i][1].split("\n");    
    for(var j=0, jLen=s.length; j<jLen; j++) {
      var output1 = []; 
      for(var k=0, kLen=range[0].length; k<kLen; k++) {
        if(k == 1) {
          output1.Push(s[j]);
        } else {
          output1.Push(range[i][k]);
        }
      }
      output2.Push(output1);
    }    
  }
  return output2;
}

A expliqué

Le script évalue chaque ligne, et en particulier la deuxième colonne de chaque ligne (les tableaux JavaScript sont basés sur zéro, la colonne 2 correspond donc à l'index 1 du tableau). Il divise le contenu de cette cellule en plusieurs valeurs et utilise le "\n" comme délimiteur (saut de ligne). Après cela, il ajoute les informations existantes à un tableau et ajoute uniquement les résultats individuels, lorsqu'il atteint l'index 1 (k == 1)]. La ligne nouvellement préparée est ensuite ajoutée à un autre tableau qui est renvoyé pour afficher le résultat.

Capture d'écran

data
enter image description here

résultat
enter image description here

Exemple

J'ai créé un exemple de fichier pour vous: cellules multilignes dans de nouvelles lignes.
Ajoutez le script sous Outils> Editeur de script et appuyez sur le bouton Enregistrer.

11
Jacob Jan Tuinstra

Une solution répétable aura besoin d'un script.

Mais pour un effort ponctuel, vous pouvez simplement utiliser =SPLIT(B3,CHAR(10)). Cela vous donnera tous les noms des personnes dans des colonnes d'assistance côte à côte, comme ceci:

enter image description here

Copy/Paste-special, attribue une valeur au contenu de la colonne d'assistance.

Et pour chaque colonne d'assistance utilisée (pas trop, espérons-le, car vous n'avez pas trop de personnes dans une même entreprise), copiez et collez manuellement le bloc de lignes à la fin du bloc actuel. (Ce n'est pas une bonne description, mais vous obtenez la dérive.)

3
MaryC.fromNZ

Pour les personnes qui pourraient ne pas comprendre immédiatement comment utiliser la fonction utile dans la réponse acceptée:

  • Vous avez besoin de plusieurs feuilles. Dans l'exemple, les deux feuilles sont DATA et RESULT. La feuille RESULT est vide jusqu'à ce que la requête soit exécutée. Vous pouvez voir la requête qui fait référence à la feuille DATA dans la capture d'écran de Jacob.

  • Vous aurez probablement besoin de modifier la valeur de comparaison pour k à la ligne 8, qui fait référence à la colonne dans laquelle vos données à analyser doivent être trouvées. Le même nombre devra entrer dans la deuxième valeur du tableau à la ligne 4.

  • Vous devrez peut-être modifier le délimiteur à la ligne 4, qui est actuellement \n

Pour faciliter la tâche, j'ai pris le même code et extrait le délimiteur et la colonne cible dans des variables définies en haut de la fonction. Comme Jacob le mentionne, le nombre de colonnes cible commence par 0 en tant que premier nombre.

function result(range) {
  delimiter = ", "
  targetColumn = 10

  var output2 = [];
  for(var i=0, iLen=range.length; i<iLen; i++) {
    var s = range[i][targetColumn].split(delimiter);    
    for(var j=0, jLen=s.length; j<jLen; j++) {
      var output1 = []; 
      for(var k=0, kLen=range[0].length; k<kLen; k++) {
        if(k == targetColumn) {
          output1.Push(s[j]);
        } else {
          output1.Push(range[i][k]);
        }
      }
      output2.Push(output1);
    }    
  }
  return output2;
}
2
jfunk

Formule unique

=ARRAYFORMULA(substitute(IFERROR(
  REGEXEXTRACT(
    "_"&transpose(split(join(" ",query(substitute(
      IFERROR(transpose(FILTER(A:A,LEN(A:A)))&
      "_"&REGEXEXTRACT(CHAR(10)&transpose(FILTER(B:B,LEN(A:A))),
        "^"&REPT(CHAR(10)&"[^"&CHAR(10)&"]*",row(OFFSET(A1,,,6,1))-1)&CHAR(10)&"([^"&CHAR(10)&"]*)")&
      "_"&transpose(FILTER(C:C,LEN(A:A)))&
      "_"&transpose(FIlTER(D:D,LEN(A:A)))&
      "_"&transpose(filter(E:E,LEN(A:A))),),
      " ","|"),,1000))," ")),
    "^"&REPT("_[^_]*",COLUMN(OFFSET(A2,,,1,4))-1)&"_([^_]*)"
   )
),"|"," "))

Basé sur ne réponse par Markus Jarderot à en essayant de se scinder dans arrayformula dans google tableur

Comment ça fonctionne

Partie 1. La solution dans la réponse liée

La question portait sur la division d'une colonne de valeurs séparées par des points à l'aide d'une formule matricielle.

La formule proposée était la suivante:

=ARRAYFORMULA(IFERROR(REGEXEXTRACT("."&A2:A;
    "^"&REPT("\.[^.]*";COLUMN(OFFSET(A2;;;1;4))-1)&"\.([^.]*)")))
  • OFFSET (A2 ;;; 1; 4) renvoie un tableau 1 x 4, les valeurs importent peu.
  • COLUMN renvoie {1,2,3,4}
  • REPT renvoie = {"", ". [^.] ", ". [^.] ". [^.] ",". [^.] ". [^.] ", ". [^.] "}
  • "." & A2: A concatène un point à chaque valeur de cellule en A2: A. Le résultat est un tableau.
  • REGEXEXTRACT extrait la sous-chaîne correspondante pour chaque cellule du tableau précédent et renvoie # N/A à l'élément de tableau correspondant s'il n'y a pas de correspondance.
  • IFERROR remplace les erreurs par des cellules vides.
  • ARRAYFORMULA étend le résultat à la zone requise du tableau résultant.

Deuxième partie, adaptation

Dans la formule de la section "Formule unique", il a été utilisé deux fois.

Diviser les valeurs dans la colonne B

Formule

REGEXEXTRACT(
CHAR(10)&transpose(FILTER(B:B,LEN(A:A))),
"^"&REPT(CHAR(10)&"[^"&CHAR(10)&"]*",row(OFFSET(A1,,,6,1))-1)&CHAR(10)&"([^"&CHAR(10)&"]*)"
)&

Dans l'expression régulière, le séparateur \. a été remplacé par CHAR(10) car il s'agit de celui utilisé par l'OP. De plus, COLUMN(OFFSET(A1,,,1,6) a été remplacé par row(OFFSET(A1,,,6,1)) afin de fractionner les valeurs en lignes au lieu de colonnes. Cela a été fait pour pouvoir remplir les lignes.

Remplir les lignes

Pour remplir les lignes, les transpositions de chaque colonne ont d'abord été concaténées avec le résultat de la formule précédente, de la manière suivante:

transpose(FILTER(A:A,LEN(A:A)))&"_"&

La formule de la section précédente

&
"_"&transpose(FILTER(C:C,LEN(A:A)))&
"_"&transpose(FILTER(D:D,LEN(A:A)))&
"_"&transpose(FILTER(E:E,LEN(A:A)))

"_" a été inclus pour séparer cette chaîne plus tard

Concaténer les valeurs

Comme QUERY concatène les lignes en utilisant un espace comme séparateur, les espaces d'origine ont d'abord été remplacés par |, puis nous avons utilisé QUERY sans le deuxième argument, un grand nombre en tant que troisième argument. Comme Google Sheets a des limites à la fois pour les petits et les grands nombres, nous avons utilisé 2E6, car c’est le nombre maximum de lignes que peut avoir un tableur à 1 colonne.

Joindre et diviser les colonnes transposées

Les colonnes transposées ont d'abord été jointes en utilisant un espace comme séparateur, puis le résultat a été divisé par.

Retrouver la forme originale

Transposez à nouveau pour obtenir la forme d'origine et utilisez le motif décrit dans la première partie pour scinder les chaînes en _.

Touche finale

Remplacez |par des espaces.

1
Rubén