Скрипт приложения Google для создания нескольких диаграмм и таблиц из одной и той же электронной таблицы, но с разным диапазоном из разных столбцов - PullRequest
0 голосов
/ 17 декабря 2018

В настоящее время я сталкиваюсь с трудностями при создании нескольких диаграмм и таблиц из одной и той же электронной таблицы, другого диапазона и другого столбца с помощью скрипта приложения Google.

Вот изображение моего источника данных

ДАННЫЕ

Мне удалось создать несколько таблиц и диаграмм с источником данных из одной и той же таблицы другого диапазонано из той же колонки.Таблицы выделены красным и синим цветом.Но у меня есть 3-я таблица из другого столбца в той же таблице, которая не публикуется на основе моего кода.

вот мой код

code.gs

function doGet(e) {
  
  return HtmlService
  .createTemplateFromFile("Line Chart multiple Table")
  .evaluate()
  .setTitle("Google Spreadsheet Chart")
  .setSandboxMode(HtmlService.SandboxMode.IFRAME);
  
}

function getSpreadsheetData() {
  
  var ssID  = "1qkDFf4sYMgPZhGAoEf7vrXbBPmno6Tt4UT_zd5M8xLo";
  var sheet = SpreadsheetApp.openById(ssID).getSheets()[0];
  var firstrow = 6; //11th row
  var range = sheet.getRange(firstrow, 1, sheet.getLastRow() - firstrow + 1, 6);
  var data1 = range.getValues();
  var data2 = sheet.getRange('A1:F5').getValues();
  var data3 = sheet.getRange('H10:M16').getValues();
  
  rows   = {data1: data1, data2: data2, data3: data3};

  return rows;
   
}

Линейная диаграмма, несколько таблиц. HTML

<!DOCTYPE html>
<html>

<head>
  <script src="https://www.gstatic.com/charts/loader.js"></script>
</head>

<body>

  <div id="lineoverall"></div>
  <div id="linechartweekly"></div>
  <div id="table1"></div>
  <div id="table2"></div>
  <div id="table3"></div>
  

  <script>
    google.charts.load('current', {'packages':['table']});
    
    google.charts.load('current', {packages: ['corechart', 'line']});
     
    google.charts.setOnLoadCallback(getSpreadsheetData);

    function getSpreadsheetData() {
    google.script.run.withSuccessHandler(drawChart).getSpreadsheetData();
    
    }

    function drawChart(rows) {
    
         
      var data1 = google.visualization.arrayToDataTable(rows.data1, false);
      
      var data2 = google.visualization.arrayToDataTable(rows.data2, false);
      
      var data3 = google.visualization.arrayToDataTable(rows.data3, false);
      
    
      
      var options = {
        title: 'SPC Chart',
        legend: 'none',
        chartArea: {
          width: '60%'
        },
        vAxis: {
          textStyle: {
            fontFamily: 'Arial',
            fontSize: 12
          }
        }
      };

      var table2 = new google.visualization.Table(document.getElementById("table2"));
      table2.draw(data2, {showRowNumber: false, width: '50%', height: '100%'});
      
      var chart1 = new google.visualization.LineChart(document.getElementById("lineoverall"));
      chart1.draw(data1, options);
      
      var table1 = new google.visualization.Table(document.getElementById("table1"));
      table1.draw(data1, {showRowNumber: false, width: '50%', height: '100%'});
      
      var table3 = new google.visualization.Table(document.getElementById("table3"));
      table3.draw(data3, {showRowNumber: false, width: '50%', height: '100%'});
      
      var chart2 = new google.visualization.LineChart(document.getElementById("linechartweekly"));
      chart2.draw(data3, options);
    
  
    }
  </script>
</body>

</html>

Я новичок в этом сценарии.Любая помощь очень ценится.

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Код правильный.Проблема была с источником данных.Первоначально источник данных для даты 3 - диапазон H10: M16 не имел идентификатора столбца.После добавления идентификатора столбца, как выделено на изображении, все заработало.

Data Source

0 голосов
/ 17 декабря 2018

Я не уверен, поможет ли это вам, но вы можете пожать все, что сможете от него.Я играл с Google Finance и собрал некоторые данные, взяв 5-минутные образцы ячеек Google Finance из 15 акций.График всех акций был довольно бессмысленным, поэтому я создал график для каждой из них, просто переключая столбцы.Я также был заинтересован в получении изображений диаграммы, но мне пришлось подождать, пока последняя диаграмма не будет отрисована, поэтому у меня есть слушатель, который получает обратный вызов с последней диаграммы.

Вот HTML:

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <title>Data Dialog</title>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"/>
    <link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons1.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
    <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
    <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
    <script>
    var rCB=false;
    var chartA=[];
    var gdObj={};
     $(function(){
       google.script.run
       .withSuccessHandler(updateSelect)
       .getDataSheetsArray();

     });
    function updateSelect(vA){
      var id='sel1';
      var select = document.getElementById(id);
      select.options.length = 1; 
      for(var i=0;i<vA.length;i++)
      {
       select.options[i+1] = new Option(vA[i],vA[i]);
      }
    } 
    function drawCharts(){
       do{
      //nothing
      }while(!rCB);
      var page=$('#sel1').val();
      google.script.run
      .withSuccessHandler(function(dObj){
        gdObj=dObj;
        chartA=[];
        $('#charts').html('');
        for(var i=0;i<dObj.dataSetKeyA.length;i++){
          var data = new google.visualization.DataTable();
          data.addColumn('string',dObj.dataSetHeaderA[i][0]);
          data.addColumn('number',dObj.dataSetHeaderA[i][1]);
          data.addRows(dObj[dObj.dataSetKeyA[i]]);
          var divId='div-' + i;
          $("#charts").append('<div id="' + divId + '" style="border:1px solid black;margin:0 0 2px 0;"></div>');
          var options={
          title:dObj[dObj.dataSetHeaderA[i][1]],
          fontSize: 14,
          fontName: 'Roman',
          width:600,
          height:300,
          pointSize:4,
          stroke:'#000',
          strokeWidth:2, 
          hAxis:{slantedText:true,slantedTextAngle:70,textStyle:{color:'#333300',fontName:'Verdana',fontSize:8,bold:true}},
          legend:{position:'top'},
          chartArea:{left:75,top:75,width:'80%',height:'40%'},
          vAxes:[{title:'Stock Price',titleTextStyle:{color:'#0000CC',fontName:'Verdana',fontSize:12,bold:true,italic:false},textStyle:{color:'#CC0000',fontName:'Verdana',fontSize:10,bold:true,italic:false}}]
          };
          var chart=new google.visualization.LineChart(document.getElementById(divId));
          if(i==dObj.dataSetKeyA.length-1){
            google.visualization.events.addListener(chart, 'ready', getImages);
          }
          chartA.push([chart,divId]);
          chart.draw(data,options); 
        }
      })
      .getDataSets(page);
    }
    function getImages(){
      var chtImgObj={};
      chtImgObj['keyA']=[];
      for(var j=0;j<chartA.length;j++){
        chtImgObj.keyA.push(gdObj.dataSetHeaderA[j][1]);
        chtImgObj[gdObj.dataSetHeaderA[j][1]]=chartA[j][0].getImageURI();
        //document.getElementById(chartA[j][1]).innerHTML='<img src="' +  chartA[j][0].getImageURI()  + '" />';
        console.log('\nTicker Symbol: %s\n URI: %s\n',gdObj.dataSetHeaderA[j][1],chartA[j][0].getImageURI());
      }
      /*
      google.script.run
      .withSuccessHandler(function(){alert("Document has charts.");})
      .addToDoc(chtImgObj);
      */
    }
     google.charts.load('current', {'packages':['corechart']});
     google.charts.setOnLoadCallback(function(){rCB=true;});
     console.log('MyCode');
    </script>
  </head>
  <body>
    <div id="wrapper">
      <div id="controls">
        <select id="sel1" onchange="drawCharts();">
          <option value="" selected>Select Sheet By Name</option>
        </select>
      </div>
      <div id="charts"></div>
    </div>
  </body>
</html>

И это единственный GS:

function getDataSets(shtName){
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName(shtName);
  var rg=sh.getDataRange();
  var vA=rg.getValues();
  var dObj={};
  var dataSetKeyA=[];
  var dataSetHeaderA=[];
  for(var c=1;c<vA[0].length;c++){
    var vB=[];
    dataSetHeaderA.push([vA[0][0],vA[0][c]]);
    for(var i=1;i<vA.length;i++){
      vB.push([vA[i][0].slice(11),vA[i][c]]);
    }
    var dataSetKey='TimeStampAndColumn' + Number(c+1);
    dObj[dataSetKey]=vB;
    dataSetKeyA.push(dataSetKey);
  }
  dObj['dataSetKeyA']=dataSetKeyA;
  dObj['dataSetHeaderA']=dataSetHeaderA;
  sh=ss.getSheetByName('StockPrices');
  rg=sh.getRange(1,2,2,sh.getLastColumn()-1);
  var vC=rg.getValues();
  for(var i=0;i<vC[0].length;i++){
    dObj[vC[0][i]]=vC[1][i];
  }
  return dObj;
}

Вот как выглядит набор данных:

enter image description here

...