如何向此 Slack 机器人添加功能以替换即将消失的“Google 团队活动日历”

Sha*_*ant 6 javascript collaboration calendar google-calendar-api slack-api

背景:在此处阅读 Reddit 主题

\n

Slack 与 Google 日历的集成将于 2023 年 3 月 1 日停止,目前没有替代方案

\n

https://slack.com/help/articles/360047938054-Google-Calendar-for-Team-Events-for-Slack

\n

我能够使用Google Scripts + Slack 的Incoming Web Hooks功能组装一个基本的机器人,但是它缺少一些我无法弄清楚的功能:

\n

其具有的特点:

\n
    \n
  • 每周总结[我在周日晚上设置了事件触发器]
  • \n
\n

它所缺乏的特点:

\n
    \n
  • 在活动前 2 天发布提醒
  • \n
  • 在活动当天的指定时间发布提醒
  • \n
  • 创建或更新活动时收到通知 [活动的标题、时间或地点已更新] 并且仅发布该活动
  • \n
  • Slackbot 将每个事件作为单独的类别发送[目前,它们都是捆绑在一起的]
  • \n
\n

设置步骤:

\n

创建网络钩子

\n
    \n
  1. 在 Slack 中创建传入 Webhook。
  2. \n
  3. 转到 Slack 自定义集成目录 > 搜索 \xe2\x80\x9cIncoming WebHooks\xe2\x80\x9d > 单击 \xe2\x80\x9c 添加配置\xe2\x80\x9d。填写 Slackbot 将发布到的 Slack 频道的详细信息、Slackbot 的描述等(脚本可以覆盖这些字段,只需将 Webhook 命名为您会记住的名称即可。)
  4. \n
  5. 复制并保存 webhook url 以供稍后使用。
  6. \n
\n

然后在此处创建一个 Google 脚本

\n
    \n
  1. 点击“服务”并添加“AdSense”和“日历”服务
  2. \n
\n

现在,复制以下代码并为 WebhookURL 变量添加自定义 Webhook

\n
// Resources https://www.kutil.org/2016/02/integrate-google-apps-and-slack-with.html\n// Slack messages formatting reference https://app.slack.com/block-kit-builder/T0247NYLG9Y\n\n// This is the code for updating the vacations channel with upcoming PTO\n\nfunction UpcomingPTO() {\n\n  var WebhookURL = "https://hooks.slack.com/services/XXX/YYYY/ZZZZZZZ";\n  \n// Define PTO Calendar ID variables \n  var PTOCal = \'PTO@group.calendar.google.com\'\n  var cal = CalendarApp.getCalendarById(PTOCal);\n\n// Sets how far in the future to look for events and get the color of the calendar\n  var StartTime = new Date();\n  var EndTime = new Date(StartTime.getTime() + 7776000000); //90 days from today\n  var color = cal.getColor(); \n\n  var events = cal.getEvents(StartTime, EndTime);\n\n  var EventTitles = [];\n      for (var i= 0; i < events.length; i++) {\n          \n          var NextEvent = [];\n          NextEvent.push(events[i].getTitle())\n          \n          var NextEventStartDate = [];\n          NextEventStartDate.push(events[i].getStartTime())\n          \n          var NextEventEndDate = [];\n          NextEventEndDate.push(events[i].getEndTime())\n\n          var StartDate = new Date(NextEventStartDate).toLocaleDateString(\'en-us\', { weekday: \'short\', month: \'short\', day: \'numeric\' })\n          var EndDate = new Date(NextEventEndDate).toLocaleDateString(\'en-us\', { weekday: \'short\', month: \'short\', day: \'numeric\', year: \'numeric\' })\n          \n          EventTitles.push("\\n\\n *" + NextEvent + "* \\n" + StartDate + " to " + EndDate);\n      }\n\n  var payload = {\n     "channel" : "#1-vacations",          // <-- optional parameter, use if you want to override default channel\n     "username" : "Team PTO",               // <-- optional parameter, use if you want to override default "robot" name \n     "text" : \'There are \' + events.length + \' upcoming PTO events soon\',\n     "icon_emoji": ":palm_tree:",           // <-- optional parameter, use if you want to override default icon, \n     "attachments":[\n      {\n         "color": color,\n         "fields":[\n            {\n               "title": EventTitles,                                                // The title may not contain markup and will be escaped for you\n               "value": String(EventTitles),                                        // Text value of the field. May contain standard message markup and must be escaped as normal and multi-line\n               "short":false                                                        // Optional flag indicating whether the `value` is short enough to be displayed side-by-side with other values\n            }\n         ]\n      }\n    ]\n  }\n  \n  Logger.log(events)\n  Logger.log(NextEvent)\n  Logger.log(EventTitles)\n  sendToSlack_(WebhookURL,payload)\n}\n\n\nfunction sendToSlack_(WebhookURL,payload) {\n   var options =  {\n    "method" : "post",\n    "contentType" : "application/json",\n    "payload" : JSON.stringify(payload)\n  };\n  return UrlFetchApp.fetch(WebhookURL, options)\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Mat*_*her 2

基于 Shant 的实现(顺便说一句,谢谢!),我创建了一个支持每周通知事件创建通知的版本。

  1. 在此处为 Slack 创建传入 Webhook 。
  2. 在此处创建一个新的 Google 脚本。
  3. 将此处的代码复制到您的新 Google 脚本中。
  4. webhookUrl替换、calendarId和的值slackChannel
  5. (可选)为该函数创建基于时间的触发器sendWeeklyEventsSummary()

显示 sendWeeklyEventsSummary 基于时间的触发器配置的图像

  1. (可选)为该函数创建基于事件的触发器onEventUpdated()

显示 onEventUpdated 的基于事件的触发器配置的图像

免责声明:基于事件的触发器将仅回顾 30 秒并发送在此时间段内创建的所有事件。如果您的日历上有很多操作,这可能会导致同一事件收到多个通知。