Google Web 应用程序上的可视化时间线图表

Google visualization timeline chart on web app

我想根据 google sheet 中的值制作一个时间线图表,但我卡住了.... 我不知道出了什么问题。代码好像没问题,但就是我。

我猜 html 端没有按应有的方式读取数组,或者根本没有读取数组。 在 spreadsheet 中,我只有图表所需的数据。 timeLineData

我想以与 sheet 中相同的顺序传递给图表数据。 Start 和 End 应该作为完整的日期和时间传递(我猜这种格式是 new 'Date(0,0,0,12,0,0)' )

在控制台中我遇到了这种错误:

Uncaught at myFunction (Kod:18)

还有这个

Uncaught (in promise) Error: Argument given to addRows must be either a number or an array at gvjs_G.gvjs_.Pp (jsapi_compiled_default_module.js:231) at drawChart (userCodeAppPanel:23)

还有这个

Error An error occurred in the script, but there is no error code: Error: Cannot return an invalid date. at unknown function

第二个错误可能是因为 draChart 函数没有从点差中获取数据sheet

code.gs

    function doGet(e) {
 
  Logger.log(e.parameter);
  return HtmlService.createHtmlOutputFromFile("index2");
     
}


function myFunction() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const srcSheet = ss.getSheetByName("timeLineData");
  const srcValues = srcSheet.getRange('A2:D'+srcSheet.getLastRow()).getValues();
  const newAr = srcValues.map(r=>[r[0],r[1],new Date(r[2]),new Date(r[3])]);
  Logger.log(newAr);
  return newAr;

}

和html方:

    <!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
    
    <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>

<script type="text/javascript">

  function cal2l(){
  
  google.script.run.withSuccessHandler(drawChart).myFunction();
  
  };
  
  google.charts.load("current", {packages:["timeline"]});
  google.charts.setOnLoadCallback(drawChart);
  
  function drawChart(newAr) {
    var container = document.getElementById('example3.1');
    var chart = new google.visualization.Timeline(container);
    var dataTable = new google.visualization.DataTable();
    dataTable.addColumn({ type: 'string', id: 'Machine' });
    dataTable.addColumn({ type: 'string', id: 'Product' });
    dataTable.addColumn({ type: 'date', id: 'Start' });
    dataTable.addColumn({ type: 'date', id: 'End' });
    dataTable.addRows(newAr);

    chart.draw(dataTable);
  }
</script>

<div id="example3.1" style="height: 200px;"></div>
    
    
  </body>
</html>

以防万一 google 时间线上的文档Google

你能告诉我哪里出了问题吗?

所以我找到了解决方案,感谢@Oleg Valter 建议我使用 JSON

可能有人觉得它有用:

code.gs

    function doGet() {
 

  return HtmlService.createTemplateFromFile('index').evaluate();
     
}


function timelineData(){
  const ss = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/1KzaKe9ShAZZAlK3CQC-UmrKzZXghNKAAx_pDHFX3YLI/edit#gid=0');
  const srcSheet = ss.getSheetByName("Array");
  const srcValues = srcSheet.getRange(2, 1, srcSheet.getLastRow()-1, 4).getDisplayValues()
  const newAr = srcValues.map(r=>[r[0],r[1], new Date(r[2]), new Date(r[3])]);
  
  const arr = JSON.stringify(newAr);
    
  return arr
}

这里有 HTML:

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
  
 <h1>機械別工程残</h1>
  <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>

<script type="text/javascript">
  google.charts.load("current", {packages:["timeline"]});
  google.charts.setOnLoadCallback(getData);
  
  function getData(){
  
  google.script.run.withSuccessHandler(drawChart).timelineData();
  
  }
  
  function drawChart(dane) {
  //console.log(dane);
  const obj = JSON.parse(dane);
   const newAr = obj.map(r=>[r[0],r[1], new Date(r[2]), new Date(r[3])]);
    var container = document.getElementById('chart');
    var chart = new google.visualization.Timeline(container);
    var dataTable = new google.visualization.DataTable();
    dataTable.addColumn({ type: 'string', id: '機械' });
    dataTable.addColumn({ type: 'string', id: 'オーダー' });
    dataTable.addColumn({ type: 'date', id: 'Start' });
    dataTable.addColumn({ type: 'date', id: 'End' });
    dataTable.addRows(newAr);
    
    var options = {
     colors: ['#cbb69d', '#603913', '#c69c6e', '#e743f0', '#f04343', '#f0e443', '#b9f043', '#4ff043', '#43f0d9', '#435df0'],
     
     // timeline: { colorByRowLabel: true}
  };
    chart.draw(dataTable, options);
  }
</script>

<div id="chart" style="height: 600px;"></div>
    
  </body>
</html>