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

Google Calendar API:如何检查日历是否存在指定事件避免重复添加

修复方案

方案1:新增同步标记列(推荐)

这种方案效率最高,不需要重复请求日历接口,也能彻底避免重复创建问题,操作步骤如下:

  • 在你的Google Sheet中新增D列,D4单元格填入同步状态作为表头,后续同步成功的行都会在对应D列标记为「已同步」,下次执行时直接跳过已标记的行
  • 替换为以下代码:
function addItemsToCalendar() {
  var spreadsheet = SpreadsheetApp.getActiveSheet();
  var calendarId = spreadsheet.getRange("B2").getValue();
  var eventCal = CalendarApp.getCalendarById(calendarId);
  // 读取范围扩展到D列,获取同步状态
  var games = spreadsheet.getRange("A5:D8").getValues();

  for (x = 0; x < games.length; x++) {
    var gameDate = games[x][0];
    var awayTeam = games[x][1];
    var homeTeam = games[x][2];
    var syncStatus = games[x][3];
    // 已同步的行直接跳过
    if (syncStatus === "已同步") continue;

    var eventTitle = `${homeTeam} vs. ${awayTeam}`;
    eventCal.createAllDayEvent(eventTitle, gameDate);
    // 同步成功后写入标记,行号计算规则:数据从第5行开始,所以索引x+5
    spreadsheet.getRange(x + 5, 4).setValue("已同步");
  }
}

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu("同步到日历")
    .addItem("同步赛事", "addItemsToCalendar")
    .addToUi();
}

方案2:无需修改表格,同步前校验日历是否存在重复事件

如果你不想改动现有表格结构,可以在创建事件前先查询对应日期的日历事件,核对标题和日期完全一致时就跳过创建:

function addItemsToCalendar() {
  var spreadsheet = SpreadsheetApp.getActiveSheet();
  var calendarId = spreadsheet.getRange("B2").getValue();
  var eventCal = CalendarApp.getCalendarById(calendarId);
  var games = spreadsheet.getRange("A5:C8").getValues();

  for (x = 0; x < games.length; x++) {
    var gameDate = games[x][0];
    var awayTeam = games[x][1];
    var homeTeam = games[x][2];
    var eventTitle = `${homeTeam} vs. ${awayTeam}`;

    // 查询当日所有事件,判断是否有重名的全天事件
    var dayEvents = eventCal.getEventsForDay(gameDate);
    var hasDuplicate = dayEvents.some(event => {
      return event.isAllDayEvent() && event.getTitle() === eventTitle;
    });

    // 无重复才创建新事件
    if (!hasDuplicate) {
      eventCal.createAllDayEvent(eventTitle, gameDate);
    }
  }
}

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu("同步到日历")
    .addItem("同步赛事", "addItemsToCalendar")
    .addToUi();
}

两种方案对比

  • 方案1:适合数据量较大的场景,不会因为后续事件标题修改产生误判,稳定性更高
  • 方案2:无需改动表格,但每次同步都要拉取日历数据,数据量较大时运行速度较慢,若后续表格中赛事名称修改会被判定为新事件重新创建

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 14:06:01