如何修改脚本实现Google Calendar多日事件增改及修复结束日期问题
Google Apps Script 日历事件同步问题
背景
现有由Tainake协助开发的Google Apps Script,已实现以下功能:
- 根据出勤状态设置Google Calendar中全天事件的颜色
- 通过表单提交数据添加或更新单日全天事件(若已有事件描述变更则自动更新)
需扩展的功能:
- 允许管理人员通过表单为员工安排/修改多日假期事件,无需重复提交表单
- 因表格用于统计,禁止手动修改日历
两种实现方案
方案1
修改脚本支持多日事件的添加与更新,同时保留原单日事件更新功能(特定人员的单日事件描述变更时自动更新),表格D列预留用于填写结束日期。
方案2
修改脚本仅处理E列值为"Yes"的行。已通过公式生成包含日期区间的单独表格,但当前脚本遍历空行导致运行超时。
当前脚本
function updateCal() { var cal = CalendarApp.getCalendarById("CalendarID"); var data = SpreadsheetApp.getActive().getSheetByName("Entries"); const [, ...rows] = data.getDataRange().getValues(); rows.forEach(([eventtitle, eventdescription, eventdate, , color]) => { console.log(eventdate + eventtitle + eventdescription) const eventdate1 = new Date(eventdate) const events = cal.getEventsForDay(eventdate1); if (events.length == 0 || (events.length > 0 && !events.some(e => e.getTitle() == eventtitle) && !events.some(e => e.getDescription() == eventdescription))) { cal.createAllDayEvent(eventtitle, eventdate1, { description: eventdescription }).setColor(CalendarApp.EventColor[color]); } else { events.forEach(e => { if (e.getTitle() == eventtitle && e.getDescription() != eventdescription) { e.setDescription(eventdescription).setColor(CalendarApp.EventColor[color]); } }); } }); }
经@GiselleValladares 修改后的脚本
function updateCal() { var cal = CalendarApp.getCalendarById("CalendarID"); var data = SpreadsheetApp.getActive().getSheetByName("Entries"); const [, ...rows] = data.getDataRange().getValues(); rows.forEach(([eventtitle, eventdescription, eventdate, , color]) => { console.log(eventdate + eventtitle + eventdescription) const eventdate1 = new Date(eventdate); // 新增结束日期变量 // 让用户在表单中填写事件结束的准确日期 // 新增以下变量确保事件添加正确 const millisPerDay = 1000 * 60 * 60 * 24 * 2; const eventEndDate = new Date(eventEnddate.getTime() + millisPerDay); const events = cal.getEventsForDay(eventdate1); if (events.length == 0 || (events.length > 0 && !events.some(e => e.getTitle() == eventtitle) && !events.some(e => e.getDescription() == eventdescription))) { // 添加结束日期参数 cal.createAllDayEvent(eventtitle, eventdate1, eventEndDate,{ description: eventdescription }).setColor(CalendarApp.EventColor.color); } else { events.forEach(e => { if (e.getTitle() == eventtitle && e.getDescription() != eventdescription) { e.setDescription(eventdescription).setColor(CalendarApp.EventColor.color); } }); } }); }
存在的问题
修改后单日事件显示正常,但多日事件结束日期提前1天(例如Don Drysdale的事件应显示5月9日至5月12日,实际显示提前结束)。
内容的提问来源于stack exchange,提问作者Codedabbler
相关产品推荐
相关产品推荐

