Triage avec condition

Bonjour,

Je suis dans la situation où je souhaite faire un tri automatique de mon tableau par ordre alphabétique en fonction de la colonne A. Pour cela j'ai réussi grace à ca :

function onEdit(event){

var sheet = SpreadsheetApp.getActiveSpreadsheet();

var editedCell = sheet.getActiveCell();

var columnToSortBy = 1;

var tableRange = "A4:L100"; // What to sort.

if(editedCell.getColumn() == columnToSortBy){

var range = sheet.getRange(tableRange);

range.sort( { column : columnToSortBy, ascending: true } );

}

}

Sauf que j'aimerai ajouter un critère a ce tri. J'ai une case a coché ds une colonne et je voudrais que mon tableau soit trier par ordre alphabétique selon la colonne A mais aussi que tt les lignes ou la case a coché est sélectionné se retrouve en haut du tableau.

En gros trier ds le haut du tableau par ordre alphabétique les lignes ou la case est coché et dans un second tps tjrs par ordre alphabétique celles ou la case n'est pas coché.

Merci d'avance

Bonjour,

=QUERY(A4:L100;"SELECT * ORDER BY A " & SI(A1;"ASC";"DESC") & " ORDER BY B " & SI(B1;"ASC";"DESC") & " ORDER BY C " & SI(C1;"ASC";"DESC") & " ORDER BY D " & SI(D1;"ASC";"DESC") & " ORDER BY E " & SI(E1;"ASC";"DESC") & " ORDER BY F " & SI(F1;"ASC";"DESC") & " ORDER BY G " & SI(G1;"ASC";"DESC") & " ORDER BY H " & SI(H1;"ASC";"DESC") & " ORDER BY I " & SI(I1;"ASC";"DESC") & " ORDER BY J " & SI(J1;"ASC";"DESC") & " ORDER BY K " & SI(K1;"ASC";"DESC") & " ORDER BY L " & SI(L1;"ASC";"DESC") & " ")

Une formule qui sera plus simple qu'un app script. Si tu veux en app script, dis le moi.

Bonne Journée

PS: Cours sur la fonction QUERY : https://www.sheets-pratique.com/fr/query

Bonjour et bienvenue,

Il serait judicieux de mettre une lien vers un fichier-test, je suis d'accord avec ImoKa.

En complément de sa réponse, voici un script de tri multicolonnes :

function autoSort(feuille,c1,c2) {
  var r = feuille.getDataRange();
  r = r.offset(1, 0);
  r.sort([{column: c1, ascending: false}, {column: c2, ascending: false}]);
}

que tu peux appeler comme ceci

function onEdit(event) {
  var r = event.source.getActiveRange();
  var f = event.source.getActiveSheet();
  var columnToSortBy = 1;
  var columnToSortBy = x;
  if (r.getColumn() == columnToSortBy) {
    autoSort(f,columnToSortBy1,columnToSortBy2);
  }
}

x selon la colonne indiquée en première ligne. S'il y en a plusieurs, il faut faire une boucle.

https://docs.google.com/spreadsheets/d/1uKV918QXHeobPlTuFFNHuXBiqMURs2UCvCvPQJbzk9A/edit#gid=0

je voudrais trier par ordre alphabétique, en mettant en haut si la case à cocher en colone F est coché.

Merci d'avance.

Ah déso j'avais oublié les autorisations

Ah !! il y a des protections ...

image

cela fonctionne sur la feuille test car il n'y a pas de protection

function onEdit(event) {
  var r = event.source.getActiveRange();
  var f = event.source.getActiveSheet();
  if (r.getColumn() == 1 || r.getColumn() == 6) {
   trier();
  }
}
function trier(){
  var f = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
  var r = f.getRange('A4:L'+getLastDataRow(f))
  r.sort([{column: 6, ascending: false}, {column: 1, ascending: true}]);
}
function getLastDataRow(sheet) {
  var lastRow = sheet.getLastRow();
  var range = sheet.getRange("A" + lastRow);
  if (range.getValue() !== "") {
    return lastRow;
  } else {
    return range.getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
  }              
}

c'est mieux avec un fichier, car on se demandait si la case à cocher était en tête de colonne ou dans une colonne donnée !

Ah super c est exactement ce que je voulais.

Merci beaucoup

Juste un petit soucis : lors du tri de mes lignes, mes liste déroulantes ne fonctionnent plus correctement.

Par exemple j'ai une liste déroulante ligne 4 étant censé renvoyer la valeur situé sur la même ligne mais sur un autre onglet. Mais suite au tri A > Z cette liste situé ligne 4 se retrouve ligne 1 et me renvoie toujours les valeur de la ligne 4.

Est-il possible de faire en sorte qu'elle renvoie les valeurs des colonnes A et B de la ligne ou elle se trouve ?

Peux-tu mettre un exemple dans ton fichier ? Comment est faite la relation entre les 2 onglets ?

Bonjour,

J'ai mis à jour le doc.

En fait les liste déroulantes des colonnes H et I de l'onglet test reprennent les valeurs des colonnes A et B de la ligne correspondante.

Sauf que lorsque le tri s'effectue elles gardent les valeurs de leur cellule d'origine et j'aurais voulu que ce soit toujours de la ligne correspondante.

ok,

dans ce cas, il faut s'appuyer sur une zone stable comme G3

donc en A4 de matrice

=IFERROR(TRANSPOSE(FILTER($M$1:$M$12;$L$1:$L$12=OFFSET(test!G$3;row()-3;)));"")

sans oublier de préciser que le script ne s'applique sur sur 'test'

function onEdit(event) {
  var r = event.source.getActiveRange();
  var f = event.source.getActiveSheet();
  if (f.getName()== 'test' && (r.getColumn() == 1 || r.getColumn() == 3)) {
   trier();
  }
}

Je pense que l'on c est mal compris, je n avais pas de soucis avec cette formule (enfin je crois).

Mon soucis est que sur l'onglet test par exemple la liste déroulante de la cellule G4 me renvoie les données situés dans l'onglet Matrice en A4 et B4.

Sauf que lors du tri des lignes de l onglet test m'a liste déroulante situé en G4 peut être amené à se retrouver en G5, hors la liste déroulante me renvois toujours les valeurs de la Matrice A4 et B4 au lieu de A5 et B5 comme je le voudrais.

Vu qu'on a pas l'air de pouvoir mettre de formule directement dans la liste déroulante, existe il un moyen de réorganisé mes colonnes A et B de la Matrice pr que ça colle avec le tri de test ?

Trier une collone en fonction d'une autre ?

Ou autre solution si tu as ?

Merci d'avance

cogitations stériles

cogitations stériles

La solution serait celle-ci :

  • Inclure les données valides en colonnes M et N de test
  • Inclure M et N dans le tri
function trier(){
  var f = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
  derL = getLastDataRow(f)
  var r = f.getRange('A4:N'+derL)
  r.sort([{column: 3, ascending: false}, {column: 1, ascending: true}]);
}
  • Mettre en M4 la formule suivante
=IFERROR(TRANSPOSE(FILTER(Matrice!$M$1:$M$12;Matrice!$L$1:$L$12=OFFSET(G$3;row()-3;)));"")
  • et mettre en H4 la validation suivante
=$M4:$N4

tu peux masquer les colonnes M et N si besoin

Ahhh oui pas été du tout.

Franchement merci bcp.

j'ai souffert pour trouver ...

Rechercher des sujets similaires à "triage condition"