Les feuilles Google divisent la cellule multiligne en nouvelles lignes (+ doublons les entrées de ligne environnantes)

14

Je compile une base de données d'informations sur l'adresse de l'entreprise, y compris le personnel clé de chaque entreprise. La feuille de calcul Google dont j'ai hérité pour ce projet comprend 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 (c.-à-d. 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:

entrez la description de l'image ici

J'ai besoin de faire ce qui suit pour optimiser cette feuille:

  1. divisez chaque cellule de «portée clé» multiligne de sorte que chaque nom de portée clé apparaisse sur sa propre ligne. Cela nécessite que de nouvelles lignes soient insérées sous la ligne d'origine.
  2. dupliquer les données de toutes les autres cellules de la ligne d'origine (c'est-à-dire des colonnes A et 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é - j'aurai environ 1000 entreprises à traiter, je ne peux donc pas le faire avec des étapes manuelles

La feuille devrait alors ressembler à ceci:

entrez la description de l'image ici

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

onglet kirk
la source

Réponses:

14

Tout d'abord, désolé pour la réponse tardive, mais j'ai une solution avec laquelle vous pouvez 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;
}

Expliqué

Le script évalue chaque ligne, et en particulier la deuxième colonne de chaque ligne (dans les tableaux JavaScript sont basés sur zéro, donc la colonne 2 correspond à l'index 1 du tableau). Il divise le contenu de cette cellule en plusieurs valeurs et utilise le "\n"délimiteur as (saut de ligne). Après cela, il ajoute les informations existantes à un tableau et n'ajoute que 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ée pour afficher le résultat.

Capture d'écran

Les données
entrez la description de l'image ici

résultat
entrez la description de l'image ici

Exemple

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

Jacob Jan Tuinstra
la source
2
Génial génial génial - achetez une bière à cet homme! Merci beaucoup Jacob, c'est exactement ce dont j'ai besoin.
onglet kirk
2
Et comment définir la gamme? (obtenez ce message "ne peut pas lire la propriété" longueur "indéfini" Merci!
user2060451
sur un fichier vraiment volumineux, cela échouera probablement ... résultat trop volumineux.
Kyle Pennell
Brillamment répondu, juste un bug. LA PREMIÈRE COLONNE dans la plage donnée ne doit PAS avoir le DELIMITER. La solution temporaire consiste à avoir des nombres en série ou une valeur statique comme première colonne. Non essayé, mais la première colonne vide devrait également résoudre le problème.
Ashish Singh
3

Une solution reproductible aura besoin d'un script.

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

entrez la description de l'image ici

Copy / Paste-special, valorise le contenu de la colonne d'assistance.

Et pour chaque colonne d'assistance qui est utilisée (si tout va bien pas trop, parce que j'espère que vous n'avez pas trop de personnes dans une même entreprise) copiez-collez manuellement le bloc de lignes à la fin du bloc actuel. (Ce n'est pas une bonne description, mais vous obtenez la dérive.)

MaryC.fromNZ
la source
Salut Mary, merci mais j'ai besoin de l'individu. les noms des personnes ont été déposés dans de nouvelles ROWS (avec des lignes supplémentaires générées automatiquement pour les accueillir), puis les informations environnantes ont été copiées à côté des nouvelles cellules «personne». Et j'ai besoin d'un processus 100% automatisé - je ne peux pas le faire manuellement pour un millier d'entreprises!
onglet kirk
Vous n'avez pas besoin d'effectuer l'étape manuelle pour le millier entier d'entreprises. Vous ne devez le faire que pour le nombre maximal de pepole associé à l'une de ces entreprises: par exemple, si une entreprise a six personnes, six nouvelles colonnes d'assistance seront créées, vous devez donc effectuer un copier-coller manuel. six fois, une pour chaque colonne.
MaryC.fromNZ
1
Quelqu'un pourrait écrire un script pour cela (je ne suis pas quelqu'un comme ça!) - mais vraiment le temps passé à le tester serait probablement plus long que le temps passé à le faire manuellement.
MaryC.fromNZ
2

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

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

  • Vous devrez très probablement modifier la valeur de comparaison de la kligne 8 qui fait référence à la colonne où vos données à analyser doivent être trouvées. Le même nombre devra entrer dans la 2e valeur du tableau à la ligne 4.

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

Pour rendre tout cela un tout petit peu plus facile, 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 mentionne le nombre de colonnes cible commence par 0 comme 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;
}

Les références

jfunk
la source
1
Si j'exécute le code, il dit: TypeError: Impossible de lire la propriété "length" de indéfini. Merci beaucoup. La réponse doit être ici: La réponse doit être quelque part ici (developers.google.com/apps-script/reference/spreadsheet/…) Mais je continue d'avoir la même erreur.
user2060451
@ user2060451 La solution de cette réponse montre le code de la fonction personnalisée, elle n'est pas destinée à être exécutée à partir de l'éditeur de script. J'ai ajouté un lien vers le guide des fonctions personnalisées de Google.
Rubén