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.
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;
}
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:
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();
}
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:
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.
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:
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.
J'ai créé un exemple de fichier pour vous: HSV to HEX