Die Art und Weise, wie es funktionieren soll, ist nicht möglich. Das Ändern einer Hintergrundfarbe erfordert einen API-Aufruf und diese sind in benutzerdefinierten Formeln nicht zulässig . Deshalb habe ich folgenden Code kompiliert / erstellt:
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();
}
Erklärt
Die onOpen
Funktion erstellt in der aktiven Tabelle einen zusätzlichen Menüpunkt namens HSV-Farben mit drei Einträgen:
- Zelle: Dies funktioniert nur für eine aktive Zelle (auch wenn Sie einen Bereich ausgewählt haben).
- Reichweite: Dies ist für die Übernahme von Entfernungen gedacht (wenn dies für einzelne Zellen funktioniert, aber weniger effizient ist)
- Formatierung löschen: Löscht alle Stile auf dem gesamten Blatt (um leichter mit den Farben zu spielen).
Die LinInt
und die LinRange
sprechen für sich. Der LinRange
verwendet eine Stapeloperation, um die Hintergrundfarben effizient einzustellen.
Die HSVtoHEX
Funktion konvertiert die HSV-Werte in ein RGB-Schema, das in einen Hexadezimalwert konvertiert wird.
Bemerkungen
Ursprünglich haben Sie mich durch Ihren Code täuschen lassen. Es hieß: HSVtoRGB
Aber tatsächlich haben Sie versucht, es in einen hexadezimalen Farbcode umzuwandeln. Das ist gut so, denn der setBackgroundRGB erlaubt keine Batch-Operationen wie der setBackgrounds .
Ihr Code gibt jedoch keinen korrekten Hexadezimalcode zurück:
Geben Sie das Hex ein. Wert in colorizer.org und Sie erhalten den HSV-Code.
Fügen Sie onEdit
der LinInt()
Funktion einen Trigger hinzu, und jeder Eintrag (Ganzzahl) ändert die Hintergrundfarbe.
Beispiel
Ich habe eine Beispieldatei für Sie erstellt: HSV to HEX
Verweise
- HSV & HSL , Wiki-Seite
- colorizer.org bietet einen Echtzeitüberblick über die verschiedenen Farbcode-Schemata wie RGB, HEX, HSL, HSV / HSB und CMYK.
- HSVtoRGB , Code zum Konvertieren von HSV in RGB
- RGBtoHEX , Codezeile zum Konvertieren von RGB in HEX