web-dev-qa-db-fra.com

Coloriser une cellule dans Google Sheets en fonction de ses données

J'aimerais coloriser une cellule en fonction de son contenu. 0 = rouge, 100 = vert et interpolé linéairement entre.

function LinInt(x){    
  var ss = SpreadsheetApp.getActiveSheet();
  var cell = ss.getActiveRange();
  var hue;
  hue = (x/100)*120;

  var color = HSVtoRGB(hue, 40, 100);
  cell.setBackground(color);

  return x;    
}   

function HSVtoRGB(h, s, v) {
    var r, g, b, i, f, p, q, t;
    if (h && s === undefined && v === undefined) {
        s = h.s, v = h.v, h = h.h;
    }
    i = Math.floor(h * 6);
    f = h * 6 - i;
    p = v * (1 - s);
    q = v * (1 - f * s);
    t = v * (1 - (1 - f) * s);
    switch (i % 6) {
        case 0: r = v, g = t, b = p; break;
        case 1: r = q, g = v, b = p; break;
        case 2: r = p, g = v, b = t; break;
        case 3: r = p, g = q, b = v; break;
        case 4: r = t, g = p, b = v; break;
        case 5: r = v, g = p, b = q; break;
    }
  return '#'+((b | g << 8 | r << 16) / 0x1000000).toString(16).substring(2);
}

Lorsque je le fais, je reçois une erreur disant que je ne suis pas autorisé à appeler setBackground. J'imagine que c'est parce que je ne suis pas autorisé à changer la couleur d'une cellule d'une autre, car je me trompe pour récupérer la cellule actuelle dans laquelle la fonction s'exécute.

Comment obtenir la cellule dans laquelle la fonction est en cours d'exécution pour pouvoir appeler setBackground() dessus?

Par exemple, j'aimerais taper =LinInt(50) dans la cellule A1 et faire en sorte que A1 soit jaune et comporte le nombre 50. Ensuite, lorsque je tape =LinInt(100) dans la cellule A2, il est vert et contient le nombre 100.

7
John Moffitt

Je viens de tenter ma chance et voici une fonction plus flexible. L'exemple précédent ne pouvait pas gérer correctement les plages de cellules sélectionnées, mais celui-ci le peut (mais vous pouvez aussi ajouter une meilleure vérification d'erreur pour les plages vides!) Peut facilement être personnalisé pour avoir d'autres plages de luminosité, de nuances, un calcul automatique de la valeur maximale , etc.:

/**
 * Adds a custom menu to the active spreadsheet, containing a single menu item
 * for invoking the readRows() function specified above.
 * The onOpen() function, when defined, is automatically invoked whenever the
 * spreadsheet is opened.
 * For more information on using the Spreadsheet API, see
 * https://developers.google.com/apps-script/service_spreadsheet
 */

function onOpen() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();

  var menu = [({name: "colorize", functionName: "colorize"})];
  spreadsheet.addMenu("HSV Colors", menu);
}

/*
 * Change saturation of cell background colors based on their values
 */

function colorize() {

  // Prompt the user for a max value number.
  var numberRange = Browser.inputBox('Colorize Range',
      'Please enter the maximum number of your range' +
      ' (for example, "2"):',
      Browser.Buttons.OK_CANCEL);
  if (numberRange == 'cancel') {
    return;
  }

  // Prompt the user for a hue number.
  var hue = Browser.inputBox('Colorize Range',
      'Please enter the hue (0-359)' +
      ' (for example, "128"):',
      Browser.Buttons.OK_CANCEL);
  if (hue == 'cancel') {
    return;
  }


  var range = SpreadsheetApp.getActiveRange();
  Logger.log('range:' + range);

  var values = range.getValues(); // [][]

  Logger.log('values:' + values);

  var backgrounds = [];

  for (var row = 0; row < range.getNumRows(); row++) 
  {
    var rowBackgrounds = [];
    for (var column = 0; column < range.getNumColumns(); column++) 
    {
      var val = Number(values[row][column]);
      if (isNaN(val)) 
      {
        val = 0;
      }
      var newColor = HSVtoHEX(hue,255*val/numberRange,200);
      rowBackgrounds.Push(newColor);
    }
    backgrounds.Push(rowBackgrounds);
  }
  range.setBackgrounds(backgrounds);
}


// http://stackoverflow.com/a/17243070/1536038
function HSVtoHEX(h, s, v) {

  Logger.log('h:'+h+' s:'+s + ' v:' + v);

    var r, g, b, i, f, p, q, t;

    // turn variables into degrees and percentages
    h=h/360, s=s/255, v=v/255;

    if (h && s === undefined && v === undefined) {
        s = h.s, v = h.v, h = h.h;
    }
    i = Math.floor(h * 6);
    f = h * 6 - i;
    p = v * (1 - s);
    q = v * (1 - f * s);
    t = v * (1 - (1 - f) * s);
    switch (i % 6) {
        case 0: r = v, g = t, b = p; break;
        case 1: r = q, g = v, b = p; break;
        case 2: r = p, g = v, b = t; break;
        case 3: r = p, g = q, b = v; break;
        case 4: r = t, g = p, b = v; break;
        case 5: r = v, g = p, b = q; break;
    }

    //http://stackoverflow.com/a/5624139/1536038
  var result = "#" + ((1 << 24) + (Math.floor(r * 255) << 16) + 
      (Math.floor(g * 255) << 8) + Math.floor(b * 255))
      .toString(16).slice(1);
  Logger.log(result);
    return result;
}
3
pixelpusher

La façon dont vous voulez que cela fonctionne, n'est pas possible. La modification d'une couleur d'arrière-plan implique un appel d'API et celles-ci ne sont pas autorisées dans formules personnalisées. C'est pourquoi j'ai compilé/créé le code suivant:

Code

function onOpen() {
  var menu = [({name: "Cell", functionName: "LinInt"}),
    ({name: "Range", functionName: "LinRange"}),
    ({name: "Clear Formatting", functionName: "clearFormat"})];
  ss.addMenu("HSV Colors", menu);
}

function LinInt() {
  var cell = SpreadsheetApp.getActiveSheet().getActiveCell();
  var value = cell.getValue(), color = HSVtoHEX(value,40,100);
  cell.setBackground(color);
}   

function LinRange() {    
  var ss = SpreadsheetApp.getActiveSheet();
  var range = ss.getActiveRange(), values = range.getValues();
  var colors = new Array();  
  for(i in values) {
    colors[i] = new Array();
    for(var j=0, jLen=values[0].length; j<jLen; j++) {
      colors[i][j] = HSVtoRGB_2(values[i][j],40,100);
    }       
  }
  range.setBackgrounds(colors);
}   

// https://stackoverflow.com/a/17243070/1536038
function HSVtoHEX(h, s, v) {
    var r, g, b, i, f, p, q, t;

    // turn variables into degrees and percentages
    h=h/360, s=s/100, v=v/100;

    if (h && s === undefined && v === undefined) {
        s = h.s, v = h.v, h = h.h;
    }
    i = Math.floor(h * 6);
    f = h * 6 - i;
    p = v * (1 - s);
    q = v * (1 - f * s);
    t = v * (1 - (1 - f) * s);
    switch (i % 6) {
        case 0: r = v, g = t, b = p; break;
        case 1: r = q, g = v, b = p; break;
        case 2: r = p, g = v, b = t; break;
        case 3: r = p, g = q, b = v; break;
        case 4: r = t, g = p, b = v; break;
        case 5: r = v, g = p, b = q; break;
    }

    //https://stackoverflow.com/a/5624139/1536038
    return "#" + ((1 << 24) + (Math.floor(r * 255) << 16) + 
      (Math.floor(g * 255) << 8) + Math.floor(b * 255))
      .toString(16).slice(1);
}

function clearFormat() {
  ss.getDataRange().clearFormat();
}

A expliqué

La fonction onOpen crée un élément de menu supplémentaire dans la feuille de calcul active, appelé Couleurs HSV comportant trois entrées:

  1. Cellule: cela ne fonctionnera que sur une cellule active (même si vous avez sélectionné une plage).
  2. Range: ceci est destiné aux gammes à prendre (si cela fonctionne sur des cellules individuelles, mais de manière moins efficace)
  3. Formatage clair: efface tout le style de la feuille entière (pour jouer avec les couleurs plus facilement)

Le LinInt et le LinRange parlent d'eux-mêmes. La LinRange utilise une opération par lots pour définir efficacement les couleurs d'arrière-plan.

La fonction HSVtoHEX convertira les valeurs HSV en un schéma RVB converti en une valeur hexadécimale.

Remarques

A l'origine, tu m'avais trompé, par ton code. Il disait: HSVtoRGB mais vous essayiez en fait de le convertir en code couleur hexadécimal. C’est une bonne chose, car le setBackgroundRGB ne permet pas les opérations par lots comme le setBackgrounds fait.

Votre code ne renvoie cependant pas un code hexadécimal correct:
enter image description here

Tapez dans l'hexagone. valeur dans colorizer.org et vous obtiendrez le code HSV.

Ajoutez un déclencheur onEdit sur la fonction LinInt() et chaque entrée (entier) donnera un changement de couleur d'arrière-plan.

Exemple

J'ai créé un exemple de fichier pour vous: HSV to HEX

Références

  1. HSV & HSL , page wiki
  2. colorizer.org , donne un aperçu en temps réel des différents schémas de codes de couleurs, tels que RVB, HEX, HSL, HSV/HSB et CMYK.
  3. HSVtoRGB , code pour convertir HSV en RGB
  4. RGBtoHEX , ligne de code pour convertir RGB en HEX
3
Jacob Jan Tuinstra

J'aimerais coloriser une cellule en fonction de son contenu. 0 = rouge, 100 = vert et interpolé linéairement entre.

Sélectionnez une plage, Format> Mise en forme conditionnelle> Échelle de couleurs, définissez le milieu à numérique et 50 et Done:

WA48783 example

0
pnuts