我有一个谷歌应用程序脚本,它在附加的电子表格中部署可变数量的工作表,目的是从API收集数据,这工作得很好。
但是,我想在图表中可视化这些数据,因为它本身就是自我毁灭的,并且由于这些数据表的数量可变,我想创建一些代表的图表数据的各个部分,以及这些图表中的每个数据表都有一个范围(系列或y轴),因此它可以根据初始化或设置而变化。
长话短说,为了减少混乱,我只想知道如何创建图表并为每个图表添加范围。例如,我可以迭代一个列表,但问题是我得到的错误如下: " TypeError:无法在对象EmbeddedChartBuilder中找到函数修改。 (第97行,文件"代码") 驳回"
另外,请注意我尝试从其他工作表中提取数据,因此我使用了sheetName!范围表示法。
这是我正在处理的特定功能,请注意我使用占位符值只是为了让现在有用。
// 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);
}
答案 0 :(得分:0)
我已经弄清楚问题是什么,主要是通过实验,我仍然认为文档缺乏清晰度和良好的例子。 但这是我的理解。
首先,有三个类可以解决这个问题,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);
}
}