你能写一个Google Sheets函数来绘制一些东西吗?

时间:2017-05-25 14:22:07

标签: google-sheets

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

想要使用Insert>图表...>饼图,因为它在电子表格的顶部创建浮动图表。我希望能够编写自己的函数,它将返回嵌入函数输入单元格中的饼图,就像使用迷你图对列,条形图和折线图一样。

1 个答案:

答案 0 :(得分:1)

如何追随这个想法?此示例脚本使用Spreadsheet上的自定义函数将图表嵌入到单元格中。我认为这种方法是各种各样的想法之一。

问题:

如果要创建图表并使用自定义函数将其嵌入到单元格中,您会注意到insertChart()无法使用。使用自定义函数有一些限制。但是insertChart()会创建浮动图表。因此,为了将图表嵌入到单元格中,函数=IMAGE()适合于这种情况。此处,用于设置setFormula()的{​​{1}}和用于从图表创建图片的=IMAGE()也不能用于自定义函数。

解决方案:

为了避免这些限制,我使用了Web Apps

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

在脚本编辑器中,

  • 文件
    • - >管理版本
    • - >保存新版本
  • 发布
    • - >部署为Web App
    • - >在执行应用时,选择“您的帐户”
    • - >在Who有权访问该应用时,请选择“任何人,甚至匿名”
    • - >点击“部署”
    • - >复制“当前网络应用网址”
    • - >点击“确定”

在部署Web Apps时,可以同时完成批准所需的授权。

示例脚本:

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

DriveApp.createFile()

脚本流程:

<强> embedChart()

  1. 在单元格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")
  2. 使用B7,将fetch()的数据和输入的坐标发送至a2:a6
  3. <强>的doGet()

    1. 使用doGet()获取数据。
    2. 使用输入范围doGet()创建图表。 (在这种情况下,创建一个饼图)
    3. 将图表另存为图像。 (在这种情况下,另存为PNG)
    4. 更新图像文件的权限以用于a2:a6
    5. 使用由=IMAGE()导入的=IMAGE()嵌入图片。
    6. 结果:

      通过在单元格setFormula()中输入=embedChart("a2:a6")作为自定义函数,可以获得以下结果。

      enter image description here

      注意:

      1. 使用自定义函数B7时,加载时间约为40秒。 (我不知道这是否只发生在我的环境中。)
      2. 创建的图片的权限为ANYONE_WITH_LINKVIEW
      3. embedChart()embedChart()覆盖。因此,重新打开电子表格时,=IMAGE()的响应要比=IMAGE()的响应快得多。
      4. 如果我误解了你的问题,我很抱歉。