如何获取共享Google Calendar中更新事件的操作账户信息
问题详情
前提
我们正在监控团队内部共享的Google Calendar,因此结合「Google Apps Script日历变更触发器」与Google Calendar API,开发了可推送事件创建、更新、删除操作通知的机器人。
问题
目前调用Google Calendar API的Events.get接口仅能获取两类账户信息:事件所有者、事件创建者。
这就导致如果账户A创建了事件后账户B对其进行编辑,当前无法获取账户B的信息。请问是否有包含API或其他服务在内的方案,可获取共享Google Calendar中更新事件的账户信息?
现有代码
function doMain(e) { Logger.log(e); var items = onCalendarEdit(e.calendarId); for (var i = 0; i < items.length; i++) { var Event = Calendar.Events.get(e.calendarId, items[i].id); EventProcessing(Event); } } function onCalendarEdit(CalId) { var calendarId = CalId var summary = Calendar.Calendars.get(calendarId).summary var properties = PropertiesService.getScriptProperties(); var nextSyncToken = properties.getProperty("syncToken_" + summary); var optionalArgs = { syncToken: nextSyncToken }; var events = Calendar.Events.list(calendarId, optionalArgs); Logger.log(JSON.stringify(events)); var nextSyncToken = events["nextSyncToken"]; properties.setProperty("syncToken_" + summary, nextSyncToken); return events.items; } function EventProcessing(Event) { /* bot : Processing to throw a notification */ }
解决方案
方案1:Google Workspace场景(推荐)
使用Google Workspace Admin SDK的审计日志接口,域内所有共享日历的操作都会被全量记录,你可以通过筛选对应日历ID、事件ID的操作记录,直接获取到操作人邮箱、操作类型、操作时间等完整数据,不受Calendar API本身返回字段限制。
实现注意事项:
- 先为你的Apps Script项目开通Admin SDK Reports API服务
- 每次触发日历变更拿到事件ID后,调用该接口拉取该事件最近的操作记录,匹配对应的操作人信息即可
- 需要给执行脚本的账号开通审计日志查看权限
方案2:非Workspace个人共享日历场景
通过给事件新增自定义扩展属性存储操作人信息,你可以在变更触发时,获取当前操作的用户邮箱,写入到事件的共享扩展属性中,后续查询时直接读取该属性即可。
实现注意事项:
- 该方案仅适用于所有编辑日历的用户都有脚本执行权限的场景
- 需要将日历触发器设置为安装型触发器,保证可以正常获取到操作用户身份
代码优化示例
function doMain(e) { Logger.log(e); var items = onCalendarEdit(e.calendarId); // 获取当前操作人邮箱 const operator = Session.getActiveUser().getEmail(); for (var i = 0; i < items.length; i++) { var Event = Calendar.Events.get(e.calendarId, items[i].id); // 将操作人写入事件共享扩展属性,方便后续查询 if (!Event.extendedProperties) Event.extendedProperties = {shared: {}}; Event.extendedProperties.shared.lastModifiedBy = operator; Calendar.Events.update(Event, e.calendarId, items[i].id); // 通知逻辑直接传入操作人参数 EventProcessing(Event, operator); } } function onCalendarEdit(CalId) { var calendarId = CalId var summary = Calendar.Calendars.get(calendarId).summary var properties = PropertiesService.getScriptProperties(); var nextSyncToken = properties.getProperty("syncToken_" + summary); var optionalArgs = { syncToken: nextSyncToken }; var events = Calendar.Events.list(calendarId, optionalArgs); Logger.log(JSON.stringify(events)); var nextSyncToken = events["nextSyncToken"]; properties.setProperty("syncToken_" + summary, nextSyncToken); return events.items; } function EventProcessing(Event, operator) { /* bot : 通知逻辑直接使用operator作为操作人即可 */ }
内容的提问来源于stack exchange,提问作者go600
相关产品推荐
相关产品推荐

