在EmbeddedChart中切换行和列

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

我正在使用 Google 文档和 Google Apps 脚本为我们的冲刺制作一些自动生成的报告。

我想在我的工作表中添加一个图表,使用以下代码一切正常:

    var lChartBuilder = SpreadsheetApp.getActiveSheet().newChart();
    lChartBuilder.addRange(SpreadsheetApp.getActive().getRange("Tasks!C39:S40"));
    lChartBuilder.setOption("title", "Task Burndown");

    var lChart = lChartBuilder.asLineChart().build();
    SpreadsheetApp.getActiveSheet().insertChart(lChart);

但是我的系列是水平组织的,而不是垂直组织的。在编辑器中,我看到了选项“切换行/列”和另一个选项“使用 C 列作为标签” 我尝试了很多选项(例如

lChartBuilder.setOption("reverseCategories", true);
lChartBuilder.setOption("isStacked", true);
),但我担心它们似乎都与最后一个选项卡相关,而不是“开始”选项卡。

那么,有没有办法(除了转置我的数据)来做到这一点,或者我必须在每次生成图表时手动启动图表编辑器来解决这个问题?

额外问题:然后如何设置(也通过 Google Apps 脚本)第一行/列是标题并用作图例?

google-apps-script google-visualization google-sheets
3个回答
6
投票

对于奖励问题,我有你的奖励答案。 创建/修改图表时使用此选项:

setOption('useFirstColumnAsDomain','true')

5
投票

对于嵌入式图表,您需要转置数据,因为嵌入式图表使用电子表格数据,并且本身不支持转置。但是,您可以通过编程方式处理此问题,并且转置操作本身很简单。

在下面的代码中,我假设存在一个名为“Scratch”的工作表,它将用于存储转置数据的工作副本。您可以创建然后隐藏此工作表,这样就不会妨碍您了。

// Uses 2D Arrays Library, see https://sites.google.com/site/scriptsexamples/custom-methods/2d-arrays-library

function buildChart() {
  var taskSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Tasks");
  var lChartBuilder = taskSheet.newChart(); taskSheet.removeChart(chart)
  var srcData = taskSheet.getRange("Tasks!C39:S40").getValues();

  // Transpose the table (using 2D Array Library)
  var scratchData = ArrayLib.transpose(srcData);

  var numRows = scratchData.length;
  var numCols = scratchData[0].length; // assume all rows are same width

  // Write scratch values to scratch sheet.
  var scratchSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Scratch");
  scratchSheet.getRange(1, 1, numRows, numCols).setValues( scratchData );
  SpreadsheetApp.flush();

  lChartBuilder.addRange(scratchSheet.getDataRange());
  lChartBuilder.setOption("title", "Task Burndown");

  var lChart = lChartBuilder.asLineChart().setPosition(1, 1, 1, 1).build();
  taskSheet.insertChart(lChart);
};

额外的好处... 以这种方式格式化数据可确保第一行/列是标题并用作图例。

Resulting Chart

现在,您还有一些问题需要解决。

  • 此代码每次运行时都会创建一个新图表,但您可能想修改它。 (相反,您需要更新转置数据,并修改图表以获取新范围(如果发生更改)。)
  • X 轴不显示所有任务名称 - 您也许可以控制它。

您说您不想转置数据。不幸的是,对于当前的图表版本来说,没有任何办法可以解决这个问题 - 您必须自己处理数据。插入具有不同图表库的小部件可能可行,但对表格的小部件支持已被弃用。幸运的是,我已经有了类似的代码,所以工作量比看起来要少。您应该看看 ArrayLib 中的一些其他过滤功能,您可以用它做很多事情。


0
投票

对于“切换行/列”,请使用

.setTransposeRowsAndColumns(true)
。对于“使用 C 列作为标签”,请使用
.setNumHeaders(1)
。 这是一个完整的例子:

const chart = sheet
  .newChart()
  .asColumnChart()
  .setStacked()
  .addRange(range)
  .setNumHeaders(1)
  .setTransposeRowsAndColumns(true)
  .setPosition(sheet.getLastRow() + 2, 1, 0, 0)
  .build();
© www.soinside.com 2019 - 2024. All rights reserved.