多Sheet排序不同的显卡价格追踪图表创建及高亮功能需求
多Sheet显卡价格走势图表的匹配与交互解决方案
一、解决跨Sheet型号行位置不匹配问题
核心是先把分散在各Sheet的价格数据整理为型号为行、时间为列的结构化汇总表,彻底摆脱行位置依赖:
操作步骤(Excel/谷歌表格通用逻辑)
- 新建汇总Sheet,命名为「价格汇总」
- 提取所有GPU型号:
- Excel:用
UNIQUE(VSTACK(Sheet1!A:A, Sheet2!A:A, ..., SheetN!A:A)),手动过滤空行 - 谷歌表格:用
UNIQUE(FLATTEN(Sheet1!A:A, Sheet2!A:A, ..., SheetN!A:A)),自动过滤空行
将公式结果放在汇总表A列,得到所有出现过的显卡型号。
- Excel:用
- 设置时间节点列:在汇总表B1、C1...单元格依次填入各Sheet对应的时间(比如「2024-01-01」「2024-01-08」)
- 匹配各时间点价格:
在汇总表B2单元格输入查找公式,下拉填充所有型号、横向填充所有时间列:- Excel:
=XLOOKUP($A2, Sheet1!$A:$A, Sheet1!$E:$E, "") - 谷歌表格:
=XLOOKUP($A2, Sheet1!A:A, Sheet1!E:E, "")
该公式会自动在对应Sheet中匹配型号并返回价格,未上市/已下架的型号会返回空值,图表生成时会自动忽略空值,符合实际追踪逻辑。
- Excel:
完成后,直接基于「价格汇总」表插入折线图即可,完全解决行位置不匹配的问题。
二、实现悬停高亮线条、其余变暗的交互功能
Excel方案(VBA实现)
Excel无原生该功能,需用VBA代码:
- 右键点击目标图表,选择「查看代码」打开VBA编辑器
- 粘贴以下代码(注意图表名称需与实际一致,比如默认「Chart 1」):
Dim prevSeries As Object Sub Chart_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Double, ByVal Y As Double) Dim cht As Chart, srs As Series Dim elemID As Long, arg1 As Long, arg2 As Long Set cht = ActiveChart cht.GetChartElement X, Y, elemID, arg1, arg2 ' 重置之前的系列样式 If Not prevSeries Is Nothing Then prevSeries.Format.Line.Transparency = 0 prevSeries.Format.Line.Weight = 1 End If ' 高亮当前悬停系列 If elemID = xlSeries Then Set srs = cht.SeriesCollection(arg1) ' 其余线条变暗 For Each srs In cht.SeriesCollection srs.Format.Line.Transparency = 0.7 srs.Format.Line.Weight = 1 Next srs ' 当前线条加粗高亮 srs.Format.Line.Transparency = 0 srs.Format.Line.Weight = 2.5 Set prevSeries = srs Else ' 鼠标不在线条上,重置所有样式 For Each srs In cht.SeriesCollection srs.Format.Line.Transparency = 0 srs.Format.Line.Weight = 1 Next srs Set prevSeries = Nothing End If End Sub - 保存文件为
.xlsm格式(启用宏),打开时允许宏运行,鼠标悬停即可触发高亮效果。
谷歌表格方案(Apps Script实现)
谷歌表格需借助脚本创建带交互的侧边栏图表:
- 点击「扩展」→「Apps Script」打开脚本编辑器
- 清空默认代码,粘贴以下内容:
function onOpen() { SpreadsheetApp.getUi().createMenu('图表工具') .addItem('启用悬停高亮', 'enableHoverHighlight') .addToUi(); } function enableHoverHighlight() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('价格汇总'); const chart = sheet.getCharts()[0]; // 若有多个图表,调整索引值 const html = HtmlService.createHtmlOutput(` <script src="https://www.gstatic.com/charts/loader.js"></script> <script> google.charts.load('current', {'packages':['corechart']}); google.charts.setOnLoadCallback(drawChart); function drawChart() { google.script.run.withSuccessHandler(data => { const dataTable = new google.visualization.DataTable(data); const options = { title: '显卡价格走势', legend: { position: 'right' }, series: {} }; const chartDiv = document.getElementById('chart'); const lineChart = new google.visualization.LineChart(chartDiv); // 悬停高亮逻辑 google.visualization.events.addListener(lineChart, 'onmouseover', e => { // 重置所有系列样式 Object.keys(options.series).forEach(i => { options.series[i] = { lineWidth: 1, opacity: 0.5 }; }); // 高亮当前系列 options.series[e.row] = { lineWidth: 3, opacity: 1 }; lineChart.draw(dataTable, options); }); // 离开时重置 google.visualization.events.addListener(lineChart, 'onmouseout', () => { Object.keys(options.series).forEach(i => { options.series[i] = { lineWidth: 1, opacity: 1 }; }); lineChart.draw(dataTable, options); }); lineChart.draw(dataTable, options); }).getChartData(); } </script> <div id="chart" style="width: 100%; height: 600px;"></div> `); SpreadsheetApp.getUi().showSidebar(html); } function getChartData() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('价格汇总'); const range = sheet.getDataRange(); const values = range.getValues(); // 构建谷歌图表数据格式 const data = { cols: values[0].map(col => ({ label: col, type: col === 'GPU Model' ? 'string' : 'number' })), rows: values.slice(1).map(row => ({ c: row.map(cell => ({ v: cell })) })) }; return data; } - 保存脚本,回到表格点击「图表工具」→「启用悬停高亮」,侧边栏会显示带交互的图表,悬停时对应线条高亮,其余变暗。
内容的提问来源于stack exchange,提问作者Adam Ambrus
相关产品推荐
相关产品推荐

