Google sheets 你能写一个Google Sheets函数来画一些东西吗?
是否可以在GoogleSheets脚本中编写自己的自定义函数,返回绘制的图像,类似于SPARKLINE函数的工作方式,只是我想制作一个绘制饼图的函数Google sheets 你能写一个Google Sheets函数来画一些东西吗?,google-sheets,Google Sheets,是否可以在GoogleSheets脚本中编写自己的自定义函数,返回绘制的图像,类似于SPARKLINE函数的工作方式,只是我想制作一个绘制饼图的函数 我不想使用插入>图表…>饼图,因为这样会在电子表格顶部创建一个浮动图表。我希望能够编写我自己的函数,返回一个饼图,该饼图嵌入在函数输入的单元格中,就像使用sparkline处理列、条形图和折线图一样。下面的想法如何?此示例脚本使用电子表格上的自定义函数将图表嵌入到单元格中。我认为这种方法是多种想法之一 问题: 当您想要创建图表并使用自定义函数将其嵌
我不想使用插入>图表…>饼图,因为这样会在电子表格顶部创建一个浮动图表。我希望能够编写我自己的函数,返回一个饼图,该饼图嵌入在函数输入的单元格中,就像使用sparkline处理列、条形图和折线图一样。下面的想法如何?此示例脚本使用电子表格上的自定义函数将图表嵌入到单元格中。我认为这种方法是多种想法之一 问题: 当您想要创建图表并使用自定义函数将其嵌入单元格时,您会注意到不能使用
insertChart()
。使用自定义函数有一些限制。但是insertChart()
会创建浮动图表。因此,为了将图表嵌入单元格,函数=IMAGE()
适用于这种情况。在这里,用于设置=IMAGE()
的setFormula()
和用于从图表创建图像的DriveApp.createFile()
也不能用于自定义函数
解决方案:
为了避免这些限制,我使用了
要使用此示例脚本,请按如下方式部署Web应用
在脚本编辑器上
- 文件
- ->管理版本
- ->保存新版本
- 发表
- ->部署为Web应用程序
- ->在执行应用程序时,选择“您的帐户”
- ->在有权访问该应用程序的用户处,选择“任何人,甚至匿名”
- ->单击“部署”
- ->复制“当前web应用程序URL”
- ->单击“确定”
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()
B7
中输入=embedChart(“a2:a6”)
fetch()
,将a2:a6
的数据和输入的坐标发送到doGet()
doGet()
,获取数据a2:a6
。(在本例中,创建饼图)=image()
setFormula()
导入的=image()
嵌入图像=embedChart(“a2:a6”)
作为自定义函数输入单元格B7
,可以获得以下结果
注:
embedChart()
时,加载时间约为40秒。(我不知道这是否只发生在我的环境中。)embedChart()
被=IMAGE()
覆盖。因此,当重新打开电子表格时,=IMAGE()
的响应比embedChart()
的响应快得多如果我误解了你的问题,我很抱歉。这是一个很酷的解决方法,但我想知道是否有可能编写一个脚本,比如创建画布,在画布上绘制,然后将其返回到单元格。根据以前的经验,我知道Web应用程序可以避免谷歌应用程序脚本的各种限制,而它在第一次运行时需要授权。所以我在这种情况下试过了。这对你的环境有用吗?如果这对你有帮助,我很高兴。