セルデータに基づいてGoogleスプレッドシートのセルに色を付ける


7

内容に基づいてセルに色を付けたいのですが。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)セルに入力しA1A1黄色で50の数字を入力したいとします。次に、=LinInt(100)セルに入力するA2と、緑色で100の数字が表示されます。

回答:


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

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色は 3つのエントリを有します。

  1. セル:これは、1つのアクティブセルでのみ機能します(範囲を選択した場合でも)。
  2. 範囲:これは範囲を取得するためのものです(単一のセルでは機能しますが、効率は低下します)。
  3. 書式をクリア:シート全体のすべてのスタイルをクリアします(色をより簡単に操作するため)

LinIntそしてLinRange自分自身のために話します。LinRange効率的に設定した背景色にバッチ操作を使用しています。

HSVtoHEX関数は、16進値に変換されるRGB方式にHSV値に変換されます。

備考

もともとあなたはあなたのコードに騙されました。それは言った:HSVtoRGBしかし実際にはそれを16進数のカラーコードに変換しようとしていました。ので、それは、良いことだsetBackgroundRGBが似バッチ操作を許可しませんsetBackgroundsありません。

ただし、コードは正しい16進コードを返しません。
ここに画像の説明を入力してください

16進数を入力します。colorizer.orgの値とHSVコードを取得します。

関数にonEditトリガーを追加するLinInt()と、すべてのエントリ(整数)が背景色を変更します。

サンプルファイルを作成しました:HSV to HEX

参考文献

  1. HSV&HSL、wikiページ
  2. colorizer.orgは、RGB、HEX、HSL、HSV / HSB、CMYKなどのさまざまなカラーコードスキームの概要をリアルタイムで提供します。
  3. HSVtoRGB、HSVをRGBに変換するコード
  4. RGBtoHEX、RGBをHEXに変換するコード行

こんにちは、Jan、Janです。:)それはあなたがまとめた本当に役立つスクリプトです。私はそれがおそらく小さな変更であることを知っていますが、0から100の固定値ではなく、選択した範囲から最大値と最小値を自動的に取得する方法を理解できません。
2013年

0

内容に基づいてセルに色を付けたいのですが。0 =赤、100 =緑、線形補間。

範囲を選択し、[フォーマット]> [条件付きフォーマット]> [カラースケール]をクリックし、[中点]を[数値]に設定50Doneます。

WA48783の例

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.