Cách mà bạn muốn nó hoạt động, là không thể. Thay đổi màu nền, liên quan đến lệnh gọi API và chúng không được phép trong các công thức tùy chỉnh . Do đó tôi đã biên dịch / tạo mã sau đây:
Mã
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();
}
Giải thích
Các onOpen
chức năng sẽ tạo ra một mục trình đơn phụ trong bảng tính tích cực, được gọi là màu HSV có ba mục:
- Ô: điều này sẽ chỉ hoạt động trên một ô đang hoạt động (ngay cả khi bạn đã chọn một phạm vi).
- Phạm vi: điều này có nghĩa là đảm nhận các phạm vi (nếu sẽ hoạt động trên các ô đơn lẻ, nhưng kém hiệu quả hơn)
- Xóa định dạng: xóa tất cả kiểu dáng trên toàn bộ trang tính (để chơi với màu sắc dễ dàng hơn)
Các LinInt
và LinRange
nói cho mình. Việc LinRange
sử dụng một hoạt động hàng loạt để thiết lập hiệu quả màu nền.
Các HSVtoHEX
chức năng sẽ chuyển đổi các giá trị HSV vào một chương trình RGB, đó là chuyển đổi sang một giá trị thập lục phân.
Nhận xét
Ban đầu bạn đã lừa tôi, bởi mã của bạn. Nó nói: HSVtoRGB
nhưng thực tế bạn đang cố gắng chuyển đổi nó thành mã màu thập lục phân. Đó là một điều tốt, bởi vì setBackgroundRGB không cho phép các hoạt động hàng loạt như setBackgrounds thực hiện.
Tuy nhiên, mã của bạn không trả về mã thập lục phân chính xác:
Nhập vào hex. giá trị trong colorizer.org và bạn sẽ nhận được mã HSV.
Thêm một onEdit
kích hoạt trên LinInt()
chức năng và mỗi mục (số nguyên) sẽ thay đổi màu nền.
Thí dụ
Tôi đã tạo một tệp ví dụ cho bạn: HSV đến HEX
Người giới thiệu
- HSV & HSL , trang wiki
- colorizer.org , cung cấp một cái nhìn tổng quan thời gian thực về các lược đồ mã màu khác nhau, như RGB, HEX, HSL, HSV / HSB và CMYK.
- HSVtoRGB , mã để chuyển đổi HSV sang RGB
- RGBtoHEX , dòng mã để chuyển đổi RGB sang HEX