Создавайте EmbeddedChart в Google Sheets без использования Range с помощью Google Apps Script - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь создать EmbeddedChart в Google Sheets, не используя Range в моей электронной таблице, но используя мои собственные значения, которые я рассчитал. После поисков в течение нескольких часов я не могу найти решение. Каков наилучший способ сделать это? (Для подведения итогов я хочу использовать класс EmbeddedChartBuilder, например, класс ChartBuilder)

1 Ответ

2 голосов
/ 18 марта 2020
  • Вы хотите создать диаграмму с возможностью нажатия на нее с помощью службы диаграмм и поместить ее в электронную таблицу.
  • Вы хотите добиться этого с помощью скрипта Google Apps.

Я мог бы понять, как указано выше. Если мое понимание верно, как насчет этого ответа? Пожалуйста, подумайте об этом как об одном из нескольких возможных ответов.

В этом ответе я использовал сценарий вашего предыдущего вопроса , немного изменив его. В этом случае в вашем сценарии извлекаются значения из столбца «C2: C», а диаграмма создается с использованием значений и дублированных номеров значений.

Pattern 1:

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

Использование:

Для запуска сценарий, пожалуйста, запустите функцию openDialog() в редакторе сценариев после того, как скопировали и вставили следующие сценарии. Таким образом, открывается диалоговое окно для электронной таблицы, и диаграмма помещается в диалоговое окно.

В этом примере сценария значения извлекаются из столбца "C" листа const sheetName = "Sheet1" в электронная таблица. Поэтому, пожалуйста, используйте связанный с контейнером скрипт Spreadsheet. Пожалуйста, будьте осторожны.

Пример сценария: Code.gs (сторона сценария Google Apps)

const sheetName = "Sheet1";  // Please set the sheet name.

// Please run this function.
function openDialog() {
  var html = HtmlService.createHtmlOutputFromFile('index').setWidth(650).setHeight(550);
  SpreadsheetApp.getUi().showModalDialog(html, "sample");
}

function getValuesFromSpreadsheet() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
  return sheet.getRange(`C2:C${sheet.getLastRow()}`).getValues()
    .reduce((o, [e]) => {
      o[e] = e in o ? o[e] + 1 : 1
      return o;
    }, {});
}

Пример сценария: index.html (сторона HTML & Javascript)

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

  function drawChart() {
    google.script.run.withSuccessHandler(artists => {
      var dataArtists = new google.visualization.DataTable();
      dataArtists.addColumn('string', 'Artists');
      dataArtists.addColumn('number', 'Count');
      for(var key in artists) {
        dataArtists.addRow([key, artists[key]]);
      }
      const options = {
        title: 'Number of Tracks per Artist',
        vAxis: {title: "Artists"},
        hAxis: {title: "Number of  Tracks"},
        width: 600,
        height: 500
      };
      barsVisualization = new google.visualization.BarChart(document.getElementById('chart_div'));
      barsVisualization.draw(dataArtists, options);
    }).getValuesFromSpreadsheet();
  }
</script>

Шаблон 2:

В этом шаблоне диаграмма, созданная с помощью измененного сценария вашего сценария, помещается в электронную таблицу в виде изображения. В этом случае график создается путем запуска функции myFunction, созданной с помощью Charts Service . В этом случае данные извлекаются из активного листа. Пожалуйста, будьте осторожны.

Пример сценария:

function myFunction() {
  var app = SpreadsheetApp;
  var ss = app.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var artistsArray;
  var dataArtists;
  dataArtists = Charts.newDataTable().addColumn(Charts.ColumnType.STRING, 'Artists').addColumn(Charts.ColumnType.NUMBER, 'Count');
  var artists = sheet.getRange(`C2:C${sheet.getLastRow()}`).getValues()
    .reduce((o, [e]) => {
      o[e] = e in o ? o[e] + 1 : 1
      return o;
    }, {});
  for(var key in artists) {
    dataArtists.addRow([key, artists[key]]);
  }
  dataArtists.build();
  var artistsChart = Charts.newBarChart()
  .setDataTable(dataArtists)
  .setTitle('Number of Tracks per Artist')
  .setXAxisTitle('Number of  Tracks')
  .setYAxisTitle('Artists')
  .setDimensions(600, 500)
  .build();
  sheet.insertImage(artistsChart.getBlob(), 1, 1);
}

Примечание:

  • В этом случае, пожалуйста, включите V8 в редакторе сценариев.

Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...