在Google Sheets中从多日历获取事件的脚本问题求助
解决多Google日历事件导入Google Sheets的问题
原代码核心问题
- 变量拼写错误:
CALENDER_IDS应为CALENDAR_IDS(单词拼写失误) - 日历名称获取错误:
cal.getName未加括号,实际获取的是函数引用而非日历名称,正确写法是cal.getName() - 变量覆盖:内层循环重新定义
start_time和end_time,覆盖了外层的时间范围参数,导致后续日历的事件查询范围异常 - 写入位置重复:每个日历的事件都从第5行开始写入,会覆盖之前日历的事件数据
- 效率低下:多次调用
getRange()和setValue(),在Google Apps Script中这类操作耗时且易触发配额限制
修正后的代码
// 创建菜单供执行脚本 function onOpen(e) { SpreadsheetApp.getUi() .createMenu('📅 导入Google日历') .addItem('▶️ 执行脚本', 'getEvents') .addToUi(); } // 多日历事件导入核心函数 function getEvents() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheet = ss.getSheetByName("Sheet1"); // 重命名时间变量避免内层覆盖 const dateStart = sheet.getRange("A2").getValue(); const dateEnd = sheet.getRange("B2").getValue(); // 修正拼写错误:CALENDAR_IDS const CALENDAR_IDS = [ "calendar1@group.calendar.google.com", "calendar2@group.calendar.google.com", "calendar3@group.calendar.google.com", "calendar4@group.calendar.google.com", "calendar5@group.calendar.google.com", ]; // 存储所有事件数据的数组 const eventsData = []; // 遍历所有日历ID for (let i = 0; i < CALENDAR_IDS.length; i++) { const cal = CalendarApp.getCalendarById(CALENDAR_IDS[i]); if (!cal) { Browser.msgBox(`无法访问日历:${CALENDAR_IDS[i]}`); continue; } const calName = cal.getName(); const events = cal.getEvents(new Date(dateStart), new Date(dateEnd)); // 遍历当前日历的事件 for (let j = 0; j < events.length; j++) { const event = events[j]; // 收集单条事件数据,新增日历名称用于区分来源 eventsData.push([ event.getTitle(), event.getStartTime(), event.getEndTime(), event.getDescription(), event.getColor(), event.getLocation(), calName ]); } } // 清空之前的导入数据(从第5行开始,可根据需求调整) if (sheet.getLastRow() >= 5) { sheet.getRange(5, 1, sheet.getLastRow() - 4, 7).clearContent(); } // 批量写入所有数据,提升执行效率 if (eventsData.length > 0) { sheet.getRange(5, 1, eventsData.length, eventsData[0].length).setValues(eventsData); } Browser.msgBox(`共导入 ${eventsData.length} 条事件`); Logger.log("事件已成功添加到表格"); }
关键修改说明
- 变量作用域优化:将外层时间范围变量改为
dateStart和dateEnd,避免被内层事件时间变量覆盖 - 日历名称正确获取:修正
cal.getName()调用方式,同时将日历名称加入输出数据,方便区分事件来源 - 批量写入提升效率:用数组收集所有事件数据,最后通过
setValues()一次性写入,大幅减少API调用次数 - 错误处理:添加日历访问失败的判断,弹出提示避免脚本中断
- 数据清理:写入前清空历史导入数据,避免新旧数据混杂
- 拼写修正:修正
CALENDER_IDS为正确的CALENDAR_IDS
内容的提问来源于stack exchange,提问作者Jim Noredlac
相关产品推荐
相关产品推荐

