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:
Je dois procéder comme suit pour optimiser cette fiche:
La feuille devrait alors ressembler à ceci:
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!
Tout d'abord, désolé pour la réponse tardive, mais j'ai une solution pour vous de travailler.
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;
}
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.
data
résultat
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.
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:
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.)
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;
}
=ARRAYFORMULA(substitute(IFERROR(
REGEXEXTRACT(
"_"&transpose(split(join(" ",query(substitute(
IFERROR(transpose(FILTER(A:A,LEN(A:A)))&
"_"®EXEXTRACT(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
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)&"\.([^.]*)")))
Dans la formule de la section "Formule unique", il a été utilisé deux fois.
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.
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
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.
Les colonnes transposées ont d'abord été jointes en utilisant un espace comme séparateur, puis le résultat a été divisé par.
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 _
.
Remplacez |
par des espaces.