【问题标题】:Google Visualization will only draw 1 of 2 chartsGoogle Visualization 只会绘制 2 个图表中的 1 个
【发布时间】:2014-01-09 14:06:46
【问题描述】:

我创建了一组谷歌仪表,可以从谷歌表格中提取数据。该表有两页,第一页保存最初加载到仪表中的值,第二页包含提供每个仪表更改值的数据。底部的按钮允许仪表在两个值之间来回切换。

我只能使用 chartWrapper 类和 .setDataSourceUrl 方法从谷歌表格中为仪表设置动画。

我想在仪表下方添加一个数据表,但无法同时绘制两个 chartWrapper。我可以画一个或另一个,但不是我已经看过并发现其他有类似问题的人,并尝试了描述的修复,但无济于事。我有唯一的 ID。每个图表我都有一个 div。我调用一个函数,然后调用 OnLoad 分别绘制每个图表的各个函数。我不确定还有什么可以尝试的,在这一点上感觉很像猜测工作。任何帮助将不胜感激。非常感谢您的关注!

我还不关心按钮,我只想让两个图表都在初始加载时绘制。
这是html:

<html>
  <head>
    <title>
      Animated Gauge fed by Sheet
    </title>
    <!-- One script tag loads all the required libraries! Do not specify any chart types in the autoload statement. -->
    <script type="text/javascript"
        src='https://www.google.com/jsapi?autoload={"modules":[{"name":"visualization","version":"1"}]}'>
    </script>
    <script type="text/javascript">
        google.setOnLoadCallback(drawVisualization);
      //google.setOnLoadCallback(drawVisualization); 
      //google.setOnLoadCallback(drawTable);

      //global variable manipulatedby the following 3 functions.
      var wrap = new google.visualization.ChartWrapper();
      var myTable = new google.visualization.ChartWrapper();      

      function drawGauge() {
        // Define the chart using setters:
        //var wrap = new google.visualization.ChartWrapper();
        wrap.setChartType('Gauge');
        wrap.setDataSourceUrl('https://docs.google.com/a/csd99.org/spreadsheet/ccc?key=0AkmXRMp1VYawdFVEUmJlM3AzOUM3R0NMVlBzOTN5dlE&usp=drive_web\n\&gid=0');
        wrap.setContainerId('gauge_div');
        wrap.setOptions({
                    'min': 0,
                    'max': 35,
                    //greenFrom:0,
                    //greenTo:10,
                    'yellowFrom': 15,
                    'yellowTo': 20,
                    'redFrom': 20,
                    'redTo': 30,
                    'greenColor': 999900,
                    'yellowColor': '#FFFF99',
                    'redColor': 660066,
                    'minorTicks': 10,
                    'animation':{
                       'duration': 800,
                       'easing': 'out'
                    }
                    //width of container determines whether gauges show up on same row or multiple rows
                    //'width':700
                  });
        //alert('hello');
        var elem = document.getElementById('gauge_div');
        elem.style.opacity = 0.6;
        wrap.draw();
      }  

      function drawTable(){
        myTable.setChartType('Table');        
        myTable.setContainerId('table_div');
        myTable.setDataSourceUrl('https://docs.google.com/a/csd99.org/spreadsheet/ccc?key=0AkmXRMp1VYawdFVEUmJlM3AzOUM3R0NMVlBzOTN5dlE&usp=drive_web\n\#gid=0&headers=1');
        myTable.setOptions({'width':200});
        //alert('hello');
        myTable.draw();
    }

      function changeValues()  {
        // Define the chart using setters:
        //var wrap = new google.visualization.ChartWrapper();
        wrap.setChartType('Gauge');
        wrap.setDataSourceUrl('https://docs.google.com/a/csd99.org/spreadsheet/ccc?key=0AkmXRMp1VYawdFVEUmJlM3AzOUM3R0NMVlBzOTN5dlE&usp=drive_web\n\\n\&gid=2');
        wrap.setContainerId('gauge_div');
        wrap.setOptions({
                    'min': 0,
                    'max': 35,
                    //greenFrom:0,
                    //greenTo:10,
                    'yellowFrom': 15,
                    'yellowTo': 20,
                    'redFrom': 20,
                    'redTo': 30,
                    'greenColor': 999900,
                    'yellowColor': '#FFFF99',
                    'redColor': 660066,
                    'minorTicks': 10,
                    'animation':{
                       'duration': 800,
                       'easing': 'out'
                    }

                    //width of container determines whether gauges show up on same row or multiple rows
                    //'width':700
                  });
        //alert('hello');
        var elem = document.getElementById('gauge_div');
        elem.style.opacity = 1.0;
        wrap.draw();  
      }

      function changeValuesBack()  {
        // Define the chart using setters:
        //var wrap = new google.visualization.ChartWrapper();
        wrap.setChartType('Gauge');
        wrap.setDataSourceUrl('https://docs.google.com/a/csd99.org/spreadsheet/ccc?key=0AkmXRMp1VYawdFVEUmJlM3AzOUM3R0NMVlBzOTN5dlE&usp=drive_web\n\\n\&gid=0');
        wrap.setContainerId('gauge_div');
        wrap.setOptions({
                    'min': 0,
                    'max': 35,
                    //greenFrom:0,
                    //greenTo:10,
                    'yellowFrom': 15,
                    'yellowTo': 20,
                    'redFrom': 20,
                    'redTo': 30,
                    'greenColor': 999900,
                    'yellowColor': '#FFFF99',
                    'redColor': 660066,
                    'minorTicks': 10,
                    'animation':{
                       'duration': 800,
                       'easing': 'out'
                    }

                    //width of container determines whether gauges show up on same row or multiple rows
                    //'width':700
                  });
        //alert('hello');
        var elem = document.getElementById('gauge_div');
        elem.style.opacity = 0.6;
        wrap.draw();  
      }

      function drawVisualization(){
          drawGauge();
          drawTable();
      }

    </script>
  </head>
  <body>
    <h3>Data for gauges located in this sheet on worksheets 1 and 2</h3>
    <h3><a href = 'https://docs.google.com/spreadsheet/ccc?key=0AkmXRMp1VYawdFVEUmJlM3AzOUM3R0NMVlBzOTN5dlE&usp=sharing'> here.</a></h3>
    <div id='gauge_div' style='height: 150px; width: 500px;'></div>
    <div id='table_div'></div>
    <input type="button" style="opacity:0.6" value="Last Month" onclick="changeValuesBack()"/>
    <input type="button" value="This Month" onclick="changeValues()"/>    
  </body>
 </html>

【问题讨论】:

    标签: google-visualization


    【解决方案1】:

    调用drawTable() 导致错误消息:Uncaught ReferenceError: Sw is not defined

    似乎table 包没有使用自动加载加载。我添加了以下行来加载包:

        ...
    <script type="text/javascript">
        google.load('visualization', '1.0', {'packages':['gauge', 'table']});
    
        google.setOnLoadCallback(drawVisualization);
        ...
    

    得到以下结果:

    【讨论】:

      【解决方案2】:

      您的仪表和表格 ChartWrappers 是与页面加载同步创建的,而不是作为对来自 google 加载程序的回调的响应,因此如果代码在加载 API 之前运行,您可能会遇到一些问题。您还有很多不必要的代码重复和重新查询数据源。获得数据副本后,您应该将其缓存,这样您就不必再次查询数据源,但如果您使用 ChartWrappers 的 dataSourceUrl 属性,则无法执行此操作。这是一个基于您的代码的示例,它缓存每个数据请求,因此您不必进行多次冗余查询:

      [javascript]

      function drawCharts () {
          var query1 = new google.visualization.Query('https://docs.google.com/a/csd99.org/spreadsheet/ccc?key=0AkmXRMp1VYawdFVEUmJlM3AzOUM3R0NMVlBzOTN5dlE&usp=drive_web\n\#gid=0&headers=1');
          query1.send(function (response) {
              if (response.isError()) {
                  alert('Error in query: ' + response.getMessage() + ' ' + response.getDetailedMessage());
                  return;
              }
      
              var data1 = response.getDataTable(), data2 = null;
              var chart = new google.visualization.ChartWrapper({
                  chartType: 'Gauge',
                  containerId: 'gauge_div',
                  dataTable: data1,
                  options: {
                      min: 0,
                      max: 35,
                      yellowFrom: 15,
                      yellowTo: 20,
                      redFrom: 20,
                      redTo: 30,
                      greenColor: 999900,
                      yellowColor: '#FFFF99',
                      redColor: 660066,
                      minorTicks: 10,
                      animation: {
                          duration: 800,
                          easing: 'out'
                      }
                  }
              });
              var table = new google.visualization.ChartWrapper({
                  chartType: 'Table',
                  containerId: 'table_div',
                  dataTable: data1,
                  options: {
                      width: 200
                  }
              });
      
              chart.draw();
              table.draw();
      
              var lastMonth = document.querySelector('#lastMonth');
              var thisMonth = document.querySelector('#thisMonth');
      
              function drawLastMonth () {
                  chart.setDataTable(data1);
                  table.setDataTable(data1);
                  chart.draw();
                  table.draw();
                  lastMonth.disabled = 'disabled';
                  thisMonth.disabled = null;
              }
              function drawThisMonth () {
                  if (data2 != null) {
                      chart.setDataTable(data2);
                      table.setDataTable(data2);
                      chart.draw();
                      table.draw();
                      lastMonth.disabled = null;
                      thisMonth.disabled = 'disabled';
                  }
                  else {
                      var query2 = new google.visualization.Query('https://docs.google.com/a/csd99.org/spreadsheet/ccc?key=0AkmXRMp1VYawdFVEUmJlM3AzOUM3R0NMVlBzOTN5dlE&usp=drive_web\n\\n\&gid=2&headers=1');
                      query2.send(function (response) {
                          if (response.isError()) {
                              alert('Error in query: ' + response.getMessage() + ' ' + response.getDetailedMessage());
                              return;
                          }
                          data2 = response.getDataTable();
                          drawThisMonth();
                      });
                  }
              }
      
              if (document.addEventListener) {
                  lastMonth.addEventListener('click', drawLastMonth);
                  thisMonth.addEventListener('click', drawThisMonth);
              }
              else if (document.attachEvent) {
                  lastMonth.attachEvent('onclick', drawLastMonth);
                  thisMonth.attachEvent('onclick', drawThisMonth);
              }
              else {
                  lastMonth.onclick = drawLastMonth;
                  thisMonth.onclick = drawThisMonth;
              }
          });
      }
      google.load('visualization', '1', {packages:['controls'], callback: drawCharts});
      

      [HTML]

      <h3>Data for gauges located in this sheet on worksheets 1 and 2</h3>
      <h3><a href = 'https://docs.google.com/spreadsheet/ccc?key=0AkmXRMp1VYawdFVEUmJlM3AzOUM3R0NMVlBzOTN5dlE&usp=sharing'> here.</a></h3>
      <div id='gauge_div' style='height: 150px; width: 500px;'></div>
      <div id='table_div'></div>
      <input id="lastMonth" type="button" disabled="disabled" value="Last Month" />
      <input id="thisMonth" type="button" value="This Month" />
      

      在此处查看工作示例:http://jsfiddle.net/asgallant/n2xK9/

      【讨论】:

      • 谢谢你,这很有帮助。它解决了您可以看到我一直在努力解决的其他一些问题。你能帮我理解document.querySelector('#lastMonth')lastMonth.disabled = null 行在做什么吗?
      • document.querySelector('#lastMonth') 使用id 'lastMonth' 获取输入(querySelector 方法是一种通用的、更强大的方法,通过使用 CSS 选择器而不是方法 @987654332 从 HTML 获取元素@、getElementsByTagName 等)。 lastMonth.disabled = null 重新启用'lastMonth' 按钮,使其再次可点击。
      • 当我尝试将这一切放在一起时,我得到不一致的加载。通常 gauge_div 是空的,但偶尔它加载得很好。我的脚本似乎对查询源 URL 中是否有 #gid 或 &gid 以及 &headers=1 非常敏感。有时页面会很好地加载。我改了,不行然后在恢复到原始状态后,它不再加载。有任何想法吗?我想展示我的完整代码,但不知道在哪里做。感谢您的耐心和关注。似乎与我是否打开了提供仪表的谷歌表有某种联系。
      • 您需要使用&amp;gid 而不是#gid。这是一个 jsfiddle,您可以使用当前代码进行更新:jsfiddle.net/asgallant/94gE9
      • 好吧……现在更困惑了。代码在 jsfiddle 中运行良好,但是当我将其作为本地 .html 文件运行时,我无法加载仪表。我想我正在为脚本标签、google.load 函数和我的 google 工作表上的权限而苦苦挣扎(尽管工作表是公开的)。我应该提出一个新问题并在其中包含我的完整 html 吗?再次感谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-26
      • 2017-12-17
      • 1970-01-01
      相关资源
      最近更新 更多