Google sheets 你能写一个Google Sheets函数来画一些东西吗?

Google sheets 你能写一个Google Sheets函数来画一些东西吗?,google-sheets,Google Sheets,是否可以在GoogleSheets脚本中编写自己的自定义函数,返回绘制的图像,类似于SPARKLINE函数的工作方式,只是我想制作一个绘制饼图的函数 我不想使用插入>图表…>饼图,因为这样会在电子表格顶部创建一个浮动图表。我希望能够编写我自己的函数,返回一个饼图,该饼图嵌入在函数输入的单元格中,就像使用sparkline处理列、条形图和折线图一样。下面的想法如何?此示例脚本使用电子表格上的自定义函数将图表嵌入到单元格中。我认为这种方法是多种想法之一 问题: 当您想要创建图表并使用自定义函数将其嵌

是否可以在GoogleSheets脚本中编写自己的自定义函数,返回绘制的图像,类似于SPARKLINE函数的工作方式,只是我想制作一个绘制饼图的函数


我不想使用插入>图表…>饼图,因为这样会在电子表格顶部创建一个浮动图表。我希望能够编写我自己的函数,返回一个饼图,该饼图嵌入在函数输入的单元格中,就像使用sparkline处理列、条形图和折线图一样。

下面的想法如何?此示例脚本使用电子表格上的自定义函数将图表嵌入到单元格中。我认为这种方法是多种想法之一

问题: 当您想要创建图表并使用自定义函数将其嵌入单元格时,您会注意到不能使用
insertChart()
。使用自定义函数有一些限制。但是
insertChart()
会创建浮动图表。因此,为了将图表嵌入单元格,函数
=IMAGE()
适用于这种情况。在这里,用于设置
=IMAGE()
setFormula()
和用于从图表创建图像的
DriveApp.createFile()
也不能用于自定义函数

解决方案: 为了避免这些限制,我使用了

要使用此示例脚本,请按如下方式部署Web应用

在脚本编辑器上

  • 文件
    • ->管理版本
    • ->保存新版本
  • 发表
    • ->部署为Web应用程序
    • ->在执行应用程序时,选择“您的帐户”
    • ->在有权访问该应用程序的用户处,选择“任何人,甚至匿名”
    • ->单击“部署”
    • ->复制“当前web应用程序URL”
    • ->单击“确定”
当它部署Web应用程序时,可以同时完成批准所需的授权

示例脚本: 请将此脚本复制并粘贴到电子表格的绑定脚本中

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()

  • 使用
    doGet()
    ,获取数据
  • 使用输入的范围创建图表
    a2:a6
    。(在本例中,创建饼图)
  • 将图表另存为图像。(在本例中,另存为PNG)
  • 更新图像文件的权限以用于
    =image()
  • 使用由
    setFormula()
    导入的
    =image()
    嵌入图像
  • 结果: 通过将
    =embedChart(“a2:a6”)
    作为自定义函数输入单元格
    B7
    ,可以获得以下结果

    注:
  • 使用自定义函数
    embedChart()
    时,加载时间约为40秒。(我不知道这是否只发生在我的环境中。)
  • 已创建映像的权限为
  • embedChart()
    =IMAGE()
    覆盖。因此,当重新打开电子表格时,
    =IMAGE()
    的响应比
    embedChart()
    的响应快得多

  • 如果我误解了你的问题,我很抱歉。

    这是一个很酷的解决方法,但我想知道是否有可能编写一个脚本,比如创建画布,在画布上绘制,然后将其返回到单元格。根据以前的经验,我知道Web应用程序可以避免谷歌应用程序脚本的各种限制,而它在第一次运行时需要授权。所以我在这种情况下试过了。这对你的环境有用吗?如果这对你有帮助,我很高兴。