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

付费G Suite谷歌日历与Cliniko日历高频同步问题求助

解决G Suite Google Calendar高频同步Cliniko iCal Feed及重复条目问题

我之前帮不少用户处理过类似的G Suite日历同步需求,针对你遇到的高频同步要求和重复条目问题,咱们一步步来解决:

一、先搞定重复条目问题

重复事件的核心原因几乎都是脚本没基于**唯一事件标识符(UID)**做校验,默认如果只靠标题、时间判断,很容易因为Cliniko iCal里的微小变动(比如描述更新)导致重复创建。你需要修改脚本,让它基于Cliniko事件自带的UID来判断是否已经同步过:

  1. 打开你的G Suite脚本编辑器,找到处理事件创建的代码块,替换成带UID校验的逻辑:
function syncClinikoCalendar() {
  // 替换成你的实际信息
  const clinikoIcalUrl = "你的Cliniko iCal Feed链接";
  const targetCalendarId = "你的G Suite邮箱地址(目标日历ID)";
  
  const targetCal = CalendarApp.getCalendarById(targetCalendarId);
  const icalContent = UrlFetchApp.fetch(clinikoIcalUrl).getContentText();
  const parsedData = ICAL.parse(icalContent);
  const vevents = parsedData[1].filter(item => item[0] === 'vevent');

  vevents.forEach(vevent => {
    const eventDetails = ICAL.parse(vevent[1]);
    // 提取Cliniko事件的唯一UID
    const eventUid = eventDetails.find(item => item[0] === 'uid')[1][0];
    // 检查目标日历中是否已有带该UID标记的事件
    const existingEvents = targetCal.getEventsByTag('cliniko-uid', eventUid);

    if (existingEvents.length === 0) {
      // 这里写创建事件的逻辑(原脚本的创建代码移到这里)
      const newEvent = targetCal.createEvent(/* 原有的标题、时间、描述参数 */);
      // 给新事件打上UID标签,方便后续校验
      newEvent.setTag('cliniko-uid', eventUid);
    } else {
      // 可选:如果需要同步更新已有事件,在这里添加更新逻辑
      const existingEvent = existingEvents[0];
      // 对比事件的时间、标题等信息,有变化则更新
    }
  });
}

提示:如果原脚本没有引入ICAL库,记得先在脚本编辑器的「资源」->「库」里添加ICAL库(项目ID:1Ih53rW7r0NcH_qgXjXJ8E5rT4X7pV8vM),否则解析iCal会报错。

二、设置5分钟间隔的同步触发器

付费版G Suite支持更短的脚本触发间隔,你可以手动配置:

  • 在脚本编辑器左侧点击「触发器」图标
  • 点击「添加触发器」
  • 选择你要运行的同步函数(比如上面的syncClinikoCalendar)
  • 触发类型选「时间驱动」,然后选「分钟计时器」,间隔设为「每5分钟」
  • 保存触发器即可,付费版G Suite默认支持这个频率的触发

三、额外优化建议

  • 清理现有重复条目:可以先手动删除目标日历里的重复事件,或者用这个小脚本批量清理:
function cleanDuplicateEvents() {
  const targetCalendarId = "你的G Suite邮箱地址";
  const targetCal = CalendarApp.getCalendarById(targetCalendarId);
  const allEvents = targetCal.getEvents(new Date('2020-01-01'), new Date('2030-12-31'));
  const seenUids = new Set();

  allEvents.forEach(event => {
    const eventUid = event.getTag('cliniko-uid');
    if (eventUid && seenUids.has(eventUid)) {
      event.deleteEvent();
    } else if (eventUid) {
      seenUids.add(eventUid);
    }
  });
}
  • 验证Cliniko Feed稳定性:偶尔重复也可能是Cliniko的iCal Feed本身返回了重复数据,你可以把Feed链接在浏览器打开,检查里面的UID字段是否每个事件都唯一。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:59:28