如何使用Google脚本聚合列值以构建饼图?

时间:2016-03-21 21:52:37

标签: aggregate

我有来自Google表格的数据,如下例所示:

  1. 标题
  2. 在Google表格中,有两个复选框,名为“使用第1行作为标题”和“聚合列”,我通常用它来创建饼图。现在,我想通过Google Scripts进行相同的编程。

    有人可以帮帮我吗?

  3. 由于 多利亚

3 个答案:

答案 0 :(得分:0)

我概述了示例代码,它可以智能地聚合饼图的数组项目计数。

我个人不喜欢和讨厌这种并发症,因为Google似乎限制并定义了EmbeddedPieChartBuilder图表数据输入作为矩阵变量,这些变量只能来自Sheet" Range"因此,用户没有其他选择,只能强制将图表绘图值范围分配给最少两列矩阵。 Chart的默认标准DataTable商品也不能用作图输入。

如果图表要发布为网络,只需使用Charts.newPieChart()语法

function newChart() {

   var sheet= SpreadsheetApp.getActive().getSheetByName('sourcedata');

   var range = sheet.getRange("A1:A6");

   var rows=range.getNumRows();


   var cols=range.getNumColumns();


   var varr=[]; // To Store  number of items in your range
   var cnt_varr={}; // TO store and  aggregate total item count 
   var chk_item="";
   array_cnt=-1; 
// build up the datatable;  

 // row start is at 2  since row 1 is Title


 for (var vrow=2;vrow<rows+1;vrow++){
    var vitem=range.getCell(vrow, cols).getValue();


   if (vitem!=chk_item){

    cnt=cnt_varr[vitem];
   if (cnt==null){
     // only add new item to array
   varr.push(vitem);

   } 



    chk_item=vitem;
   }


   var cnt=0;
   cnt=cnt_varr[vitem];
   if (cnt==null){
       cnt=0;
   }

   var val_cnt=parseInt(cnt);

   val_cnt=val_cnt+1;
 // intelligently aggregate the array item count 
   cnt_varr[vitem]=val_cnt;



   }


// write the output result to new sheet  


 var new_sheet= SpreadsheetApp.getActive().getSheetByName('output');

if (new_sheet==null){
 SpreadsheetApp.getActiveSpreadsheet().insertSheet().setName("output");
}

new_sheet= SpreadsheetApp.getActive().getSheetByName('output');
var row_ToAdd=varr.length;

for (var i=0;i<row_ToAdd;i++){
new_sheet.getRange(i+1,1).setValue(varr[i]);
new_sheet.getRange(i+1,2).setValue(cnt_varr[varr[i]]);


}
 // PieChartBuilder    


  var chartBuilder = new_sheet.newChart().asPieChart()
  .addRange(new_sheet.getRange(1, 1, row_ToAdd, 2))
      .setChartType(Charts.ChartType.PIE)
      .setPosition(5, 5, 0, 0)
      .build();

       //Show the pieChart

    if (new_sheet.getCharts().length>0){

       new_sheet.getCharts().pop();

   } else{ 


   new_sheet.insertChart(chartBuilder);
    }

}

答案 1 :(得分:0)

我修改了示例,以便可以使用新值刷新

动态更新现有图表
 if (new_sheet.getCharts().length>0){
       var xcht=new_sheet.getCharts()[0];
       xcht=xcht.modify()
        .addRange(new_sheet.getRange(1, 1, row_ToAdd, 2))
        .setChartType(Charts.ChartType.PIE)
         .setPosition(5, 5, 0, 0)
        .build()
      new_sheet.updateChart(xcht);


      // new_sheet.getCharts().pop();


   } else{ 


     new_sheet.insertChart(chartBuilder);
    }

答案 2 :(得分:0)