我有几组数据,我想从中生成图表以插入到报告中。 数据结构在一张纸上,A 列中具有唯一 ID,B 列中具有最小值、最大值、avr、中位数作为标题,每个“标题”的相应行中具有相应的值。 我成功收集数据的代码,为该范围创建一个新图表,并将其插入具有唯一标题的工作表中。
然而... 每次创建新图表并将新范围添加到该图表时,相同的范围也会添加到所有先前创建的图表中。所以最后,如果我有 20 组数据,我最终会得到 20 个图表,其中首先生成的图表具有所有 20 组数据的范围,而最后一个图表只有一组数据。
我已经询问了 chatGPT 和 google Bard,但他们无法在这个问题上提供帮助...... 这是我生成图表的代码。
function newChart(range, sheet, metadata, minvalue) {
var maintitle = metadata.title;
var yaxis = metadata.yaxis;
var xaxis = metadata.xaxis;
var dimensions = [700, 300];
var range = sheet.getRange(range);
var anchor = range.getRow();
var options = {
width: dimensions[0],
height: dimensions[1],
title: maintitle,
titleTextStyle: { color: '#D52B1E', fontName: 'Anton', fontSize: 24, bold: true },
backgroundColor: '#37424A',
fontName: 'Helvetica Neue',
vAxis: { title: yaxis, minValue: minvalue },
hAxis: { title: xaxis }
}
// Create a new chart object for each chart
var chart = sheet.newChart()
.setChartType(Charts.ChartType.LINE)
.setPosition(anchor, 6, 0, 0)
.setOption('width', options.width)
.setOption('height', options.height)
.setOption('title', options.title)
.setOption('titleTextStyle', options.titleTextStyle)
.setOption('backgroundColor', options.backgroundColor)
.setOption('fontName', options.fontName)
.setOption('vAxis', options.vAxis)
.setOption('hAxis', options.hAxis)
.setTransposeRowsAndColumns(true);
// Add the range to the current chart
chart = chart.addRange(range);
// Insert the chart into the sheet
sheet.insertChart(chart.build());
}
在此版本中,作为“范围”传递给函数的元素只是 A1 表示法中的字符串。 我的第一个版本通过了范围对象,但这也不起作用。
对此行为有何解释以及如何解决它? 谢谢你
您的代码创建一个新图表并向其中添加指定范围。但是,所描述的将范围添加到所有先前创建的图表中的行为是不寻常的,并且似乎不是您的代码的问题。您的脚本中的其他位置或 Apps 脚本环境本身可能存在问题。
更好的方法
要解决此问题,请考虑创建一个全新的工作表,在该新工作表上生成图表,然后将图表复制回原始工作表。这将确保每个图表在创建过程中都是隔离的。
function newChart(range, sheet, metadata, minvalue) {
var maintitle = metadata.title;
var yaxis = metadata.yaxis;
var xaxis = metadata.xaxis;
var dimensions = [700, 300];
var range = sheet.getRange(range);
var anchor = range.getRow();
var tempSheetName = "TempSheetForChart" + Date.now(); // unique sheet name
var tempSheet = sheet.getSpreadsheet().insertSheet(tempSheetName);
var options = {
width: dimensions[0],
height: dimensions[1],
title: maintitle,
titleTextStyle: { color: '#D52B1E', fontName: 'Anton', fontSize: 24, bold: true },
backgroundColor: '#37424A',
fontName: 'Helvetica Neue',
vAxis: { title: yaxis, minValue: minvalue },
hAxis: { title: xaxis }
};
var chart = tempSheet.newChart()
.setChartType(Charts.ChartType.LINE)
.setPosition(1, 6, 0, 0) // adjusted to top-left of the temp sheet
.setOption('width', options.width)
.setOption('height', options.height)
.setOption('title', options.title)
.setOption('titleTextStyle', options.titleTextStyle)
.setOption('backgroundColor', options.backgroundColor)
.setOption('fontName', options.fontName)
.setOption('vAxis', options.vAxis)
.setOption('hAxis', options.hAxis)
.setTransposeRowsAndColumns(true)
.addRange(range)
.build();
tempSheet.insertChart(chart);
var charts = tempSheet.getCharts();
for (var i = 0; i < charts.length; i++) {
sheet.insertChart(charts[i]);
}
// Remove the temporary sheet after copying the chart
sheet.getSpreadsheet().deleteSheet(tempSheet);
}
通过这种方法,每个图表都会在新的临时工作表上生成,然后复制回所需的工作表,从而最大限度地减少先前生成的图表干扰的可能性。