2009-06-05 20 views
36

Poszukuję sposobu automatycznej zmiany koloru minimalnej komórki w wierszu w arkuszu kalkulacyjnym Google Docs.Automatyczne pisanie arkuszy kalkulacyjnych Google

Tak więc, na stole jak

1 | 2 | 3 
4 | 2 | 1 
2 | 1 | 6 

Byłoby kolor wszystkie komórki z „1” w nich.

+0

Niekoniecznie związane z programowaniem. – JasonV

+2

Formatowanie warunkowe, nawet jeśli odbywa się za pośrednictwem interfejsu użytkownika, jest związane z programowaniem, ponieważ wymaga analizy problemu w celu zdefiniowania zestawu reguł w taki sposób, aby komputer mógł wykonać zadanie. Biorąc to pod uwagę, myślę, że to pytanie powinno zostać ponownie otwarte. –

+0

Wybierz wszystkie komórki i zastosuj niestandardową formułę: '= i (nie (isblank (A1)), A1 = min (1: 1))' – pnuts

Odpowiedz

57

W rozwijanym menu, Format-> Formatowanie warunkowe ...

Następnie ustawić swoje zasady i kolor. Możesz wybrać wiele komórek i to również.

Edit:

To jest zakres tego, co można zrobić z barwienia. Możesz znaleźć skomplikowaną formułę, aby znaleźć minimum komórek, a następnie, jeśli to pasuje do tego, co jest w komórce, a następnie pokolorować je, ale możesz chcieć użyć Excela zamiast dokumentów Google, jeśli jest to bardzo ważne dla Ciebie.

+1

JEŚLI nie możesz osiągnąć tego, czego potrzebujesz, używając formatowania warunkowego, z którego zawsze możesz skorzystać edytor skryptów, aby zmodyfikować zdarzenie onEdit, aby sprawdzić komórkę i zmienić kolor w zależności od dowolnego warunku, jaki można sobie wyobrazić. Nie trzeba (ani używać) w programie Excel. –

+0

To się zmieniło od 2015 roku, ale dostałem to, czego potrzebowałem! Możesz teraz kliknąć "Format" -> "Formatowanie warunkowe ..." -> "Skala kolorów". – PubNub

+0

@Kekoa Cool, dzięki za aktualizację. –

26

Sztuką jest, aby dopasować się do wyzwalacza zdarzeń onEdit i dodać trochę inteligencji

Na pierwszy rzut oka myślałem formatowanie warunkowe będzie działać, ale rząd minimalny-per-jest trochę zbyt skomplikowana dla standardowego formatowania warunkowego . To trochę trudne do wymyślenia, ale można to zrobić.

Oto pełne skrypt (przetestowane i działa):

function onEdit() { 
    var s = SpreadsheetApp.getActiveSheet(); 
    var r = s.getActiveRange(); 
    var row = r.getRow(); 
    var cols = s.getDataRange().getNumColumns(); 

    // crate a range for the row using getRange(row, column, numRows, numColumns) 
    var rowRange = s.getRange(row, 1, 1, cols); 
    var rowValues = rowRange.getValues(); 

    // check all the values in the row 
    var val = 999; 
    for(var i = 0; i < cols; i++) { 
    if(val > rowValues[0][i] && rowValues[0][i] !== "") { 
     val = rowValues[0][i]; 
    } 
    } 
    for(var j = 0; j < cols; j++) { 
    if(rowValues[0][j] === val) { 
     s.getRange(row,(j + 1)).setFontColor("blue"); 
    } else { 
     s.getRange(row,(j + 1)).setFontColor("black"); 
    } 
    } 
} 

Najpierw dopasować się do obsługi zdarzeń onEdit wywołać skrypt ze zmianami kalkulacyjnych.

function onEdit() 

Poprzez nadanie funkcji na klawiaturze, będzie automatycznie wiedzieć, że chcesz zastąpić akcję onEdit.

Uwaga: Obsługa zdarzeń w Dokumentach jest jednak nieco skomplikowana. Ponieważ dokumenty mogą obsługiwać wiele jednoczesnych edycji przez wielu użytkowników, procedury obsługi zdarzeń są obsługiwane po stronie serwera. Głównym problemem związanym z tą strukturą jest to, że gdy skrypt wyzwalający zdarzenia się nie powiedzie, nie powiedzie się na serwerze. Jeśli chcesz zobaczyć informacje na temat debugowania, musisz skonfigurować jawny wyzwalacz w menu wyzwalaczy, który będzie wysyłać Ci e-mailem informacje o debugowaniu, gdy zdarzenie się nie powiedzie, inaczej nie powiedzie się po cichu.

Fetch numer wiersza:

var r = s.getActiveRange(); 
    var row = r.getRow(); 

dość wymowne tutaj. Aktywny zakres to edytowana komórka.

Grab liczba kolumn:

var cols = s.getDataRange().getNumColumns(); 

Trzeba sprawdzić zakres danych dla całego arkusza kalkulacyjnego do tego.

Następnie trzeba skonstruować zakres danych zawierającą dane dla wiersza w pytaniu:

var rowRange = s.getRange(row, 1, 1, cols); 

przeczytać komentarze w kodzie, aby zobaczyć, jakie wartości powinny być.

Potem buforować wyników dla testowania wartości:

var rowRange = s.getRange(row, 1, 1, cols); 

Ze względu na charakter Dokumentów Google callbacków zdarzeń skrypty uruchamiane po stronie serwera tak, aby zapobiec nadużyciom, Google stawia limit czasowy na wykonanie skryptu. Przechowując wartości w pamięci podręcznej, serwer nie może wykonywać niepotrzebnych wycieczek w obie strony w celu pobrania wartości z arkusza kalkulacyjnego.

Następne dwie części to miejsce, w którym dzieje się cała magia.

Najpierw przechodzimy przez wszystkie komórki wiersza, aby znaleźć minimalną wartość.

var val = 999; 
    for(var i = 0; i < cols; i++) { 
    if(val > rowValues[0][i] && rowValues[0][i] !== "") { 
     val = rowValues[0][i]; 
    } 
    } 

Ustawiłem domyślny pułap 999 dla uproszczenia. This could be change to a more appropriate value. Sztuką jest przetestowanie wartości względem aktualnego niskiego poziomu. Jeśli jest niższy, oznacz nową niską wartość.

Możesz wyjść z łatwości, zaznaczając numer komórki z najniższą wartością i ustawiając go jawnie, ale chciałem pokryć przypadki, w których wiele komórek ma najniższą wartość.

Obróbka wiele komórek zawierających co najmniej wymaga drugiego przebiegu:

for(var j = 0; j < cols; j++) { 
    if(rowValues[0][j] === val) { 
    s.getRange(row,(j + 1)).setFontColor("blue"); 
    } else { 
    s.getRange(row,(j + 1)).setFontColor("black"); 
    } 
} 

Pętla przez wszystkie komórki w rzędzie pozostaje taka sama. Tym razem sprawdzamy tylko, czy wartości komórek odpowiadają wybranemu minimum. Jeśli pasuje, kolor czcionki zmienia się na niebieski. W przeciwnym razie kolor czcionki zostanie zmieniony na czarny.


To wszystko podsumowuje. Trudno jest przyzwyczaić się do sposobu, w jaki Skrypt Google Apps zajmuje się odwoływaniem się do arkuszy kalkulacyjnych i komórek danych, ale niewiele jest do zrobienia w Dokumentach.

Zrobiłem public link do arkusza kalkulacyjnego, którego użyłem do napisania/przetestowania tego kodu. Śmiało wypróbuj.