Coloración automática de un valor específico donde sea que se encuentre en una tabla [cerrado

StackOverflow https://stackoverflow.com/questions/958364

Pregunta

Estoy buscando una manera de cambiar automáticamente el color de la celda mínima en una fila en las hojas de Google. Entonces, para una mesa como:

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

Colorearía todas las celdas con 1 en ellos.

¿Fue útil?

Solución

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

Luego establezca sus reglas y su color. Puede seleccionar varias celdas y hacer esto también.

Editar:

Ese es el alcance de lo que puedes hacer con la coloración. Tal vez pueda encontrar una fórmula compleja para encontrar el mínimo de las celdas, y luego si eso coincide con lo que está en la celda, entonces colorea, pero es posible que desee usar Excel en lugar de Google Docs si esto es algo crítico para usted.

Otros consejos

El truco es aprovechar el activador de eventos OneDit y agregar algo de inteligencia

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

Aquí está el script completo (probado y funcionando):

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 aproveche el controlador de eventos OneDit para activar el script con los cambios de hoja de cálculo.

function onEdit()

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

Nota: Sin embargo, los controladores de eventos en los documentos son un poco complicados. Debido a que los documentos pueden manejar múltiples ediciones simultáneas de múltiples usuarios, los manejadores de eventos se manejan del lado del servidor. El problema principal con esta estructura es que cuando un script de activación de eventos falla, falla en el servidor. Si desea ver la información de depuración, necesitará configurar un disparador explícito en el menú desencadenantes que le envía la información de depuración cuando el evento falle o de lo contrario fallará en silencio.

Obtenga el número de fila:

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

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

Tome el número de columnas:

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

Debe verificar el rango de datos para ver toda la hoja de cálculo para esto.

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 la prueba de valores:

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

Debido a la naturaleza de las devoluciones de llamadas de eventos de secuencias de comandos de Google Docs, se ejecutan el lado del servidor, por lo que para evitar el abuso, Google pone un límite de tiempo en la ejecución de script. Al almacenar en caché los valores, evita que el servidor realice muchos viajes redondos 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 en aras de la simplicidad. Esto podría ser un cambio a un valor más apropiado. El truco es probar el valor frente al bajo actual. Si es más bajo, entonces marque el nuevo valor bajo.

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

Manejo de múltiples celdas que contienen el mínimo requiere un segundo pase:

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 en la fila sigue siendo la misma. Esta vez solo estamos revisando si los valores de la celda coinciden con el mínimo elegido. Si coincide, el color de la fuente cambia al azul. De lo contrario, el color de la fuente se cambia a negro.


Eso lo resume. Es un poco difícil acostumbrarse a la forma en que Google Apps Scripting trata sobre 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 solía escribir/probar este código. Siéntete libre de probarlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top