【问题标题】:How to create a chart with multiple ranges in google apps script for google spreadsheets如何在谷歌电子表格的谷歌应用脚​​本中创建具有多个范围的图表
【发布时间】:2018-04-26 19:49:58
【问题描述】:

我有一个谷歌应用程序脚本,它在它所附加的电子表格中部署了可变数量的工作表,目的是从 API 收集数据,它工作得很好。

但是,我想以图表的形式将这些数据可视化,而且由于它的本意是自我贬低,而且由于这些数据表的数量不定,我想创建一些图表来代表数据的各个部分数据,并且在这些图表中,每个数据表都有一个范围(系列或 y 轴),因此它是可变的,具体取决于初始化或设置。

长话短说,为了减少混淆,我只想知道如何创建图表并为每个图表添加范围。例如,我可以遍历一个列表,但问题是我遇到了以下错误: “TypeError:在对象 EmbeddedChartBuilder 中找不到函数修改。(第 97 行,文件“代码”) 解雇”

另外,请注意我正在尝试从其他工作表中提取数据,因此我使用的是 sheetName!range 表示法。

这是我正在处理的特定功能,请注意我使用占位符值只是为了让某些东西现在可以工作。

// TODO
function createCharts(){
  var sheet = getSheet('Graphs');
  var winrateChart = sheet.newChart().setChartType(Charts.ChartType.LINE).setPosition(2, 1, 0, 0);
  // for every user, add appropriate range to chart 
  winrateChart = winrateChart.modify().addRange('username1!A1:B2');
  winrateChart = winrateChart.modify().addRange('username2!A1:B2');
  sheet.updateChart(winrateChart);
  winrateChart = winrateChart.build()
  sheet.insertChart(winrateChart);
}

【问题讨论】:

  • 不要使用多行,为什么不做winrateChart = winrateChart.modify().addRange('username1!A1:B2').addRange('username2!A1:B2').build();,然后用它更新工作表?
  • 这行不通,因为我需要设置一个循环来遍历工作表名称,这样我就可以从每张工作表中提取数据。就像我说的那样,纸张的数量是可变的。在伪代码中会是这样的。对于 sheetList 中的每个工作表,将工作表的数据添加到图表
  • 您向我们展示的代码的哪一行是line 97
  • winrateChart = winrateChart.modify().addRange('username1!A1:B2');找到了问题(部分还是没有找到完整的解决方案,因为整天都在写代码,所以休息一下),EmbeddedChart 类包含方法 modify,但是 EmbeddedChartBuilder 类没有,我开始弄清楚这里的机制是什么,EmbeddedChartBuilder 看起来是用来修改图表和做其他事情的,而方法 build 似乎使它进入了另一个类,这是用于显示图表本身的对象。
  • EmbeddedChart 的 modify() 返回可用于修改此图表的 EmbeddedChartBuilder。调用 sheet.updateChart(chart) 以保存任何更改。 EmbeddedChartBuilder 的 build() 返回 EmbeddedChart — 创建的图表,仍必须将其添加到电子表格中 我认为文档有点混乱,但我开始弄清楚了。

标签: javascript google-apps-script google-sheets


【解决方案1】:

我已经弄清楚了问题所在,主要是通过实验,我仍然认为文档缺乏清晰性和良好的示例。 但这是我的理解。

首先,针对这个问题需要处理三个类,Sheet、EmbeddedChart 和 EmbeddedChartBuilder。

EmbeddedChartBuilder 是 Sheet.newChart() 返回的内容,通过使用 .build() 方法可以获得一个 EmbeddedChart 类,该类可以用作 Sheet.insertChart() 的参数。 此外,通过实验,您似乎必须先通过 Sheet.insertChart(EmbeddedChart) 插入一个图表,然后才能使用 EmbeddedChart.modify(),后者又返回一个 EmbeddedChartBuilder,您可以使用它来链接任意数量的方法,例如添加范围。当然,您仍然必须使用 .build() 从 EmbeddedChartBuilder 返回 EmbeddedChart,然后再使用 Sheet.updateChart(EmbeddedChart)。

最后一个问题是我犯了一个错误,我使用字符串作为参数调用 .addRange(),但是 addRange 需要 Range 对象。

无论如何,这里有一些代码演示了一个示例用法,您可以根据需要链接任意数量的 modify(),例如在遍历工作表的循环中。

注意:getSheet 是一个自定义函数,可以满足您的期望。

function createCharts(){
  var sheet = getSheet('Graphs');
  var chart = sheet.newChart().setChartType(Charts.ChartType.LINE).setPosition(2,1,0,0).build(); // build returns an EmbeddedChart object 
  Logger.log(chart);
  sheet.insertChart(chart);
  chart = chart.modify().addRange(getSheet('someSheetName').getRange('B1:B999')).build();
  Logger.log(chart);
  sheet.updateChart(chart);
}

编辑:这是整个工作函数,在这个特定代码之外没有用,但是,你可以看到它背后的逻辑,我将尝试通过迭代工作表或其他东西使其普遍有用。

function createChart(range, x, y, title, width, height){
  // range: string; x: int; y: int; title: string; width: int; height; int
  // Creates a chart with data from all usernames for a given range at x row, y column, with a title, a width and height
  var sheet = getSheet('Graphs');
  // chart setup
  var chart = sheet.newChart()
  .setChartType(Charts.ChartType.LINE)
  .setPosition(x,y,0,0)
  .setNumHeaders(1)
  .setOption('title', title)
  .setOption('width', width)
  .setOption('height', height)
  .build();
  sheet.insertChart(chart);
  // for every username, add corresponding data into chart
  for(var i = 0; i < fortniteUsernames.length; i++){
    var username = fortniteUsernames[i];
    chart = chart.modify().addRange(getSheet(username).getRange(range)).build();
    sheet.updateChart(chart);    
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 2018-06-03
    • 2017-04-28
    • 2013-11-13
    相关资源
    最近更新 更多