如何为自制Slack Bot添加功能以替代即将停用的Google Calendar for Team Events
Slack + Google Calendar 自定义Bot搭建与功能补充需求
背景
Slack的「Google Calendar团队事件」集成将于2023年3月1日停用,目前暂无官方替代方案。我已通过Google Scripts结合Slack传入Webhook搭建了一个简易Bot,但仍有几项核心功能未实现。
已实现功能
- 每周事件汇总(已配置周日晚自动触发)
待实现功能
- 提前2天发送事件提醒
- 事件当天指定时间发送提醒
- 事件创建或更新(标题、时间、地点变更)时,仅推送该事件的通知
- 将每个事件作为独立消息推送(当前为所有事件捆绑推送)
现有Bot搭建步骤
创建Slack传入Webhook
- 在Slack中创建传入Webhook
- 进入Slack自定义集成目录,搜索「Incoming WebHooks」并点击「添加配置」,填写推送目标频道、Bot描述等信息(脚本可覆盖这些配置,只需为Webhook设置易记名称即可)
- 复制并保存生成的Webhook URL备用
创建Google Script
- 打开Google Script平台,点击「服务」,添加「AdSense」和「Calendar」服务
- 复制以下代码,将代码中的
WebhookURL变量替换为你保存的自定义Webhook地址
// Resources https://www.kutil.org/2016/02/integrate-google-apps-and-slack-with.html // Slack messages formatting reference https://app.slack.com/block-kit-builder/T0247NYLG9Y // This is the code for updating the vacations channel with upcoming PTO function UpcomingPTO() { var WebhookURL = "https://hooks.slack.com/services/XXX/YYYY/ZZZZZZZ"; // Define PTO Calendar ID variables var PTOCal = 'PTO@group.calendar.google.com' var cal = CalendarApp.getCalendarById(PTOCal); // Sets how far in the future to look for events and get the color of the calendar var StartTime = new Date(); var EndTime = new Date(StartTime.getTime() + 7776000000); //90 days from today var color = cal.getColor(); var events = cal.getEvents(StartTime, EndTime); var EventTitles = []; for (var i= 0; i < events.length; i++) { var NextEvent = []; NextEvent.push(events[i].getTitle()) var NextEventStartDate = []; NextEventStartDate.push(events[i].getStartTime()) var NextEventEndDate = []; NextEventEndDate.push(events[i].getEndTime()) var StartDate = new Date(NextEventStartDate).toLocaleDateString('en-us', { weekday: 'short', month: 'short', day: 'numeric' }) var EndDate = new Date(NextEventEndDate).toLocaleDateString('en-us', { weekday: 'short', month: 'short', day: 'numeric', year: 'numeric' }) EventTitles.push("\n\n *" + NextEvent + "* \n" + StartDate + " to " + EndDate); } var payload = { "channel" : "#1-vacations", // <-- optional parameter, use if you want to override default channel "username" : "Team PTO", // <-- optional parameter, use if you want to override default "robot" name "text" : 'There are ' + events.length + ' upcoming PTO events soon', "icon_emoji": ":palm_tree:", // <-- optional parameter, use if you want to override default icon, "attachments":[ { "color": color, "fields":[ { "title": EventTitles, // The title may not contain markup and will be escaped for you "value": String(EventTitles), // Text value of the field. May contain standard message markup and must be escaped as normal and multi-line "short":false // Optional flag indicating whether the `value` is short enough to be displayed side-by-side with other values } ] } ] } Logger.log(events) Logger.log(NextEvent) Logger.log(EventTitles) sendToSlack_(WebhookURL,payload) } function sendToSlack_(WebhookURL,payload) { var options = { "method" : "post", "contentType" : "application/json", "payload" : JSON.stringify(payload) }; return UrlFetchApp.fetch(WebhookURL, options) }
内容的提问来源于stack exchange,提问作者Shant
相关产品推荐
相关产品推荐

