是否可以在google sheet脚本中编写自己的自定义函数,返回绘制的图像,类似于SPARKLINE函数的工作方式,但我想制作一个绘制饼图的图片。
我不想要使用Insert>图表...>饼图,因为它在电子表格的顶部创建浮动图表。我希望能够编写自己的函数,它将返回嵌入函数输入单元格中的饼图,就像使用迷你图对列,条形图和折线图一样。
答案 0 :(得分:1)
如何追随这个想法?此示例脚本使用Spreadsheet上的自定义函数将图表嵌入到单元格中。我认为这种方法是各种各样的想法之一。
如果要创建图表并使用自定义函数将其嵌入到单元格中,您会注意到insertChart()
无法使用。使用自定义函数有一些限制。但是insertChart()
会创建浮动图表。因此,为了将图表嵌入到单元格中,函数=IMAGE()
适合于这种情况。此处,用于设置setFormula()
的{{1}}和用于从图表创建图片的=IMAGE()
也不能用于自定义函数。
为了避免这些限制,我使用了Web Apps。
要使用此示例脚本,请按如下方式部署Web Apps。
在脚本编辑器中,
在部署Web Apps时,可以同时完成批准所需的授权。
请将此脚本复制并粘贴到电子表格的绑定脚本中。
DriveApp.createFile()
<强> embedChart()强>
var folderId = "### Folder ID ###"; // This is a folder to save images.
var webappsurl = "https://script.google.com/macros/s/######/exec"; // Here, please put "Current web app URL".
function embedChart(range) {
var ac = SpreadsheetApp.getActiveSheet().getActiveCell();
var q1 = "?datarange=" + range;
var q2 = "&row=" + ac.getRow();
var q3 = "&col=" + ac.getColumn();
var url = webappsurl + q1 + q2 + q3;
UrlFetchApp.fetch(url);
}
function doGet(e) {
var sheet = SpreadsheetApp.getActiveSheet();
var chart = sheet.newChart()
.setChartType(Charts.ChartType.PIE)
.addRange(sheet.getRange(e.parameters.datarange))
.setOption('height', 280)
.setOption('width', 480)
.setOption('title', 'Sample chart')
.build();
var file = DriveApp.getFolderById(folderId).createFile(
chart.getAs('image/png').setName("chart_image.png")
);
file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);
sheet.getRange(e.parameters.row, e.parameters.col).setFormula(
'=IMAGE("' + "http://drive.google.com/uc?id=" + file.getId() + '")'
);
}
中输入=embedChart("a2:a6")
。B7
,将fetch()
的数据和输入的坐标发送至a2:a6
。<强>的doGet()强>
doGet()
获取数据。doGet()
创建图表。 (在这种情况下,创建一个饼图)a2:a6
。=IMAGE()
导入的=IMAGE()
嵌入图片。通过在单元格setFormula()
中输入=embedChart("a2:a6")
作为自定义函数,可以获得以下结果。
B7
时,加载时间约为40秒。 (我不知道这是否只发生在我的环境中。)embedChart()
被embedChart()
覆盖。因此,重新打开电子表格时,=IMAGE()
的响应要比=IMAGE()
的响应快得多。如果我误解了你的问题,我很抱歉。