我们喜欢尝试新事物,因此经常与我们的同事共享来自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电子表格或日志文件中。此外,您可以随机发送,而不必在固定时间发送消息,因此我们的消息更像是来自“实时”用户的消息。我们的一位同事的另一个有趣的想法是创建第二个表,消息将在星期五专门从该表发送,并且会更有趣。总的来说,我们看到了无数提炼的想法,并且我们将逐步实施它们,但是以现有形式,此脚本很有用。此处提供了可以使用的示例表。感谢您的阅读和使用。