使用应用程序脚本创建图表。范围已添加到之前的图表中

问题描述 投票:0回答:1

我有几组数据,我想从中生成图表以插入到报告中。 数据结构在一张纸上,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 表示法中的字符串。 我的第一个版本通过了范围对象,但这也不起作用。

对此行为有何解释以及如何解决它? 谢谢你

javascript google-apps-script charts google-visualization
1个回答
0
投票

您的代码创建一个新图表并向其中添加指定范围。但是,所描述的将范围添加到所有先前创建的图表中的行为是不寻常的,并且似乎不是您的代码的问题。您的脚本中的其他位置或 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);
}

通过这种方法,每个图表都会在新的临时工作表上生成,然后复制回所需的工作表,从而最大限度地减少先前生成的图表干扰的可能性。

© www.soinside.com 2019 - 2024. All rights reserved.