Slack Webhook HTML表格

56

我有一个 HTML 表格,我想通过 webhook 将其发布到 Slack。

是否有办法将 HTML 表格发布到 Slack?

以下是 HTML 代码:

<!DOCTYPE html>
<html>
   <head>
      <title>HTML Tables</title>
   </head>
   <body>
      <table border="1">
         <tr>
            <td>Row 1, Column 1</td>
            <td>Row 1, Column 2</td>
         </tr>
         <tr>
            <td>Row 2, Column 1</td>
            <td>Row 2, Column 2</td>
         </tr>
      </table>
   </body>
</html>
10个回答

56

我已经向Slack支持提交了一张票据,询问Slack的Incoming Webhook消息是否支持任何形式的表格(HTML或Markdown)。

官方回答是Slack消息不支持表格

他们建议生成一个表格并将其发布为图像。

他们还说他们会将其添加到待办事项列表中。


5
谢谢。最终我通过向 Slack 频道发送电子邮件来获取格式化的表格。 - Punter Vicky
我想在这里重新开启同样的讨论。后端渲染表格的最佳方法是什么?@PunterVicky,你找到可靠的解决方案了吗? - CM.
9
将表格作为图片发布是一个糟糕的解决方案。它们会妨碍辅助技术(例如盲用户无法阅读),也无法进行搜索。我希望Slack能够支持Markdown格式,就像它已经部分支持的那样,以及其他许多在线工具,包括GitHub和StackOverflow。 - Michael Scheper
5
这相当令人尴尬。 - O'Rooney
2
我猜还在积压中。 - Kozmo
显示剩余3条评论

40

28

使用 "fields" 布局块,您现在可以在 Slack 中创建简单的两列表格。

您可以创建两列表格:

[
   {
        "type": "section",
        "fields": [
            {
                "type": "mrkdwn",
                "text": "*Name*"
            },
            {
                "type": "mrkdwn",
                "text": "*Email*"
            },
            {
                "type": "plain_text",
                "text": "Jeff Henderson",
                "emoji": true
            },
            {
                "type": "mrkdwn",
                "text": "jh@geemail.com"
            },
            {
                "type": "plain_text",
                "text": "Anne Polin",
                "emoji": true
            },
            {
                "type": "mrkdwn",
                "text": "ap@geemail.com"
            }

        ]
    }
]
给你: enter image description here 或者采用场地风格:
[
    {
        "type": "section",
        "fields": [
            {
                "type": "plain_text",
                "text": "Name",
                "emoji": true
            },
            {
                "type": "mrkdwn",
                "text": "*Jeff Henderson*"
            },
            {
                "type": "plain_text",
                "text": "Email",
                "emoji": true
            },
            {
                "type": "mrkdwn",
                "text": "jh@geemail.com"
            },
            {
                "type": "plain_text",
                "text": "Mobile Phone",
                "emoji": true
            },
            {
                "type": "mrkdwn",
                "text": "0451000000"
            },
            {
                "type": "plain_text",
                "text": "Work Phone",
                "emoji": true
            },
            {
                "type": "mrkdwn",
                "text": "94550000"
            }

        ]
    }
]

将产生:

输入图像描述


谢谢!这有所帮助。 - Punter Vicky
很高兴它对你有用! - Avner
5
很不幸,这个限制只允许在字段数组中最多有10个元素。我是在吃了亏之后才知道的,但这里也提到了:https://api.slack.com/reference/messaging/blocks - JKJ
处理10个元素限制的人,请看我下面的回答。 - gradLife
这些似乎在频道消息响应方面工作正常,但在threadTs上不起作用。 - BEWARB
显示剩余3条评论

24

并非特定于HTML表格,但您可以使用类似console.table的包将您的表格数据打印到字符串变量中。然后使用三个反引号将表格添加到Slack消息的文本字段中。例如:

const cTable = require('console.table');
const table = cTable.getTable([
  {
    name: 'foo',
    age: 10
  }, {
    name: 'bar',
    age: 20
  }
]);

然后作为您的Slack消息附件的一部分:

const attachmentList = {
        "title": "YOUR TITLE",
        "text": 'HERE IS YOUR TABLE: : \n ```'+table+'```',
    }

2
不错,我喜欢这个解决方案。 - faboulaws
如果我是楼主,我肯定会接受这个答案。 - Christiaan Westerbeek
而你,我的朋友,是一个真正的英雄! - learn_more

17

很遗憾,似乎表格是Markdown标准,但Slack目前不支持。

一个简陋的解决方法是在文本的文字块中使用 绘图字符(在三个反引号上下包裹, 即 ```, 分别放在独立的行上)。

我偶尔会使用 tablesgenerator.com 在线生成表格。

╔══════╤══════╤══════════╗
║ Dog  │ Cat  │ Bird     ║
╠══════╪══════╪══════════╣
║ Woof │ Meow │ Tweet    ║
╟──────┼──────┼──────────╢
║ Fur  │ Fur  │ Feathers ║
╚══════╧══════╧══════════╝

它们肯定不漂亮,但与Slack明显推荐的黏贴图像不同,它们的内容可以被搜索,而且对于我的一些同事来说,它们在一定程度上可与辅助技术配合使用。


tablesgenerator.com安全吗?你知道他们是否将数据存储在他们的服务器上吗? - Borderless.Nomad
@Borderless.Nomad:我不知道,我从来没有用它处理过任何敏感的东西,所以我也不担心这个问题。一些编辑器也有这种功能,比如 vim 的 https://www.vim.org/scripts/script.php?script_id=40 插件。不过我从来没有用过那个插件,因为每当 tablesgenerator.com 无法产生我想要的输出时,我总是手动复制和粘贴相关的框图字符。所以如果只是一次性的任务,也许你也可以这样做。 - Michael Scheper

4

Slack API把块限制为仅有10个元素,但您可以添加一个带换行符的长文本来使其看起来像表格。以下是一个示例:

[
                    {
                        "type": "section",
                        "text": {
                            "text": "Conference Standings:",
                            "type": "mrkdwn"
                        },
                        "fields": [
                            {
                                "type": "mrkdwn",
                                "text": "*Team*"
                            },
                            {
                                "type": "mrkdwn",
                                "text": "*W-L*"
                            },
                            {
                                "type": "plain_text",
                                "text": "Team1\nTeam2\nTeam3\nTeam4\nTeam5\n"
                            },
                            {
                                "type": "plain_text",
                                "text": "1\n2\n3\n4\n5\n"
                            }
                        ]
                    }
                ]

这是结果。 这里是图片描述

如果您更改屏幕大小,这并不会有所帮助。 - Adithya Ranganath
这个可以工作,但无法超过2000个字符。 - E_K

4

这是各种不同答案的混合体。我也建议发送格式化的字符串,因为它支持超过两列。

然而,问题在于Slack并没有给每个字符相等的空间,正如代码通常会做的那样。这意味着行不会对齐。因此,我建议使用代码块,需要使用反引号(```)。

Python示例使用格式化字符串:

monthly_numbers_str = f"```"
monthly_numbers_str += f"{"Month".ljust(7)}{"Users".ljust(7)}\n"

monthly_numbers_str += f"{"Jan".ljust(7)}{"15".ljust(7)}\n"
monthly_numbers_str += f"{"Feb".ljust(7)}{"19".ljust(7)}\n"
monthly_numbers_str += f"{"Mar".ljust(7)}{"30".ljust(7)}\n"
monthly_numbers_str += f"```"

输出(代码格式):
Month  Users
Jan    15
Feb    19
Mar    30

2

1

如果您想在Markdown中使用超链接,可以使用以下代码块:

first_row = ["asdasfasf", "12341433124"]
second_row = ["asda", "123124"]

mes = "--------------\n"
for fr in first_row:
  mes += ("[`"+fr.center(20,".")+"`](https://www.google.com)")
mes += "\n\n"
for sr in second_row:
  mes += ("[`"+sr.center(20,".")+"`](https://www.google.com)")
mes+="\n---------------"

data = {
  "title": "Example message",
  "message": mes,
}

headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}
r = requests.post(uri, data=json.dumps(data), headers=headers)

输出结果应该看起来与这个差不多。要注意保留HTML标签。

0

是的,Slack Webhook 不支持 HTML、CSS。对于这种情况,@slack/web-api 更加灵活。如果您想要格式化您的列,您可以使用以下方法来进行 Node/TypeScript 编程。

function tableToString(headers: string[], rows: string[][]): string {
  const columnWidths = headers.map((header, index) => {
    const column = [header, ...rows.map((row) => row[index])];
    return column.reduce((maxWidth, value) => Math.max(maxWidth, value.length), 0);
  });

  const separator = columnWidths.map((width) => '-'.repeat(width)).join('-+-');

  const headerRow = headers
    .map((header, index) => header.padEnd(columnWidths[index], ' '))
    .join(' | ');

  const bodyRows = rows.map((row) =>
    row
      .map((value, index) => value.padEnd(columnWidths[index], ' '))
      .join(' | ')
  );

  return [headerRow, separator, ...bodyRows].join('\n');
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接