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

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,手动标记事件状态,可选值为「待同步/待更新/待删除」

完整优化脚本

// 替换为你自己的日历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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 21:45:03