spreadsheets google google-spreadsheet gs-conditional-formatting

google-spreadsheet - google - dashboard excel drive



Google Spreadsheet Automatic Coloring (2)

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.

Entonces, para una mesa como

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

Colorearía todas las celdas con ''1'' en ellas.


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

Luego establece tus reglas y tu color. Puede seleccionar varias celdas y hacer esto también.

Editar:

Ese es el alcance de lo que puedes hacer con el color. 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.


El truco es tocar el desencadenador de evento onEdit y agregar algo de inteligencia

A primera vista, pensé que el formato condicional funcionaría, pero el mínimo por fila es un poco demasiado complejo para el formato condicional estándar. Es un poco complicado de entender, pero se puede hacer.

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

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

Primero, toca el controlador de eventos onEdit para activar el script con los cambios en la 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 manejadores de eventos en Docs son un poco difíciles. 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.

Obtener el número de fila:

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

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

Toma el número de columnas:

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

Para esto, debe verificar el rango de datos de toda la hoja de cálculo.

A continuación, debe construir un rango de datos que contenga los datos para la fila en cuestión:

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

Lea los comentarios en el código para ver cuáles deberían ser los valores.

Luego almacenamos en caché los resultados para probar valores:

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

Debido a la naturaleza de los scripts de Google Docs, las devoluciones de eventos se ejecutan en el lado del servidor, por lo que, para evitar abusos, Google establece 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. Esto podría cambiar a un valor más apropiado . 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.

Manejar múltiples celdas 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 ciclo 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 lo resume todo. 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 enlace público a la hoja de cálculo que solía escribir / probar este código. Siéntase libre de probarlo.