我有很多Google图表要更新,我想并行处理for循环。
我在此链接上看到了代码:Threading in Google App Script 但这太复杂了,我必须做。我不需要并行化代码并获取数据。
for(i=0;i<nbChart;i++)
{
Vmax=rangeMax[i*6];
Vmin=rangeMinId[i*6];
id=rangeMinId[(i*6)+1];
var delta=(Vmax-Vmin)*0.1;
Logger.log("Vmax="+Vmax+"Vmin="+Vmin+"id="+id+"i="+i);
var chart = sheet.getCharts()[id];
if(chart.getType()!="COLUMN")
{
Vmin-=delta
Vmax=Number(Vmax)+(delta*1.5)//Number() function to avoid Vmax becoming a string for no reason
}
Logger.log("Vmax="+Vmax+"Vmin="+Vmin+"id="+id+"i="+i);
chart = chart.modify()
.setOption('vAxes', {0: {textStyle: {fontSize: 10}, titleTextStyle: {fontSize : 8}, viewWindow: {min: Vmin, max:Vmax}}})//adpative vaxis for AREA and COMBO
.build();
sheet.updateChart(chart);
}
我只需要快速更新图表,因为单张纸目前大约需要15分钟才能更新。
答案 0 :(得分:2)
当前,每次循环运行时您都在调用sheet.getCharts()
,这将大大增加执行时间。将函数调用置于循环之外,然后仅通过id引用图表即可减少循环中的函数调用次数:
var chart = sheet.getCharts();
for(i=0;i<nbChart;i++)
{
Vmax=rangeMax[i*6];
Vmin=rangeMinId[i*6];
id=rangeMinId[(i*6)+1];
var delta=(Vmax-Vmin)*0.1;
Logger.log("Vmax="+Vmax+"Vmin="+Vmin+"id="+id+"i="+i);
var currChart = chart[id];
if(currChart.getType()!="COLUMN")
{
Vmin-=delta
Vmax=Number(Vmax)+(delta*1.5)//Number() function to avoid Vmax becoming a string for no reason
}
Logger.log("Vmax="+Vmax+"Vmin="+Vmin+"id="+id+"i="+i);
currChart = currChart.modify()
.setOption('vAxes', {0: {textStyle: {fontSize: 10}, titleTextStyle: {fontSize : 8}, viewWindow: {min: Vmin, max:Vmax}}})//adpative vaxis for AREA and COMBO
.build();
sheet.updateChart(currChart);
}
作为另一种解决方案,如果更新图表的顺序并不重要,则可以编写具有相同循环结构但循环条件不同的第二个脚本。
如果您在两个不同的脚本中运行两个循环,一个运行for (i = 0; i < nbChart; i = i + 2)
,第二个运行for (i = 1; i < nbChart; i = i + 2)
,则可以设置两个可安装的触发器,以同时或以相同的动作运行它们还可以减少oveall的执行时间。