Tô màu một ô trong Google Sheets dựa trên dữ liệu di động


7

Tôi muốn tô màu một ô dựa trên nội dung của nó. 0= đỏ, 100= xanh lục và nội suy tuyến tính giữa.

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

Khi tôi làm điều này, tôi nhận được một lỗi nói rằng tôi không được phép gọi setBackground. Tôi cho rằng điều này là do tôi không được phép thay đổi màu của một ô từ một ô khác vì tôi đang vặn lấy ô hiện tại mà hàm đang chạy.

Làm thế nào để tôi có được ô mà hàm đang chạy để tôi có thể gọi setBackground()nó?

Ví dụ: tôi muốn nhập =LinInt(50)vào ô A1và có A1màu vàng và có số 50 trong đó. Sau đó, khi tôi gõ =LinInt(100)vào ô, A2nó có màu xanh và có số 100 trong đó.

Câu trả lời:


3

Tôi vừa mới thực hiện điều này, và đây là một chức năng linh hoạt hơn. Ví dụ trước không thể xử lý chính xác phạm vi của các ô đã chọn, cái này có thể (nhưng bạn cũng có thể thêm một số kiểm tra lỗi tốt hơn cho phạm vi trống!) Có thể dễ dàng được tùy chỉnh để có các phạm vi độ sáng, màu sắc, tự động tính toán giá trị tối đa khác , Vân vân.:

/**
 * 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

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:

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 onOpenchứ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:

  1. Ô: đ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).
  2. 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)
  3. 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 LinIntLinRangenói cho mình. Việc LinRangesử dụng một hoạt động hàng loạt để thiết lập hiệu quả màu nền.

Các HSVtoHEXchứ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: HSVtoRGBnhư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 mô tả hình ảnh ở đây

Nhập vào hex. giá trị trong colorizer.org và bạn sẽ nhận được mã HSV.

Thêm một onEditkí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

  1. HSV & HSL , trang wiki
  2. 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.
  3. HSVtoRGB , mã để chuyển đổi HSV sang RGB
  4. RGBtoHEX , dòng mã để chuyển đổi RGB sang HEX

Xin chào Jan, đó cũng là Jan ở đây. :) Đó là một kịch bản thực sự hữu ích mà bạn đã đặt cùng nhau. Tôi biết đó có thể là một thay đổi nhỏ, nhưng tôi không thể tìm ra, làm thế nào để tự động lấy giá trị tối đa và tối thiểu từ phạm vi đã chọn, thay vì các giá trị 0 - 100 cố định.
Gạch chân

0

Tôi muốn tô màu một ô dựa trên nội dung của nó. 0 = đỏ, 100 = xanh lục và nội suy tuyến tính giữa.

Chọn phạm vi, Định dạng> Định dạng có điều kiện> Thang màu, đặt Điểm giữa thành Số 50Done:

Ví dụ WA48783

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.