Google Sheets同步Calendar脚本优化:自动同步、增删改适配、多重复规则支持
Google Sheets 同步 Google 日历优化方案
前置配置
- 在
Events工作表新增3列,列对应关系如下:- L列(第12列,索引12):命名为
recurrence_type,填写重复规则,可选值为「每周/双周/3周/月度」 - U列(第21列,索引20):命名为
calendar_event_id,用于存储同步后返回的日历事件唯一ID,无需手动填写 - V列(第22列,索引21):命名为
sync_status,手动标记事件状态,可选值为「待同步/待更新/待删除」
- L列(第12列,索引12):命名为
完整优化脚本
// 替换为你自己的日历ID const CALENDAR_ID = ""; const calendar = CalendarApp.getCalendarById(CALENDAR_ID); // 核心同步入口函数 function syncAllEvents() { const sheet = SpreadsheetApp.getActive().getSheetByName('Events'); const allRows = sheet.getDataRange().getValues(); // 跳过表头行 for (let i = 1; i < allRows.length; i++) { const row = allRows[i]; const eventData = { name: row[1], startTime: row[18], endTime: row[19], termEnd: row[11], recurrenceType: row[12], eventId: row[20], syncStatus: row[21] }; // 跳过无同步标记的行 if (!eventData.syncStatus) continue; try { switch(eventData.syncStatus.trim()) { case '待同步': const newEvent = createEventSeries(eventData); // 回写同步状态和事件ID sheet.getRange(i + 1, 22).setValue('已同步'); sheet.getRange(i + 1, 21).setValue(newEvent.getId()); break; case '待更新': // 删除旧事件后创建新事件 if (eventData.eventId) { const oldEvent = calendar.getEventSeriesById(eventData.eventId); oldEvent.deleteEventSeries(); } const updatedEvent = createEventSeries(eventData); sheet.getRange(i + 1, 22).setValue('已同步'); sheet.getRange(i + 1, 21).setValue(updatedEvent.getId()); break; case '待删除': // 删除对应日历事件 if (eventData.eventId) { const delEvent = calendar.getEventSeriesById(eventData.eventId); delEvent.deleteEventSeries(); } sheet.getRange(i + 1, 22).setValue('已删除'); sheet.getRange(i + 1, 21).setValue(''); break; } // 清空错误信息列(可选) sheet.getRange(i + 1, 23).setValue(''); } catch (err) { // 回写错误信息方便排查 sheet.getRange(i + 1, 23).setValue(`同步失败:${err.message}`); } } } // 创建重复事件系列工具函数 function createEventSeries(e) { const recurrence = CalendarApp.newRecurrence(); // 适配不同重复规则 switch(e.recurrenceType?.trim() || '每周') { case '每周': recurrence.addWeeklyRule().interval(1).until(new Date(e.termEnd)); break; case '双周': recurrence.addWeeklyRule().interval(2).until(new Date(e.termEnd)); break; case '3周': recurrence.addWeeklyRule().interval(3).until(new Date(e.termEnd)); break; case '月度': recurrence.addMonthlyRule().interval(1).until(new Date(e.termEnd)); break; } return calendar.createEventSeries(e.name, e.startTime, e.endTime, recurrence); }
触发规则配置
每日固定时段同步
打开Google Apps Script编辑器,点击左侧「触发」选项,新建触发:
- 选择要运行的函数:
syncAllEvents - 选择事件源:
时间驱动 - 选择类型:
日定时器 - 选择你需要的同步时段,保存即可。
可选即时同步
如果需要修改表格后立刻触发同步,可新增另一个触发:
- 选择要运行的函数:
syncAllEvents - 选择事件源:
电子表格 - 选择事件类型:
编辑时 - 保存后每次修改表格内容都会自动触发同步。
功能说明
- 防重复创建:所有同步成功的事件都会存储唯一ID,只有标记为待同步的新事件才会被创建,不会重复生成无效事件。
- 编辑删除同步:已同步的事件需要修改时,直接修改表格内容后将
sync_status改为「待更新」即可;需要删除的事件将sync_status改为「待删除」即可,下次同步会自动更新/删除对应日历事件。 - 多重复规则适配:支持每周、双周、3周、月度四种重复周期,只需在
recurrence_type列填写对应规则即可,未填写默认按每周处理。
内容的提问来源于stack exchange,提问作者James Stewart
相关产品推荐
相关产品推荐

