用于从Google表格发布内容的简单Slack应用

我们喜欢尝试新事物,因此经常与我们的同事共享来自IT和编程领域的有趣信息的链接。我们是Slack的长期用户,对于此类链接,我们拥有独立的教育频道,每个人都可以找到自己感兴趣的东西。但是由于我们是普通百姓,所以在工作忙碌的时候,我们经常忘记共享这些链接,尽管许多人可以分享一些东西,但渠道中的活动却逐渐消失了。

我们面临着一个有趣的任务,即开发一个“机器人”,该机器人可以自动获取预先收集的信息并定期共享其链接。我们一直在寻找Internet上现成的解决方案,现在它似乎是zapier和slack的集成

图片

但是,我们之前没有发现这种整合,因此决定编写自己的小型自行车。下面我们将描述我们是如何做到的。

考虑该问题时,想到了以下解决方案:
Javascript代码,该代码从google表中接收有关有用链接的信息,并将其发送给Slack。使用cron从时间表中的第一项调用脚本。让我们按顺序开始。

获取Slack的令牌。


这里的一切都很简单,并且在其他文章中已经重复描述过,因此我仅作简要说明。

有两种选择:制作自己的Slack应用程序或使用旧式令牌,第一种选择比较复杂,但是Slack建议使用,第二种选择更简单并且非常适合我们的需求,因为它很简单,所以我们选择它。

我们打开一个链接以生成一个新令牌,并为所需的工作空间创建一个新令牌(不要忘记复制它,该令牌会发出一次)。

图片

将来,当实现与Slack API和Google Sheets交互的代码时,我们将能够将此令牌用于其预期目的。

现在,您需要获取Google表格的令牌。首先,打开适用于Google表格的Node.js快速入门并启用Google Sheets API。然后,我们从示例中复制代码index.js并执行它,执行授权过程并在文件中获取凭据,这些凭据可用于我们的脚本。

脚本实现


现在是时候开始开发脚本,以将消息从Google表格发布到Slack了。单击链接可找到完整的脚本代码

首先,我们将分析将消息发送到松弛通道的代码部分。
这是通过调用Slack REST API发生的。

const post = async (text, channel = <CHANNEL ID>) => {
  const uri = `https://slack.com/api/chat.postMessage?token=${SLACK_AUTH_TOKEN}&channel=${channel}&text=${text}`;
  const result = await fetch(encodeURI(uri), {
    headers: {
      'Content-Type': 'application/json',
    },
    method: 'POST',
    body: JSON.stringify({
      channel,
      text,
      as_user: true
    })
  });

  await result.json();
};

为了在Google API中进行授权,使用了两个函数(authorize,getNewToken),其代码取自Node.js Quickstart,我们将不对其进行详细介绍。

下一个有趣的代码块是获取信息,以从Google电子表格发送信息,这是使用以下功能完成的:

const getMessageAndPost = async (auth, spreadsheetId = <ID  Google >) => {
  const sheets = google.sheets({ version: 'v4', auth });
  sheets.spreadsheets.values.get({
    spreadsheetId,
    range: 'Sheet1!A1:B999',
  }, async (err, res) => {
    if (err) return console.log('The API returned an error: ' + err);
    const rows = res.data.values;
    if (rows.length) {
      // Print columns A and E, which correspond to indices 0 and 4.
      const ix = rows.findIndex(r => !r[1]);
      await post(rows[ix][0]);
      sheets.spreadsheets.values.update({
        spreadsheetId: '18VzilQTEDGXBnaH1f_k-uAfa8Mb470gx32Phir6xQT4',
        range: `Sheet1!B${ix + 1}`,
        valueInputOption: 'RAW',
        requestBody: {
          range: `Sheet1!B${ix + 1}`,
          values: [['x']]
        }

      })
    } else {
      console.log('No data found.');
    }
  });
};

脚本与之交互的表具有以下形式:

图片

因此,对于在向Slack发送消息之后,在每个链接旁边,脚本都放置“ x”。因此,要查找您要发送的消息,您应该选择第一行,该行还没有“ x”,接收消息,发送并标记所选行。

我们刚刚分解的脚本非常简单,并且已经在我们的团队中确认了其多年的性能。我们只需要将此脚本部署到服务器并享受使用的乐趣。

为此,在我们公司中,我们在Digital Ocean上使用了常见的Ubuntu VPS(即使是功耗最低的也可以)。

首先,您需要配置执行JavaScript代码的环境,为此,您需要安装node.js(安装指南

之后,配置cron任务以按计划调用脚本:

crontab -e

#### 

24 14 * * 1-5 cd /root/google-sheets-to-slack && node post.js

使用这些设置,每天/周一至周五14:24都会调用/ root /文件夹中的脚本。

设置已经结束,但是细心的读者一定已经注意到脚本中的一些缺陷,例如,如果调用脚本时出现任何错误,我们将一无所知,因为它会“悄然摔倒”,仅此而已。要解决此问题,您可以将错误处理和脚本调用结果的输出添加到同一Google电子表格或日志文件中。

此外,您可以随机发送,而不必在固定时间发送消息,因此我们的消息更像是来自“实时”用户的消息。

我们的一位同事的另一个有趣的想法是创建第二个表,消息将在星期五专门从该表发送,并且会更有趣。

总的来说,我们看到了无数提炼的想法,并且我们将逐步实施它们,但是以现有形式,此脚本很有用。此处

提供可以使用的示例表

感谢您的阅读和使用。

All Articles