提高GAS中的图表更新性能

时间:2019-07-19 10:35:02

标签: performance google-apps-script charts google-sheets

我有一个更新工作表中每个图表的函数,主要问题是updateChart()函数的运行速度非常慢(大约50秒):enter image description here

我已经制作了一个可以并行化功能的脚本,但是由于每个脚本限制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);
  }
}

1 个答案:

答案 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)