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

使用Google Apps Script根据谷歌表格Cancelled标记删除谷歌日历事件问题

Google Sheet 同步Google Calendar取消事件功能实现

功能调整逻辑

  • 新增取消状态校验:当状态列为Cancelled时,若该行已有对应EventID,直接删除日历中对应事件
  • 新增创建拦截逻辑:只要状态列为Cancelled,无论是否有EventID,都不会创建新的日历事件,符合需求要求
  • 新增异常捕获逻辑:避免EventID无效、日历权限不足等异常导致整个同步脚本中断

完整可运行代码

function onOpen() {  
  var ui = SpreadsheetApp.getUi();  
  ui.createMenu('同步到日历')
  .addItem('立即同步', 'sync')
  .addToUi();
}

function sync() {
  var sheet = SpreadsheetApp.getActive().getSheetByName('Sheet1');
  // 替换为你自己的日历ID
  var calendar = CalendarApp.getCalendarById('myemailid@gmail.com');
  var startRow = 2;  // 跳过表头,从第二行开始处理
  var numRows = sheet.getLastRow();   // 待处理的总行数
  var numColumns = sheet.getLastColumn();
  var dataRange = sheet.getRange(startRow, 1, numRows-1, numColumns);
  var data = dataRange.getValues();

  for (var i = 0; i < data.length; ++i) {
    var row = data[i];
    var name = row[1];  // 客人姓名
    var place = row[4];  // 地址2
    var room = row[9]; // 房间号
    var inDate = new Date(row[10]);  // 入住日期
    var outDate = new Date(row[11]); // 退房日期
    var check1 = row[23];  // 状态列:Booked/Blocked/Cancelled
    var check2 = row[24]; // 事件ID列:创建事件后会回写iCalUID

    // 处理取消逻辑
    if (check1 === 'Cancelled') {
      // 如果已有事件ID,删除对应日历事件
      if (check2 !== "") {
        try {
          var existEvent = calendar.getEventById(check2);
          // 确认事件存在再执行删除
          existEvent && existEvent.deleteEvent();
          // 若需要删除事件后清空ID列可取消下方注释,不影响拦截逻辑
          // sheet.getRange(startRow + i, numColumns).setValue("");
        } catch (err) {
          // 可按需在这里添加错误日志输出逻辑,比如写入表格对应行备注
        }
      }
      // 取消状态直接跳过后续创建逻辑,不会生成新事件
      continue;
    }

    // 原创建逻辑:非取消状态且未生成过事件才执行创建
    if (check2 == "") {
      var currentCell = sheet.getRange(startRow + i, numColumns);
      var event = calendar.createEvent(room, inDate, outDate, {
        description: '预订人: ' + name + ' / ' + place + '\n入住: ' + inDate + '\n退房: ' + outDate
      });
      var eventId = event.getId();
      currentCell.setValue(eventId);
    }
  }
}

使用说明

  • 代码中myemailid@gmail.com请替换为你自己的Google Calendar ID
  • 若你的状态列、事件ID列的索引有调整,对应修改check1 = row[23]、check2 = row[24]的索引值即可(索引从0开始计数)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 07:48:04