web-dev-qa-db-fra.com

Comment puis-je fusionner dans une cellule, toutes les valeurs non nulles d'une ligne concaténées chacune avec l'en-tête de colonne?

J'espère que cet exemple est clair. J'ai joué avec join et filter mais je ne peux pas obtenir le champ Résumé comme ci-dessous:

Example

La rangée 1 contient une liste de sujets. La rangée 2 est l'allocation de matière d'un enseignant (calculée à partir d'une recherche). Je souhaite que la cellule Summary traite simplement chaque ligne. Si une cellule contient une valeur autre que zéro, prenez ce nombre et concaténez-le avec le sujet, puis passez à la fin de la liste.

Heureux d'essayer un script.

1
Stu

Avec le code suivant, vous pouvez préparer le résumé à votre guise.

Code

function mySummary(header, range) {
  var output1 = [];
  for(var i=0, iLen=range.length; i<iLen; i++) {
    var output2 = [];
    for(var j=0, jLen=range[0].length; j<jLen; j++) {
      var value = range[i][j];
      if(value != "" || value > 0) {
        output2.Push(value + " " + header[0][j]);
      }     
    }
    output1.Push([output2.sort().join(", ")]);
  }
  return output1;  
}

Capture d'écran

enter image description here

A expliqué

La fonction personnalisée nécessite deux paramètres pour fonctionner avec: en-tête & range . La première itération ( var i = 0 ) gère les lignes et la seconde ( var j = 0 ) gère les colonnes. Chaque cellule sera évaluée pour des valeurs vides ("") ou non nulles (> 0). Lorsque l'un d'eux est true, le résultat est placé dans un tableau intermédiaire (output2). Lorsque la première ligne est terminée, le résultat combiné est trié, joint et poussé dans un nouveau tableau de sortie (output1), avant de commencer par la deuxième ligne.

Exemple

J'ai créé un exemple de fichier pour vous: Résumé spécial
Ajoutez le script sous Outils> Editeur de script et appuyez sur le bouton Enregistrer.

0

Avec la formule suivante, vous pouvez aussi le faire.

Formule

=JOIN(
   ", ",                                   ==> delimiter join
   TRANSPOSE(
     SORT(
       TRANSPOSE(                          ==> data sort  
         SPLIT(
           JOIN(                           ==> data for split
             ",",                          ==> delimiter join
             ARRAYFORMULA(
               IF(
                 A2:D2<>"",                ==> if statement
                 A2:D2 & " " & $A$1:$D$1,  ==> true statement 
                 ""                        ==> false statement
               )
             )
           ),
           ","                             ==> delimiter split
         )
       ),
       1,                                  ==> column index sort
       TRUE                                ==> ascending or descending
     )
   )
 )


 copy/paste
 =JOIN(", ",TRANSPOSE(SORT(TRANSPOSE(SPLIT(JOIN(",",ARRAYFORMULA(IF(A2:D2<>"",A2:D2 & " " & $A$1:$D$1, ""))),",")),1,TRUE)))

Capture d'écran

enter image description here

Exemple

J'ai créé un exemple de fichier pour vous: Résumé spécial

Remarque

La formule est assez longue, je dirais. L'ajout d'autres critères le rendra encore plus long. L'avantage est le recalcul rapide du résultat. Un inconvénient, malgré la ARRAYFORMULA, est qu'il n'est pas possible d'adresser la plage comme dans la version du script.

1