Comment puis-je créer des données sur un tri automatique Google Sheets?

58

Supposons que je souhaite que Google Sheets trie automatiquement certaines données, par exemple des colonnes C.

Comment je fais ça?

Je sais que je peux trier les données manuellement en cliquant avec le bouton droit de la souris et en sélectionnant Trier les données , mais ce n'est pas ce que je recherche.

nuts
la source

Réponses:

52

Vous pouvez utiliser la sort()fonction pour cela, mais vous devez avoir vos données à un endroit et une copie automatiquement triée de ces données à un autre endroit.

Par exemple, disons que j'ai Sheet1 avec mes données:

   | A    | B    | C
=====================
 1 | This | this | 2
 2 | Is   | is   | 1
 3 | Test | test | 3

Ensuite, dans Sheet2, cellule A1, je mettrais cette fonction:

= trier (Sheet1! A: C, 3, TRUE)

Cela afficherait mes données, mais triées par colonne C (la troisième colonne), par ordre croissant.

   | A    | B    | C
=====================
 1 | Is   | is   | 1
 2 | This | this | 2
 3 | Test | test | 3
William Jackson
la source
Les paramètres doivent être séparés par un point-virgule, par ;exemple,= sort(Sheet1!A:C; 3; TRUE)
2
@Petr Cela fonctionne très bien pour moi avec les virgules.
William Jackson
6
@ user17634: Cela dépend de vos paramètres régionaux.
Vidar S. Ramdal
43

Il est également possible d'utiliser les scripts Google Apps pour effectuer un tri automatique sur place des données.

Cela peut être plus difficile à réaliser et plus sujet aux erreurs (je choisirais quand même la solution de William Jackson, +1 BTW), mais j’ai pensé que c’était assez intéressant à montrer.

J'ai une feuille qui ressemble à ceci:

feuille de tri automatique

J'ai ajouté un nouveau script, en utilisant ces étapes:

  • dans le menu, allez dans Outils -> Script Editor ...
  • sélectionnez Créer un nouveau projet
  • Dans la fenêtre de code vide qui apparaît, collez le code suivant, qui sera exécuté automatiquement chaque fois qu'une cellule est modifiée:

    function onEdit(event){
      var sheet = event.source.getActiveSheet();
      var editedCell = sheet.getActiveCell();
    
      var columnToSortBy = 4;
      var tableRange = "B3:E9";
    
      if(editedCell.getColumn() == columnToSortBy){   
        var range = sheet.getRange(tableRange);
        range.sort( { column : columnToSortBy } );
      }
    }
    
  • retournez à la feuille et commencez à jouer avec les valeurs pour voir le tableau se trier automatiquement à chaque fois

Remarque:

Dans le script ci-dessus,

  • la valeur 4représente l'index de la colonne D (la Valuecolonne - celle qui va être triée)
  • la valeur "B3:E9"représente la plage de la table (à l'exclusion de la ligne d'en-tête)

Votre table sera probablement différente de la mienne, ces valeurs doivent donc être ajustées en conséquence.

Cristian Lupascu
la source
J'ai essayé la fonction [modifiée] onEdit (événement) {var sheet = event.source.getActiveSheet (); var éditéCell = sheet.getActiveCell (); var columnToSortBy = 4; var tableRange = "A2: F99"; if (editedCell.getColumn () == columnToSortBy) {var plage = sheet.getRange (tableRange); range.sort ({column: columnToSortBy}); }} mais continue à avoir une erreur: TypeError: Impossible de lire la propriété "source" de non définie. (ligne 2) qui correspond au code suivant: var sheet = event.source.getActiveSheet (); des idées? NM, obtenez uniquement l'erreur lors de l'exécution à partir de la page de script, mais cela fonctionne correctement sur la feuille de calcul réelle
drizzt09
mais continue à avoir une erreur: TypeError: Impossible de lire la propriété "source" de non définie. (ligne 2) qui correspond au code suivant: var sheet = event.source.getActiveSheet (); des idées? NM, obtenez uniquement l'erreur lors de l'exécution à partir de la page de script, mais cela fonctionne correctement sur la feuille de calcul. Maintenant la question ... son tri AZ, comment puis-je le changer pour trier automatiquement ZA? merci
drizzt09
@ drizzt09 Lorsque vous appelez la méthode que vous avez probablement spécifiée nullpour le eventparamètre, lequel est par ailleurs correctement renseigné par l'infrastructure Google Spreadsheet lorsqu'un événement réel est déclenché.
Cristian Lupascu
3
@ drizzt09 pour changer l'ordre de tri, modifiez la range.sortligne comme ceci: range.sort( { column : columnToSortBy, ascending: false } ); . Pour plus d'options de tri, voir developers.google.com/apps-script/class_range#sort
Cristian Lupascu
@ w0lf Merci qui a fonctionné parfaitement. maintenant je voudrais ajouter ou avoir une fonction séparée qui remplit exactement la même fonction mais à l'ouverture ou à l'actualisation. Ainsi, lorsque j'ouvre / actualise la feuille Excel, elle trie automatiquement la 4ème colonne en descendant de la même manière que lorsque je modifie le code de la colonne 4 avec votre code actuel. Merci
10

Voici un script générique qui triera automatiquement en fonction de la 1ère colonne et supposera une ligne d'en-tête.

Pour créer un script:

  • Dans le menu, allez dans Outils -> Script Editor ...

Dans la fenêtre de code vide, collez le code suivant, qui s'exécutera automatiquement chaque fois qu'une cellule est modifiée:

 // LinkBack to this script:
 // http://webapps.stackexchange.com/questions/7211/how-can-i-make-some-data-on-a-google-spreadsheet-auto-sorting/43036#43036

 /**
 * Automatically sorts the 1st column (not the header row) Ascending.
 */
function onEdit(event){
  var sheet = event.source.getActiveSheet();
  var editedCell = sheet.getActiveCell();

  var columnToSortBy = 1;
  var tableRange = "A2:T99"; // What to sort.

  if(editedCell.getColumn() == columnToSortBy){   
    var range = sheet.getRange(tableRange);
    range.sort( { column : columnToSortBy, ascending: true } );
  }
}
geekzspot
la source
3
J'ai trouvé que je devais le faire var sheet = SpreadsheetApp.getActiveSpreadsheet();au lieu de ce qui est ici.
dldnh
Cela fonctionne très bien, mais comment puis-je l'éditer pour ne trier que sur une seule feuille dans doc?
Moobot
ne semble pas fonctionner
shadowz1337
7

Une autre option sans script est:

=QUERY(A1:C3,"SELECT * ORDER BY C")  

La plage est restreinte (A1: C3), car les entrées vierges apparaissent en premier dans l'ordre.

nuts
la source
4
Pourriez-vous s'il vous plaît laissez-moi savoir où dois-je mettre cela dans?
Louis Tran
1
Vous pouvez utiliser SELECT * WHERE C <> '' ORDER BY Cpour ignorer les entrées vides, vous pouvez alors utiliser une plage suffisamment large pour inclure toutes les lignes actuelles et futures.
Guss
0

Utilisation de la solution de script, mais tri sur plusieurs colonnes

Je voulais trier par colonne de menu déroulant puis par date.

Pour ce faire, modifiez la ligne "range.sort" de l'un des fragments de code de Cristian ou de geekspotz, de la manière suivante:

// Sorts descending by edited column, then ascending by column 1 
// Note the use of an array
range.sort([{column: columnToSortBy, ascending: false}, {column: 1, ascending: true}]);

La différence consiste à ajouter les crochets droits autour de votre déclaration entière (tableau) et à séparer les tris par des virgules.

Modification du code de tri extraite de la réponse du débordement de pile de Serge ici : Tri automatique sur des feuilles

structure profonde
la source