Jak mogę wykonać niektóre dane w automatycznym sortowaniu Arkuszy Google?

57

Powiedzmy, że chcę, aby Arkusze Google automatycznie sortowały niektóre dane, na przykład kolumnę C.

W jaki sposób mogę to zrobić?

Wiem, że mogę ręcznie sortować dane, klikając prawym przyciskiem myszy i wybierając Sortuj dane , ale nie tego szukam.

orzechy
źródło

Odpowiedzi:

51

Można skorzystać z sort()funkcji za to, ale trzeba mieć swoje dane w jednym miejscu, a automatycznie sortowane kopię tych danych w innym miejscu.

Powiedzmy, że mam Arkusz1 z moimi danymi:

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

Następnie w arkuszu 2, komórka A1, umieściłbym tę funkcję:

= sort (Arkusz1! A: C, 3, PRAWDA)

To pokazałoby moje dane, ale posortowane według kolumny C (trzecia kolumna), rosnąco.

   | A    | B    | C
=====================
 1 | Is   | is   | 1
 2 | This | this | 2
 3 | Test | test | 3
William Jackson
źródło
Parametry muszą być oddzielone średnikiem, ;np.= sort(Sheet1!A:C; 3; TRUE)
2
@Petr Działa mi dobrze z przecinkami.
William Jackson
6
@ user17634: To zależy od ustawień regionalnych.
Vidar S. Ramdal,
42

Możliwe jest także użycie Skryptów Google Apps w celu automatycznego sortowania danych w miejscu.

Może to być trudniejsze do osiągnięcia i bardziej podatne na błędy (nadal wybrałbym rozwiązanie Williama Jacksona, +1 BTW), ale myślałem, że to wystarczająco interesujące do pokazania.

Mam arkusz, który wygląda następująco:

arkusz automatycznego sortowania

Dodałem nowy skrypt, wykonując następujące kroki:

  • w menu przejdź do Narzędzia -> Edytor skryptów ...
  • wybierz Utwórz nowy projekt
  • w wyświetlonym pustym oknie kodu wklej następujący kod, który będzie uruchamiany automatycznie przy każdej edycji komórki:

    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 } );
      }
    }
    
  • wróć do arkusza i zacznij bawić się wartościami, aby za każdym razem automatycznie sortować tabelę

Uwaga:

W powyższym skrypcie

  • wartość 4reprezentuje indeks kolumny D ( Valuekolumna - ta, która będzie sortowana)
  • wartość "B3:E9"reprezentuje zakres tabeli (wyłączając wiersz nagłówka)

Twoja tabela najprawdopodobniej będzie różnić się od mojej, więc te wartości należy odpowiednio dostosować.

Cristian Lupascu
źródło
Próbowałem twojej [edytowanej] funkcji onEdit (event) {var sheet = event.source.getActiveSheet (); var editedCell = sheet.getActiveCell (); var columnToSortBy = 4; var tableRange = "A2: F99"; if (editedCell.getColumn () == columnToSortBy) {var range = sheet.getRange (tableRange); range.sort ({column: columnToSortBy}); }}, ale wciąż pojawia się błąd: TypeError: Nie można odczytać właściwości „source” z niezdefiniowanej. (wiersz 2), który jest następującym kodem: var sheet = event.source.getActiveSheet (); jakieś pomysły? NM, błąd pojawia się tylko podczas uruchamiania ze strony skryptu, ale działa poprawnie na rzeczywistym arkuszu kalkulacyjnym
drizzt09
ale ciągle pojawia się błąd: TypeError: Nie można odczytać właściwości „source” z niezdefiniowanej. (wiersz 2), który jest następującym kodem: var sheet = event.source.getActiveSheet (); jakieś pomysły? NM, błąd pojawia się tylko podczas uruchamiania ze strony skryptu, ale działa poprawnie w rzeczywistym arkuszu kalkulacyjnym. Teraz pytanie ... jego sortowanie AZ, jak zmienić to na automatyczne sortowanie ZA? dzięki
drizzt09
@ drizzt09 Po wywołaniu metody prawdopodobnie zdefiniowanych nulldla eventparametru, który jest inaczej właściwie zaludnionej przez infrastrukturę arkusza kalkulacyjnego Google, gdy prawdziwy zdarzenia.
Cristian Lupascu
3
@ drizzt09 zmienić kolejność sortowania, zmień range.sortlinię: range.sort( { column : columnToSortBy, ascending: false } ); . Więcej opcji sortowania można znaleźć na stronie developers.google.com/apps-script/class_range#sort
Cristian Lupascu
@ w0lf Dziękuję, że działało idealnie. teraz chciałbym dodać do niego lub mieć osobną funkcję, która wykonuje dokładnie tę samą funkcję, ale podczas otwierania lub odświeżania. Kiedy więc otworzę / odświeżę arkusz programu Excel, automatycznie posortuję czwartą kolumnę w dół, tak samo jak podczas edycji kodu w kolumnie 4 z twoim bieżącym kodem. Dzięki
10

Oto ogólny skrypt, który będzie automatycznie sortował na podstawie pierwszej kolumny i zakłada wiersz nagłówka.

Aby utworzyć skrypt:

  • W menu przejdź do Narzędzia -> Edytor skryptów ...

W pustym oknie kodu wklej następujący kod, który będzie uruchamiany automatycznie przy każdej edycji komórki:

 // 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
źródło
3
Odkryłem, że muszę var sheet = SpreadsheetApp.getActiveSpreadsheet();zamiast tego, co tu jest.
dldnh
Działa to świetnie, ale jak mogę to edytować, aby sortować tylko na jednym arkuszu w dokumencie?
moobot
nie wydaje się działać
shadowz1337
6

Inną opcją bez skryptu jest:

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

Zakres jest ograniczony (A1: C3), ponieważ w miejscu rosnącym zamówienia najpierw pojawią się puste wpisy.

orzechy
źródło
4
Czy możesz mi powiedzieć, gdzie mam to umieścić?
Louis Tran
1
Możesz użyć, SELECT * WHERE C <> '' ORDER BY Caby zignorować puste wpisy, a następnie użyć wystarczająco dużego zakresu, aby uwzględnić wszystkie bieżące i przyszłe wiersze.
Guss
0

Korzystając z rozwiązania skryptowego, posortuj według więcej niż jednej kolumny

Chciałem posortować według kolumny menu rozwijanego, a następnie według daty.

Aby to zrobić, zmodyfikuj wiersz „range.sort” fragmentów kodu Cristian lub geekspotz w następujący sposób:

// 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}]);

Różnica polega na dodaniu prostych nawiasów wokół całej instrukcji (tablicy) i oddzieleniu sortowania przecinkami.

Modyfikacja kodu sortowania wyciągnięta z odpowiedzi przepełnienia stosu Serge'a tutaj : Automatyczne sortowanie na arkuszach

głęboka struktura
źródło