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

如何用Google Script避免Google Calendar重复日程(关联Google Sheets)

解决Google Sheets同步日历报错与重复条目问题

问题根源

  • 硬编码的B4:D502范围包含大量空行,空时间值传入createEvent会触发参数错误
  • 没有重复事件检测逻辑,重复执行脚本会生成重复日历条目
  • 未处理异常,单个行的错误会直接中断整个同步流程

修改后的完整代码

function onOpen() {
  const ui = SpreadsheetApp.getUi();
  ui.createMenu('Sync to Calendar')
    .addItem('Sync Events', 'scheduleEvents')
    .addToUi();
}

function scheduleEvents() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getActiveSheet();
  SpreadsheetApp.flush();

  // 获取日历ID并校验
  const calendarId = sheet.getRange("P2").getValue();
  if (!calendarId) {
    SpreadsheetApp.getUi().alert("请在P2单元格填写日历ID");
    return;
  }
  const eventCal = CalendarApp.getCalendarById(calendarId);
  if (!eventCal) {
    SpreadsheetApp.getUi().alert("找不到指定日历,请检查ID是否正确");
    return;
  }

  // 获取实际有内容的数据范围(避免遍历空行)
  const lastRow = sheet.getLastRow();
  if (lastRow < 4) {
    SpreadsheetApp.getUi().alert("没有可同步的日程数据");
    return;
  }
  const signups = sheet.getRange(`B4:D${lastRow}`).getValues();

  // 遍历处理每一行数据
  for (let x = 0; x < signups.length; x++) {
    const [startTime, endTime, title] = signups[x];

    // 跳过空行:时间或标题为空则不处理
    if (!startTime || !endTime || !title) continue;

    // 检查是否已有相同事件(按标题+时间范围判断)
    const existingEvents = eventCal.getEvents(startTime, endTime, {search: title});
    if (existingEvents.length > 0) {
      console.log(`跳过重复事件:${title} ${startTime}`);
      continue;
    }

    // 创建事件,加入异常处理避免单个失败中断全部
    try {
      eventCal.createEvent(title, startTime, endTime);
      console.log(`成功创建事件:${title} ${startTime}`);
    } catch (e) {
      console.error(`创建事件失败:${title},错误:${e.message}`);
      SpreadsheetApp.getUi().alert(`创建事件 "${title}" 失败:${e.message}`);
    }
  }

  SpreadsheetApp.getUi().alert("同步完成,可查看控制台日志确认详情");
}

关键改进说明

  • 动态数据范围:通过getLastRow()获取实际有内容的最后一行,彻底避免遍历空行
  • 空行过滤:直接跳过时间或标题为空的无效行,减少无效操作
  • 重复检测:用getEvents()查询指定时间范围内的同名事件,从根源避免重复创建
  • 异常防护:用try-catch包裹事件创建逻辑,单个行出错不会终止整个同步,同时给出明确错误提示
  • 提前校验:先检查日历ID是否存在、日历是否可访问,提前拦截无效配置

内容的提问来源于stack exchange,提问作者Sam Page

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 04:57:20