You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为自制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

  1. 在Slack中创建传入Webhook
  2. 进入Slack自定义集成目录,搜索「Incoming WebHooks」并点击「添加配置」,填写推送目标频道、Bot描述等信息(脚本可覆盖这些配置,只需为Webhook设置易记名称即可)
  3. 复制并保存生成的Webhook URL备用

创建Google Script

  1. 打开Google Script平台,点击「服务」,添加「AdSense」和「Calendar」服务
  2. 复制以下代码,将代码中的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 19:18:31