如何通过脚本触发Google Calendar事件变更对非Google账户的通知
解决脚本更新Google Calendar事件时非Google账户收不到通知的问题
嘿,这个问题我太熟了!你遇到的核心问题是脚本更新日历事件时默认不会主动给非Google账户的参与者发通知,而手动操作时Google会帮你触发这个逻辑——其实只要在调用Calendar API时加一个关键参数就能完全对齐手动操作的通知效果!
核心原理
手动修改日历事件时,Google会弹出选项让你选择通知范围(比如“通知所有参与者”),本质上是后台给Calendar API传递了sendUpdates参数。但脚本调用Calendar.Events.update()或Calendar.Events.patch()时,默认值是none(不通知任何人),且即使设置了部分值,也不会主动覆盖非Google账户的通知逻辑——所以必须显式指定这个参数的值。
sendUpdates参数的可选值有三个,对应手动操作的不同选项:
all:通知所有参与者(包括Google和非Google账户),这就是你要的“手动选择通知所有人”的逻辑externalOnly:仅通知非Google账户的参与者none:不通知任何人(默认值)
具体代码修改方案
1. 完整更新事件(含时间、地点、参与者)并发送全量通知
如果你需要修改事件的时间、地点,同时调整参与者,并给所有人发通知,可以用下面的示例:
function updateEventAndNotifyAll(calendarId, eventId) { // 获取目标事件 var event = Calendar.Events.get(calendarId, eventId); // 示例:修改事件时间 event.start.dateTime = new Date('2024-12-15T10:00:00'); event.end.dateTime = new Date('2024-12-15T11:30:00'); // 示例:修改地点 event.location = '总部3楼多功能厅'; // 示例:更新参与者列表(添加/移除都可以) event.attendees = [ {email: 'internal-user@company.com'}, // Google账户 {email: 'client@external-domain.com'} // 非Google账户 ]; // 关键:调用update时指定sendUpdates为'all' var updatedEvent = Calendar.Events.update( event, calendarId, eventId, {sendUpdates: 'all'} // 这个参数是触发全量通知的核心! ); Logger.log('事件已更新,所有参与者(含非Google账户)已收到通知'); }
2. 针对你现有的sendInvite函数修改
你的sendInvite函数是添加参与者,只需在最后调用更新API时加上sendUpdates参数即可:
function sendInvite(calendarId, eventId, email) { var n = eventId.indexOf("@"); var str = eventId.substring(0, n); var event = Calendar.Events.get(calendarId, str); if (event.attendees) { event.attendees.push({ email: email }); } else { // 如果事件还没有参与者,初始化列表 event.attendees = [{ email: email }]; } // 新增:添加sendUpdates参数,确保新参与者(含非Google账户)收到邀请 Calendar.Events.update(event, calendarId, str, {sendUpdates: 'all'}); }
注意事项
- 权限检查:确保你的脚本已授权
Calendar相关权限(在Google Apps Script编辑器中,运行脚本时会弹出授权请求,选择允许即可) - 有效邮箱:非Google账户的参与者邮箱必须是有效的,否则通知会被退回
- 部分更新可选:如果你只需要修改事件的某一个属性(比如仅添加参与者),可以用
Calendar.Events.patch()替代update(),参数用法完全一致
内容的提问来源于stack exchange,提问作者Stefan van Aalst
相关产品推荐
相关产品推荐

