Раскрасить ячейку в Google Таблицах на основе данных ячейки

Я хочу раскрасить ячейку на основе ее содержимого. 0 = красный, 100 = зеленый, и линейно интерполируется между ними.

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

Когда я это делаю, я получаю сообщение о том, что мне не позволено называть setBackground. Я предполагаю, что это связано с тем, что мне не разрешено изменять цвет одной ячейки из другой, потому что я нажимаю на получение текущей ячейки, в которой работает функция.

Как мне получить ячейку, в которой работает эта функция, чтобы я мог называть ее setBackground()?

Например, я хотел бы ввести =LinInt(50) в ячейку A1 и A1 быть желтым и иметь номер 50 в нем. Затем, когда я набираю =LinInt(100) в ячейку A2 он зеленый и имеет в нем число 100.

7 голосов | спросил John Moffitt 30 AM000000110000003331 2013, 11:35:33

3 ответа


3

Я только что пошел на это, и вот более гибкая функция. Предыдущий пример не мог правильно обрабатывать диапазоны выбранных ячеек, это может (но вы также можете добавить некоторую лучшую проверку ошибок для пустых диапазонов!). Можно легко настроить другие диапазоны яркости, оттенков, автовычисления максимального значения и т. д.:

/**
 * 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;
}
ответил pixelpusher 30 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 30 Sep 2014 16:00:32 +0400 2014, 16:00:32
3

Способ, которым вы хотите работать, невозможен. Изменение цвета фона включает вызов API, и это запрещено в пользовательских формулах . , Поэтому я скомпилировал /создал следующий код:

код

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

Разъяснения

Функция onOpen создаст дополнительный элемент меню в активной электронной таблице под названием Цвета HSV с тремя записи:

  1. Ячейка: это будет работать только в активной ячейке одна (даже если вы выбрали диапазон).
  2. Диапазон: это предназначено для принятия диапазонов (если будет работать на отдельных ячейках, но менее эффективно)
  3. Очистить форматирование: стирает весь стиль на всем листе (легче играть с цветами)

LinInt и LinRange говорят сами за себя. LinRange использует пакетную операцию для эффективного набора цветов фона.

Функция HSVtoHEX преобразует значения HSV в схему RGB, которая преобразуется в шестнадцатеричное значение.

Примечания

Изначально ты меня обманул, своим кодом. Он сказал: HSVtoRGB, но на самом деле вы пытались преобразовать его в шестнадцатеричный код цвета. Это хорошо, потому что setBackgroundRGB не позволяет выполнять пакетные операции, такие как setBackgrounds делает.

Однако ваш код не возвращает правильный шестнадцатеричный код:
введите описание изображения здесь>> </p>

<p> Введите шестнадцатеричный. значение в <a href= colorizer.org , и вы получите код HSV.

Добавьте в код onEdit, и каждая запись (целое число) даст изменение цвета фона.

Пример

Я создал файл примера для вас: HSV to HEX

Ссылки

  1. HSV & HSL , страница wiki
  2. colorizer.org , дает обзор в реальном времени различных схем цветового кода, таких как RGB, HEX, HSL, HSV /HSB и CMYK.
  3. HSVtoRGB , код для преобразования HSV в RGB
  4. RGBtoHEX , строка кода для преобразования RGB в HEX
ответил Jacob Jan Tuinstra 1 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowSun, 01 Sep 2013 11:12:09 +0400 2013, 11:12:09
0
  

Я хочу раскрасить ячейку на основе ее содержимого. 0 = красный, 100 = зеленый и линейно интерполирован между ними.

Выберите диапазон, Формат> Условное форматирование> Цветовая шкала, установите «Средняя точка на номер» и 50 и Готово :

 Пример WA48783

ответил pnuts 16 SatEurope/Moscow2017-12-16T01:28:46+03:00Europe/Moscow12bEurope/MoscowSat, 16 Dec 2017 01:28:46 +0300 2017, 01:28:46

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132