Встраивание линейной диаграммы в таблицу диаграмм Google внутри HTML-страницы

#html #google-apps-script #charts #google-visualization

#HTML #google-apps-script #Диаграммы #google-визуализация

Вопрос:

У меня есть таблица (взятая из Google charts) и линейная диаграмма (также взятая оттуда), и я хочу встроить ее в таблицу. Я знаю, что есть способ встроить html-страницу в таблицу, подняв флаг «разрешить html», но не удалось найти точный синтаксис для этого. Я хочу, чтобы это выглядело так (здесь используется sparkline): Это мой html для таблицы:

 <html>
  <head>
    <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
    <script type="text/javascript">
      google.charts.load('current', {'packages':['table']});
      google.charts.setOnLoadCallback(drawTable);

      function drawTable() {
        var data = new google.visualization.DataTable();
        data.addColumn('string', 'Name');
        data.addColumn('number', 'Salary');
        data.addColumn('boolean', 'Full Time Employee');
        data.addRows([
          ['Mike',  {v: 10000, f: '$10,000'}, true, **HTML LINE CHART1 HERE**],
          ['Jim',   {v:8000,   f: '$8,000'},  false, **HTML LINE CHART2 HERE**],
          ['Alice', {v: 12500, f: '$12,500'}, true,**HTML LINE CHART3 HERE**],
          ['Bob',   {v: 7000,  f: '$7,000'},  true,**HTML LINE CHART4 HERE**]
        ]);

        var table = new google.visualization.Table(document.getElementById('table_div'));

        table.draw(data, {showRowNumber: true, width: '100%', height: '100%'});
      }
    </script>
  </head>
  <body>
    <div id="table_div"></div>
  </body>
</html>
  

HTML для линейной диаграммы:

   <html>
  <head>
    <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
    <script type="text/javascript">
      google.charts.load('current', {'packages':['corechart']});
      google.charts.setOnLoadCallback(drawChart);

      function drawChart() {
        var data = google.visualization.arrayToDataTable([
          ['Year', 'Sales', 'Expenses'],
          ['2004',  1000,      400],
          ['2005',  1170,      460],
          ['2006',  660,       1120],
          ['2007',  1030,      540]
        ]);

        var options = {
          title: 'Company Performance',
          curveType: 'function',
          legend: { position: 'bottom' }
        };

        var chart = new google.visualization.LineChart(document.getElementById('curve_chart'));

        chart.draw(data, options);
      }
    </script>
  </head>
  <body>
    <div id="curve_chart" style="width: 900px; height: 500px"></div>
  </body>
</html>
  

И я хочу, чтобы второй html отображался, например, в строке логического столбца.
Спасибо!!!

Ответ №1:

рекомендуем сначала нарисовать таблицу.
затем в 'ready' событии таблицы
добавьте диаграмму в каждую ячейку таблицы.

смотрите следующий рабочий фрагмент…

как только срабатывает событие ready, мы получаем контейнер диаграммы таблицы.
затем найдите каждую строку и ячейку.
мы добавляем контейнер линейной диаграммы в последнюю ячейку и рисуем диаграмму.

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

 google.charts.load('current', {
  packages: ['corechart', 'table']
}).then(function () {
  var data = new google.visualization.DataTable();
  data.addColumn('string', 'Name');
  data.addColumn('number', 'Salary');
  data.addColumn('string', 'Chart');
  data.addRows([
    ['Mike', {v: 10000, f: '$10,000'}, null],
    ['Jim', {v: 8000, f: '$8,000'}, null],
    ['Alice', {v: 12500, f: '$12,500'}, null],
    ['Bob', {v: 7000, f: '$7,000'}, null]
  ]);

  var table = new google.visualization.Table(document.getElementById('table_div'));

  google.visualization.events.addListener(table, 'ready', function () {
    // table body
    Array.prototype.forEach.call(table.getContainer().getElementsByTagName('tbody'), function(tableBody) {
      // table rows
      Array.prototype.forEach.call(tableBody.rows, function(tableRow, rowIndex) {
        // table cells
        Array.prototype.forEach.call(tableRow.cells, function(tableCell, cellIndex) {
          // determine if last cell
          if (cellIndex === (tableRow.cells.length - 1)) {
            // add chart continer
            var chartContainer = tableCell.appendChild(document.createElement('div'));
            chartContainer.className = 'chart';

            // build chart data table
            var dataChart = new google.visualization.DataTable();
            dataChart.addColumn('number', 'x');
            dataChart.addColumn('number', 'y');
            for (var i = 0; i <= rowIndex; i  ) {
              dataChart.addRow([i, data.getValue(i, 1)]);
            }

            // draw chart
            var chart = new google.visualization.LineChart(chartContainer);
            chart.draw(dataChart, {
              chartArea: {
                left: 24,
                top: 16,
                right: 24,
                bottom: 16,
                height: '100%',
                width: '100%'
              },
              height: '100%',
              legend: 'none',
              pointSize: 6,
              width: '100%'
            });
          }
        });
      });
    });
  });

  table.draw(data, {showRowNumber: true, width: '100%', height: '100%'});
});  
 html, body {
  height: 100%;
  margin: 0px 0px 0px 0px;
  padding: 0px 0px 0px 0px;
}

.chart {
  min-height: 200px;
}  
 <script src="https://www.gstatic.com/charts/loader.js"></script>
<div id="table_div"></div>  

Комментарии:

1. Да, это именно то, что я искал, спасибо! Небольшая проблема, которую я вижу, заключается в том, что при нажатии на один из заголовков таблицы для сортировки диаграммы исчезают. Нужно ли мне каждый раз переходить к обратному вызову сортировки и строить линейную диаграмму?

2. Да, вы должны иметь возможность вызывать одну и ту же функцию как для ready, так и для sort…

Ответ №2:

То, чего вы хотите достичь, немного сложно, но выполнимо. Один из способов, который я могу придумать, — сначала создать линейные диаграммы, получить URI изображения и, используя «AllowHTML» в табличной диаграмме, внедрить тег «» с атрибутом «src», указывающим на URI изображения диаграммы для этого пользователя.

Пример:

Ваша строка в вашей табличной диаграмме:

['Mike', {v: 10000, f: '$10,000'}, true, **HTML LINE CHART1 HERE**]

изменения в:

['Mike', {v: 10000, f: '$10,000'}, true, '<img src="' chart.getImageURI() '">']

где chart находится линейная диаграмма для каждого пользователя и использование опции allowHtml: true . О, и для HTML установите для типа данных столбца значение ‘string’.

Список литературы: