如何修改脚本实现多Google Calendar数据导出至对应Google Sheet
多日历批量导出到对应工作表的脚本修改方案
要实现多日历批量处理,核心思路是将单个日历的处理逻辑封装为可复用函数,通过配置数组管理所有日历与工作表的对应关系,再由主函数循环执行批量处理。修改后的脚本无需复制多个版本,一次运行即可完成所有日历的数据导出。
修改后的完整代码:
// 配置:每个日历ID对应目标工作表名称 const CALENDAR_CONFIGS = [ { calendarId: "员工A邮箱@xxx.com", sheetName: "员工A日程表" }, { calendarId: "员工B邮箱@xxx.com", sheetName: "员工B日程表" }, // 可继续添加更多日历配置 ]; // 主函数:批量处理所有日历 function exportAllCalendarsToSheets() { // 遍历配置数组,逐个处理日历 CALENDAR_CONFIGS.forEach(config => { try { processSingleCalendar(config.calendarId, config.sheetName); console.log(`已成功导出日历 ${config.calendarId} 到工作表 ${config.sheetName}`); } catch (error) { console.error(`处理日历 ${config.calendarId} 时出错:${error.message}`); } }); } // 单个日历处理逻辑:封装原脚本的核心功能 function processSingleCalendar(calendarId, sheetName) { const cal = CalendarApp.getCalendarById(calendarId); if (!cal) { throw new Error(`无法找到ID为 ${calendarId} 的日历`); } // 事件时间范围:可根据需求修改 const events = cal.getEvents(new Date("July 01, 2022 00:00:00 UTC"), new Date()); const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName); if (!sheet) { throw new Error(`无法找到名为 ${sheetName} 的工作表`); } sheet.clearContents(); const calColor = cal.getColor(); const colors = Calendar.Colors.get().calendar; const header = ["日历地址", "事件标题", "事件描述", "事件地点", "开始时间", "结束时间", "计算时长", "可见性", "创建日期", "最后更新", "我的状态", "创建者", "全天事件", "重复事件", "颜色"]; const offset = 6; const { v, c } = events.reverse().reduce((o, e, i) => { const color = e.getColor(); const row = offset + i + 1; const bgColor = colors[color] ? colors[color].background : calColor; const durationFormula = `=(HOUR(F${row})+(MINUTE(F${row})/60))-(HOUR(E${row})+(MINUTE(E${row})/60))`; o.v.push([ calendarId, e.getTitle(), e.getDescription(), e.getLocation(), e.getStartTime(), e.getEndTime(), durationFormula, String(e.getVisibility()), e.getDateCreated(), e.getLastUpdated(), e.getMyStatus(), e.getCreators(), e.isAllDayEvent(), e.isRecurringEvent(), bgColor ]); o.c.push([bgColor]); return o; }, { v: [], c: [] }); const values = [header, ...v]; sheet.getRange(6, 1, values.length, values[0].length).setValues(values); sheet.getRange(7, 7, v.length).setNumberFormat('.00'); // 修正原脚本的长度计算错误 sheet.getRange(7, 15, c.length).setBackgrounds(c); }
关键改动说明:
- 配置化管理:新增
CALENDAR_CONFIGS数组,集中存储所有日历ID与对应工作表的映射关系,后续新增/修改日历只需调整这个数组,无需改动核心逻辑。 - 逻辑封装:将原脚本的核心处理逻辑提取为
processSingleCalendar函数,实现代码复用,避免重复编写相同逻辑。 - 错误处理:添加
try-catch捕获单个日历处理时的异常,确保某一个日历处理失败不会导致整个批量任务中断,同时在控制台输出错误信息便于排查。 - 细节修正:修复原脚本中
sheet.getRange(7, 7, v.length - 1)的长度计算错误(应该是v.length而非v.length -1,因为v是所有事件的数组,对应从第7行开始的行数)。
使用方法:
- 修改
CALENDAR_CONFIGS数组,添加所有需要处理的日历ID和对应的工作表名称。 - 在Google Apps Script编辑器中运行
exportAllCalendarsToSheets函数,即可批量导出所有日历数据到对应工作表。
内容的提问来源于stack exchange,提问作者RoosterMagic22
相关产品推荐
相关产品推荐

