web-dev-qa-db-fra.com

Coloration automatique d'une valeur spécifique où qu'elle se trouve dans un tableau

Je recherche un moyen de modifier automatiquement la couleur de la cellule minimale consécutive dans Google Sheets. Donc, pour une table comme:

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

il colorerait toutes les cellules avec 1 en eux.

37
Verhogen

Dans le menu déroulant, Format-> Formatage conditionnel ...

Ensuite, définissez vos règles et votre couleur. Vous pouvez sélectionner plusieurs cellules et le faire également.

Éditer:

C'est l'étendue de ce que vous pouvez faire avec la coloration. Vous pouvez peut-être trouver une formule complexe pour trouver le minimum de cellules, puis si cela correspond à ce qui se trouve dans la cellule, coloriez-la, mais vous voudrez peut-être utiliser Excel au lieu de Google docs si cela est essentiel pour vous.

57
Kekoa

L'astuce consiste à puiser dans le déclencheur d'événement onEdit et à ajouter de l'intelligence

À première vue, je pensais que le formatage conditionnel fonctionnerait, mais le minimum par ligne est un peu trop complexe pour le formatage conditionnel standard. C'est un peu difficile à comprendre, mais cela peut être fait.

Voici le script complet (testé et fonctionnel):

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

Commencez par utiliser le gestionnaire d'événements onEdit pour déclencher le script avec les modifications de la feuille de calcul.

function onEdit()

En nommant une fonction onEdit, il saura automatiquement que vous souhaitez remplacer l'action onEdit.

Remarque: Les gestionnaires d'événements dans Docs sont cependant un peu délicats. Étant donné que les documents peuvent gérer plusieurs modifications simultanées par plusieurs utilisateurs, les gestionnaires d'événements sont gérés côté serveur. Le problème majeur avec cette structure est que lorsqu'un script de déclenchement d'événement échoue, il échoue sur le serveur. Si vous voulez voir les informations de débogage, vous devrez configurer un déclencheur explicite dans le menu des déclencheurs qui vous enverra les informations de débogage par e-mail lorsque l'événement échoue, sinon il échouera en silence.

Récupérez le numéro de ligne:

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

Assez explicite ici. La plage active est la cellule en cours de modification.

Saisissez le nombre de colonnes:

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

Pour cela, vous devez vérifier la plage de données de l'ensemble de la feuille de calcul.

Ensuite, vous devez construire une plage de données contenant les données de la ligne en question:

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

Lisez les commentaires dans le code pour voir quelles devraient être les valeurs.

Ensuite, nous mettons en cache les résultats pour le test des valeurs:

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

En raison de la nature des rappels d'événements de script de Google Docs exécutés côté serveur, afin de prévenir les abus, Google impose une limite de temps à l'exécution des scripts. En mettant les valeurs en cache, vous évitez au serveur d'effectuer de nombreux allers-retours inutiles pour récupérer les valeurs dans la feuille de calcul.

Les deux prochaines parties sont où toute la magie se produit.

Tout d'abord, nous effectuons un passage dans toutes les cellules de la ligne pour trouver la valeur minimale.

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

J'ai fixé un plafond par défaut de 999 pour des raisons de simplicité. Cela pourrait être changé en une valeur plus appropriée . L'astuce consiste à tester la valeur par rapport au creux actuel. S'il est inférieur, marquez la nouvelle valeur basse.

Vous pourriez descendre facilement en marquant le numéro de cellule avec la valeur la plus basse et en le définissant explicitement, mais je voulais couvrir les cas où plusieurs cellules ont la valeur la plus basse.

La gestion de plusieurs cellules contenant le minimum nécessite une deuxième passe:

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

La boucle à travers toutes les cellules de la ligne reste la même. Cette fois, nous vérifions simplement si les valeurs des cellules correspondent au minimum choisi. S'il correspond, la couleur de la police passe au bleu. Sinon, la couleur de la police passe au noir.


Ça résume à peu près. Il est un peu difficile de s'habituer à la manière dont Google Apps Scripting traite du référencement des feuilles de calcul et des cellules de données, mais Docs ne peut pas faire grand-chose.

J'ai créé un lien public vers la feuille de calcul que j'ai utilisée pour écrire/tester ce code. N'hésitez pas à l'essayer.

26
Evan Plaice