如何使用Google表格的Google App脚本进行简单的多线程处理

时间:2019-07-12 11:50:40

标签: multithreading google-apps-script google-sheets parallel-processing

我有很多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分钟才能更新。

1 个答案:

答案 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的执行时间。