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;
}
}
我有一个 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;
}
}