2009-06-05 22 views
36

Estoy buscando una manera de cambiar automáticamente el color de la celda mínima en una fila en la hoja de cálculo de google docs.Google Spreadsheet Automatic Coloring

lo tanto, para una tabla como

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

Sería colorear todas las células con '1' en ellos.

+0

No necesariamente relacionado con la programación .. – JasonV

+2

El formateo condicional, incluso si esto se realiza a través de una interfaz de usuario, está relacionado con la programación, ya que requiere analizar un problema para definir un conjunto de reglas de modo que una computadora pueda tarea. Considerando esto, creo que esta pregunta debería ser reabierta. –

+0

Seleccione todas las celdas y aplique una fórmula personalizada de: '= y (not (isblank (A1)), A1 = min (1: 1))' – pnuts

Respuesta

57

En el menú desplegable, Formato> Formato condicional ...

luego establezca las reglas y su color. Puede seleccionar varias celdas y hacer esto también.

Editar:

Esa es la medida de lo que puede hacer con el colorante. Quizás pueda encontrar una fórmula compleja para encontrar el mínimo de celdas y luego, si eso coincide con lo que hay en la celda, colorearlo, pero es posible que desee utilizar Excel en lugar de Google Docs si esto es crítico para usted.

+1

SI no puede lograr lo que necesita con el formato condicional, siempre puede usar el editor de scripts para modificar el evento onEdit para verificar la celda y cambiar el color dependiendo de cualquier condición que puedas imaginar. No es necesario (o uso) para Excel. –

+0

¡Esto ha cambiado desde 2015 pero me consiguió lo que necesitaba! Ahora puede hacer clic en 'Formato' ->' Formato condicional ... '->' Color Scale'. – PubNub

+0

@Kekoa Cool, gracias por la actualización. –

26

El truco consiste en aprovechar la activación de un evento onEdit y añadir un poco de inteligencia

A primera vista pensé formato condicional podría funcionar, pero la fila mínimo-por-es un poco demasiado complejo para el formato condicional norma . Es un poco complicado de entender, pero se puede hacer.

Aquí está el guión completo (probado y trabajo):

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"); 
    } 
    } 
} 

En primer lugar, aprovechar el controlador de eventos onEdit para activar la secuencia de comandos con los cambios de hoja de cálculo.

function onEdit() 

Al nombrar una función en Editar, automáticamente sabrá que desea anular la acción onEdit.

Nota: Los controladores de eventos en Documentos son un poco complicados. Debido a que los documentos pueden manejar múltiples ediciones simultáneas por múltiples usuarios, los manejadores de eventos se manejan en el lado del servidor. El principal problema con esta estructura es que cuando falla un script de activación de evento, falla en el servidor. Si desea ver la información de depuración, deberá configurar un activador explícito en el menú de desencadenadores que le envíe la información de depuración cuando el evento falle o fallará de manera silenciosa.

buscar el número de fila:

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

auto Bastante que se explica por aquí. El rango activo es la celda que se está editando.

Coge el número de columnas:

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

Es necesario comprobar el rango de datos para toda la hoja de cálculo para esto.

siguiente que necesita para construir una serie de datos que contiene los datos de la fila en cuestión:

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

leer los comentarios en el código para ver cuáles deben ser los valores.

Luego almacenar en caché los resultados de las pruebas de valores:

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

Debido a la naturaleza de Google Docs devoluciones de llamada de eventos de secuencias de comandos ejecuta en el servidor por lo que, para evitar abusos, Google pone un límite de tiempo para la ejecución del script. Al almacenar en caché los valores, evita que el servidor haga muchos viajes innecesarios para obtener los valores de la hoja de cálculo.

Las siguientes dos partes son donde sucede toda la magia.

Primero, hacemos un pase a través de todas las celdas de la fila para encontrar el valor mínimo.

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

Establecí un techo predeterminado de 999 por simplicidad. This could be change to a more appropriate value. El truco es probar el valor frente a la baja actual. Si es menor, marque el nuevo valor bajo.

Puede salir fácil marcando el número de celda con el valor más bajo y estableciéndolo explícitamente, pero quería cubrir los casos donde las celdas múltiples tienen el valor más bajo.

Manejo de células múltiples que contienen el mínimo requiere una segunda pasada:

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"); 
    } 
} 

El bucle a través de todas las celdas de la fila sigue siendo el mismo. Esta vez solo estamos comprobando si los valores de las celdas coinciden con el mínimo elegido. Si coincide, el color de la fuente cambia a azul. De lo contrario, el color de la fuente cambiará a negro.


Eso sobre lo resume. Es un poco complicado acostumbrarse a la forma en que Google Apps Scripting se ocupa de hacer referencia a las hojas de cálculo y las celdas de datos, pero no hay mucho que los Documentos no puedan hacer.

He hecho un public link en la hoja de cálculo que solía escribir/probar este código. Siéntase libre de probarlo.

Cuestiones relacionadas