Google Sheets : 基于数据范围单元格背景颜色的散点图中的颜色点

Google Sheets : Color dots in scatter plot based on data range cell background color

我有一个 Google 表格文件,用于存储不同区域(后、前、左、右)中不同汽车的油漆厚度值。然后将所有内容汇总在一个散点图中,该散点图显示按车辆年龄(X 轴)的油漆厚度(Y 轴)。

每个区域都是它自己的系列,给出的是那辆或每辆汽车,它创建一条垂直的点线,与汽车的年龄值对齐(序列号只是一个标签)。每个点都显示相应区域的油漆厚度及其在 Y 轴上的位置。

我正在根据每个区域报告的损坏情况更改单元格背景颜色。我想在我的散点图中每个对应的点上都有相同的颜色,而不是一个一个地着色。

(我不能包含任何内容 link/screenshot 因为这是机密数据)

示例:

序列号 年龄 区域 1 ZONE2 ZONE3 ZONE4
42 15 178 210 246 143

序列号 42 已使用 15 个月。它的左侧油漆厚度为 246,并且有损坏报告。我将包含 246 的单元格涂成红色,这会改变散点图中相应点的颜色。

脚本必须将散点图中的每个点与其对应的单元格相关联,获取单元格的背景颜色并根据它设置点的颜色。

我无法为整个系列涂色,因为每种颜色都需要特定于一辆车的一个区域

这个文件曾经是一个Excel文件,我找到了一个可以做到这一点的VBA宏,但是我的公司正在切换到Gsuite,我对它还不够熟悉翻译宏。

这是 VBA 代码:

Sub CellColorsToChart()
'Update by Extendoffice
    Dim xChart As Chart
    Dim I As Long, J As Long
    Dim xRowsOrCols As Long, xSCount As Long
    Dim xRg As Range, xCell As Range
    On Error Resume Next
    Set xChart = ActiveSheet.ChartObjects("Chart 1").Chart
    If xChart Is Nothing Then Exit Sub
    xSCount = xChart.SeriesCollection.Count
    For I = 1 To xSCount
        J = 1
        With xChart.SeriesCollection(I)
            Set xRg = ActiveSheet.Range(Split(Split(.Formula, ",")(2), "!")(1))
            If xSCount > 4 Then
                xRowsOrCols = xRg.Columns.Count
            Else
                xRowsOrCols = xRg.Rows.Count
            End If
            For Each xCell In xRg
                .Points(J).Format.Fill.ForeColor.RGB = ThisWorkbook.Colors(xCell.Interior.ColorIndex)
                .Points(J).Format.Line.ForeColor.RGB = ThisWorkbook.Colors(xCell.Interior.ColorIndex)
                J = J + 1
            Next
        End With
    Next
End Sub

相当笨拙,但无论如何,这是我的尝试:

function myFunction() {
  var sheet = SpreadsheetApp.getActiveSheet();

  var colors = sheet.getRange('C2:F2').getBackgrounds().flat();
  
  var chart = sheet.getCharts()[0];
  chart = chart.modify()
    .setOption('series.0.items.0.color', colors[0])
    .setOption('series.0.items.1.color', colors[1])
    .setOption('series.0.items.2.color', colors[2])
    .setOption('series.0.items.3.color', colors[3])
    .build();
  sheet.updateChart(chart);
}

更新

我仍然不确定我是否理解正确。可能是这样的?

function myFunction() {

  var sheet = SpreadsheetApp.getActiveSheet();
  var chart = sheet.getCharts()[0];
  var colors = [];
  
  colors = sheet.getRange('C2:C5').getBackgrounds().flat();
  chart = recolor(chart, colors, 0);

  colors = sheet.getRange('D2:D5').getBackgrounds().flat();
  chart = recolor(chart, colors, 1);

  colors = sheet.getRange('E2:E5').getBackgrounds().flat();
  chart = recolor(chart, colors, 2);
    
  colors = sheet.getRange('F2:F5').getBackgrounds().flat();
  chart = recolor(chart, colors, 3);
    
  sheet.updateChart(chart);
  
  function recolor(chart, colors, series) {
    return chart.modify()
      .setOption('series.' + series + '.items.0.color', colors[0])
      .setOption('series.' + series + '.items.1.color', colors[1])
      .setOption('series.' + series + '.items.2.color', colors[2])
      .setOption('series.' + series + '.items.3.color', colors[3])
      .build();
  }

}

更新 2

代码的更新版本。现在它可以为任意数量的汽车(行)着色:

function myFunction() {

  var sheet  = SpreadsheetApp.getActiveSheet();
  var last   = sheet.getLastRow();
  var chart  = sheet.getCharts()[0];
  var colors = [];

  // recolor zone 1
  colors = sheet.getRange('C2:C' + last).getBackgrounds().flat();
  chart = recolor(chart, colors, 0);

  // recolor zone 2
  colors = sheet.getRange('D2:D' + last).getBackgrounds().flat();
  chart = recolor(chart, colors, 1);

  // recolor zone 3
  colors = sheet.getRange('E2:E' + last).getBackgrounds().flat();
  chart = recolor(chart, colors, 2);
    
  // recolor zone 4
  colors = sheet.getRange('F2:F' + last).getBackgrounds().flat();
  chart = recolor(chart, colors, 3);

  // update the chart    
  sheet.updateChart(chart);
  
  function recolor(chart, colors, series) {
    colors.forEach((color,i) => {
      chart = chart.modify()
        .setOption('series.' + series + '.items.' + i + '.color', color)
        .build();
    });
    return chart;
  }
}

可能它可以扩展到能够占用任意数量的区域。


这是可以处理任意数量区域的最终版本:

function myFunction() {

  var sheet = SpreadsheetApp.getActiveSheet();
  var chart = sheet.getCharts()[0];
  var last_cell = chart.getRanges()[1].getA1Notation().split(':')[1]; // the bottom right cell of the chart
  var data  = sheet.getRange('C2:' + last_cell).getBackgrounds();

  for (var i in data) chart = recolor(chart, data.map(x => x[i]), i);
  
  sheet.updateChart(chart);
  
  function recolor(chart, colors, series) {
    colors.forEach((color,i) => {
      chart = chart.modify()
        .setOption('series.' + series + '.items.' + i + '.color', color)
        .build();
    });
    return chart;
  }

}