使用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
相关产品推荐
相关产品推荐

