我有一个更新工作表中每个图表的函数,主要问题是updateChart()函数的运行速度非常慢(大约50秒):
我已经制作了一个可以并行化功能的脚本,但是由于每个脚本限制20个触发器,所以我只能将线程运行两次。所以我想知道是否有什么可以加快图表更新的速度。
function ModifyVAxisChart()
{
var ss=SpreadsheetApp.getActiveSpreadsheet().getSheetByName("DCN Dashboard Data");
var rangeMax=ss.getRange("O3:O231").getValues();//Range to modify if you add charts
var rangeMinId=ss.getRange("P3:P232").getValues();//Range to modify if you add charts
var i=0;
var nbChart=39;
//Logger.log("range Max ="+rangeMax + "autre="+rangeMinId);
var Vmin=0;
var Vmax=0;
var id=-1;
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("DCN Dashboard");
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);
}
}
答案 0 :(得分:0)
由于App脚本功能不是异步的,因此它们将一直等到请求完成后才能继续运行代码(从而运行其余请求)。您可以做的是在JavaScript(需要提供服务和html)中使用Sheets API [1]或使用UrlFetchApp类[2]发出请求,这样您就可以启动请求而无需等待来自上一个请求的响应。
我用一个更新图表的请求实现了fetchAll()方法[2],并且成功完成了工作,这是代码(您需要放置sheetID):
@TableName1(?!\d)
我使用了“编辑图表”示例[1]中的更新图表json。
要添加更多请求,可以在fetchAll()数组参数中添加更多请求json,也可以在requestBody的'requests'数组中添加更多更新图表json。
[1] https://developers.google.com/sheets/api/samples/charts
[2] https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app#fetchAll(Object)