如何将 Google 电子表格图表上传到 Slack 频道

brn*_*rnc 2 google-sheets google-apps-script slack-api

我正在为我的 Google 电子表格编写应用程序脚本,我想知道如何将图表作为图像附件发送到 Slack?

这是获取图表的函数:

function getChart(){
  var sheet = SpreadsheetApp.getActiveSheet();
  var chart = sheet.getCharts()[0];
  var pic = chart.getAs('image/png');
  if (chart){
    msg(pic);
    return pic;
  }
}
Run Code Online (Sandbox Code Playgroud)

这是我的“dashbot”功能,它向 slack 发送一条短信:

function dashbot() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var content = {"channel": "XXX", //edit
                 "username": "XXX",
                 "text": "XXX"};
  var params = {
     "method": "post",
     "payload": JSON.stringify(content)
   };
   UrlFetchApp.fetch('https://hooks.slack.com/XXXXX', params)
}
Run Code Online (Sandbox Code Playgroud)

有什么想法如何继续推进吗?

Tan*_*ike 5

这个示例脚本怎么样?正如 @Erik Kalkoken 所说,文件无法使用 Webhook 直接上传到 Slack。所以当文件上传到Slack时,必须使用URL。使用URL上传文件后,即使文件被删除,Slack上的文件也不会被删除。我准备了一个示例脚本来反映这一点。

脚本流程如下。

流动 :

  1. 获取图表
  2. 将图表转换为 png 格式的图像 blob
  3. 将图像 blob 保存为文件
  4. 修改文件权限为打开
  5. 检索文件的 URL
  6. 使用 URL 发布负载
  7. 修改文件权限为关闭

在此脚本中,uloaded 文件位于 Google Drive 的根目录中。即使文件被删除,Slack 上的文件也不会被删除。

示例脚本:

function myFunction() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var chart = sheet.getCharts()[0];
  if (chart) {
    var pic = chart.getAs('image/png');
    var file = DriveApp.createFile(pic).setName("sampleimage.png");
    file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW); // Modify file permission to the open.
    var content = {
      "channel":"XXX",
      "username":"XXX",
      "text":"XXX",
      "attachments":[{"image_url": "http://drive.google.com/uc?export=download&id=" + file.getId()}]
    };
    var res = UrlFetchApp.fetch(
      "https://hooks.slack.com/XXXXX",
      {
        method: "post",
        payload: JSON.stringify(content),
        muteHttpExceptions: true,
      }).getContentText();
    Utilities.sleep(3000); // Wait for until reading image file from Slack.
    file.setSharing(DriveApp.Access.PRIVATE, DriveApp.Permission.NONE); // Modify file permission to the close.
  }
}
Run Code Online (Sandbox Code Playgroud)

如果这对您没有用,我很抱歉。