【问题标题】:How to embbed a Charts.Chart to Google Sheet (Script Apps)如何将 Charts.Chart 嵌入 Google 表格(脚本应用程序)
【发布时间】:2020-10-26 09:12:24
【问题描述】:

我正在寻找一种将Charts.Chart 嵌入 Google 表格的方法(但不仅如此,我还希望能够将其插入到其他支持中,例如用户表单、Google Doc 等)

function generateChart(data) {
  
  var chartBuilder = Charts.newBarChart();
    // Miscellaneous such as titles, dimensions and data
    // ..
    ;
  
  var chart = chartBuilder.build();
  
  return chart;
}

另外,我不想直接使用电子表格范围内的图表值(会有一些数据操作..),但如果来自data 哪里是数组结构,则使用。

data = {
  field1: [..],
  field2: ..
}

所以,基本上我想避免这样的事情,因为它会创建对工作表的依赖。

var sheet = SpreadsheetApp.getActiveSheet();
var chartBuilder = sheet.newChart()
  // ..
  ;

如果我写sheet.insertChart(generateChart(data)),我会收到以下错误。这是有道理的,因为我处理的不是同类型的Chart,但是有解决方法吗?

异常:参数 (Charts.Chart) 与 SpreadsheetApp.Sheet.insertChart 的方法签名不匹配。

我想知道是否不应该将其转换为 blob 以使其与 Google Sheet Chart 格式兼容,但我确信有更直接的方法可以实现它。

感谢您的任何见解!

【问题讨论】:

  • 您可以将其作为图像插入,否则我认为无法转换 Chart => EmbeddedChart 类。
  • 好吧,我也发现了这种可能性,但恐怕它太有限了......所以,基本上Chart类是完全没用的(除了给定的想象?)我也考虑过创建一个自定义的Sheet 类,我可以将它抽象一点,但我只知道 JavaScript 的基础知识。
  • 是的。 Chart 类毫无用处。这是现已弃用的UiApp 的幸存独奏残余。
  • ... 那么,是否没有其他方法可以生成不直接使用范围的图表?我的意思是值(字符串、整数等)的数组或集合(不确定它是否存在于 JavaScript 中,但在 VBA 集合中必须转换为数组才能填充图表系列)?否则,我找到了一种使用 chart.js 生成超棒图表的绝佳方法,但恐怕无法将它们直接插入到表格(或其他 Google 应用程序)中,对吧?
  • 我不完全确定,因为我还没有尝试破解并查看EmbeddedChart 对象(这需要原始研究/时间和完全浪费我时间的真正可能性)。根据我目前的经验,直接创建没有范围的嵌入式图表是不可能的。如果我有兴趣,我会先研究.setOption()chart html source。更好/更简单的方法是使用侧边栏 html 并直接在浏览器中使用 google-charts,您可以在其中添加您认为合适的数组。

标签: google-apps-script charts google-visualization


【解决方案1】:

EmbeddedChart 不是类图表的一部分

根据documentation for Charts 所说的creates a basic data table, populates an area chart with the data, and adds it into a web page as an image。您还可以获取图像 URL 和 Blob。

作为一种解决方法

通过使用表格

我会使用 insertImage 函数,利用 Charts 提供的 URL。

function myFunction() {
  var data = Charts.newDataTable()
    .addColumn(Charts.ColumnType.STRING, "Year")
    .addColumn(Charts.ColumnType.NUMBER, "Sales")
    .addColumn(Charts.ColumnType.NUMBER, "Expenses")
    .addRow(["2004", 1000, 400])
    .addRow(["2005", 1170, 460])
    .addRow(["2006", 660, 1120])
    .addRow(["2007", 1030, 540])
    .addRow(["2008", 800, 600])
    .addRow(["2009", 943, 678])
    .addRow(["2010", 1020, 550])
    .addRow(["2011", 910, 700])
    .addRow(["2012", 1230, 840])
    .build();

  var chart = Charts.newColumnChart()
    .setTitle('Sales & Expenses')
    .setXAxisTitle('Year')
    .setYAxisTitle('Amount (USD)')
    .setDimensions(600, 500)
    .setDataTable(data)
    .build();

  var htmlOutput = HtmlService.createHtmlOutput().setTitle('My Chart');
  var imageData = Utilities.base64Encode(chart.getAs('image/png').getBytes());
  var imageUrl = "data:image/png;base64," + encodeURI(imageData);

  // Insert the image in the A1
  SpreadsheetApp.getActiveSheet().insertImage(imageUrl, 1, 1);
}

通过使用文档

我会使用insertInlineImage

function myFunction() {
  var data = Charts.newDataTable()
    .addColumn(Charts.ColumnType.STRING, "Year")
    .addColumn(Charts.ColumnType.NUMBER, "Sales")
    .addColumn(Charts.ColumnType.NUMBER, "Expenses")
    .addRow(["2004", 1000, 400])
    .addRow(["2005", 1170, 460])
    .addRow(["2006", 660, 1120])
    .addRow(["2007", 1030, 540])
    .addRow(["2008", 800, 600])
    .addRow(["2009", 943, 678])
    .addRow(["2010", 1020, 550])
    .addRow(["2011", 910, 700])
    .addRow(["2012", 1230, 840])
    .build();

  var chart = Charts.newColumnChart()
    .setTitle('Sales & Expenses')
    .setXAxisTitle('Year')
    .setYAxisTitle('Amount (USD)')
    .setDimensions(600, 500)
    .setDataTable(data)
    .build();

  var image = chart.getAs('image/png')
  
  // Insert an image chart
  var doc = DocumentApp.getActiveDocument();

  var cursor = doc.getCursor();
  if (cursor) {
    cursor.insertInlineImage(image);
  } else {
    doc.getBody().insertImage(0, image);
  }
}

参考

Google Apps Script > Charts

【讨论】:

  • 好的,感谢您的帮助。我将它管理到我的示例(也是BarChart),但我得到水平条,似乎我无法置换DataTable 中的列和行)。怎么可能实现呢?
  • 好的,这根本不是问题,我编辑了我的代码以便使用您要使用的图表 Charts.newColumnChart()
  • 好的,有道理。我不是BarChart,而是ColumnChart。我仍然需要转置填充行的对象,但这应该不是问题。仍然担心将其渲染为图像,因为它会阻止手动编辑图形...
猜你喜欢
  • 2023-03-24
  • 2019-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多