Get as Image 生成错误的图像 - Google App Script

Get as Image generates wrong image - Google App Script

我的目标是使用来自 google sheet 的信息和 google 应用程序脚本创建 google 文档。

我可以根据 google sheet 中的数据生成雷达图。雷达图如下所示:

radar chart looking all good

问题:当我将图表作为图像并将其粘贴到 google 文档时。看起来全错了。见图片和代码。

radar chart not so good looking

我的代码:

var chart = sheet.newChart()
   .setChartType(Charts.ChartType.RADAR)
   .setPosition(8,2,0,0)
   .setNumHeaders(1)
   .setOption('title', title)
   .addRange(sheet.getRange("A1:G1"))
   .addRange(sheet.getRange("A2:G2"))
   .setMergeStrategy(Charts.ChartMergeStrategy.MERGE_ROWS)
   .setTransposeRowsAndColumns(true)
   .setOption('vAxes',{0: {viewWindow: {min: 0, max: 100}}})
   .setOption('series', {0: {lineWidth: 4, color: '#FFA500'}})
   .build();

sheet.insertChart(chart);
var image = sheet.getCharts()[0].getBlob().getAs('image/png');

最近找到的类似 post 是这个:Automatting Radar Chart Generation in Google Doc using Google Apps Script

但那里没有给出答案。希望有人能帮忙。

编辑: 感谢 Tanaike 它现在正在工作。对于任何想知道的人,这是我用来生成图表并将其插入 google 文档的脚本。用图表替换文本。

var chart = sheet.newChart()
   .setChartType(Charts.ChartType.RADAR)
   .setPosition(8,2,0,0)
   .setNumHeaders(1)
   .setOption('title', title)
   .addRange(sheet.getRange("A1:G1"))
   .addRange(sheet.getRange("A2:G2"))
   .setMergeStrategy(Charts.ChartMergeStrategy.MERGE_ROWS)
   .setTransposeRowsAndColumns(true)
   .setOption('vAxes',{0: {viewWindow: {min: 0, max: 100}}})
   .setOption('series', {0: {lineWidth: 4, color: '#FFA500'}})
   .build();

sheet.insertChart(chart);

// workaround by Tanaike   
const slides = SlidesApp.create("temp");
const image = slides.getSlides()[0].insertSheetsChartAsImage(chart).getAs("image/png");
DriveApp.getFileById(slides.getId()).setTrashed(true);

var item = doc.getBody().findText("<text-to-replace>");
var r = item.getElement();
r.asText().setText("");
var img = r.getParent().asParagraph().insertInlineImage(0, image);

这个答案怎么样?

问题和解决方法:

我认为这可能是一个错误。在这种情况下,作为解决方法,我使用了 Google 幻灯片,它可以直接放置使用 Google 电子表格创建的图表。当从放入 Google 幻灯片的图表中检索到 blob 时,blob 与 Google 电子表格中的 chrat 相同。

修改后的脚本:

当您的脚本修改时,请修改如下。

从:
var image = sheet.getCharts()[0].getBlob().getAs('image/png');
到:
const slides = SlidesApp.create("temp");
const imageBlob = slides.getSlides()[0].insertSheetsChartAsImage(chart).getAs("image/png");
DriveApp.getFileById(slides.getId()).setTrashed(true);
DriveApp.createFile(imageBlob);
  • DriveApp.createFile(imageBlob)创建imageBlob文件时,可以得到如下结果

结果:

imageimageBlob创建为文件时,分别获取左图和右图

注:

  • 如果要使用此解决方法将正确的图表图像放入 Google 文档,请按如下方式修改。

      const slides = SlidesApp.create("temp");
      const imageBlob = slides.getSlides()[0].insertSheetsChartAsImage(chart).getAs("image/png");
      DriveApp.getFileById(slides.getId()).setTrashed(true);
    
      // This script puts the retrieved image blob to the Google Document.
      DocumentApp.openById("### Document ID ###").getBody().insertImage(0, imageBlob);
    

参考: