如何将Amion订阅日历的班次事件导入Google Sheets构建住院医师班次数据库?
解决Google Apps Script读取订阅日历(Amion)事件并导入Google Sheets的问题
我之前也碰到过类似的需求——原生脚本默认只处理用户创建的Google日历,确实没法直接访问订阅的外部日历。下面是一步步帮你解决的方案:
1. 先获取订阅日历的ID
你需要先拿到每位住院医师Amion订阅日历的唯一ID,操作步骤很简单:
- 打开Google Calendar,在左侧侧边栏找到对应的Amion订阅日历
- 点击日历名称旁的三个点 → 设置和共享
- 滚动到「集成日历」区域,复制「日历ID」(一般是一串类似邮箱格式的字符串)
把所有需要处理的订阅日历ID收集起来,存在一个数组里备用。
2. 修改脚本以访问订阅日历
原来的脚本应该只针对默认日历或单个原生日历,现在我们要调整它来遍历所有目标订阅日历,读取事件并导入Sheets。
这里是修改后的核心代码示例:
function importAmionShiftsToSheets() { // 替换成你收集到的Amion订阅日历ID数组 const calendarIds = [ "resident1@example.com", "resident2@example.com", // ... 更多住院医师的日历ID ]; // 设置你需要导入的日期范围(按需调整) const startDate = new Date("2024-01-01"); const endDate = new Date("2024-12-31"); // 目标Google Sheets表格(替换成你的表格ID和工作表名称) const sheet = SpreadsheetApp.openById("YOUR_SPREADSHEET_ID").getSheetByName("Shifts"); // 清空现有数据(可选,根据你的需求决定是否保留历史数据) sheet.clearContents(); // 写入表头 sheet.appendRow(["住院医师", "班次标题", "开始时间", "结束时间", "备注"]); // 遍历每个订阅日历 calendarIds.forEach(calendarId => { try { // 获取订阅日历对象 const calendar = CalendarApp.getCalendarById(calendarId); if (!calendar) { console.log(`无法访问日历ID: ${calendarId},请检查权限或ID是否正确`); return; } // 获取日期范围内的事件,包含重复班次的所有实例 const events = calendar.getEvents(startDate, endDate, {includeRecurrences: true}); // 遍历事件并写入表格 events.forEach(event => { // 提取Amion日历里的关键信息(根据实际事件字段调整) const residentName = calendar.getName(); // 日历名称通常就是住院医师姓名 const title = event.getTitle(); const startTime = event.getStartTime(); const endTime = event.getEndTime(); const description = event.getDescription(); // 写入一行数据 sheet.appendRow([residentName, title, startTime, endTime, description]); }); console.log(`成功导入日历 ${calendar.getName()} 的 ${events.length} 个班次`); } catch (e) { console.log(`处理日历 ${calendarId} 时出错: ${e.message}`); } }); SpreadsheetApp.getUi().alert("班次数据导入完成!"); }
3. 关键注意事项
- 权限授权:第一次运行脚本时,会提示你授权,需要允许脚本访问你的Google Calendar和Google Sheets。要确保你的Google账号有权限查看这些Amion订阅日历(如果是共享过来的,要确认已订阅并能在Calendar里正常查看)。
- Amion事件格式适配:Amion的日历事件可能有特定的标题或描述格式,比如包含班次类型、换班备注等,你可以根据实际需求修改
appendRow里的字段,比如拆分标题里的信息,或者提取描述中的关键内容。 - 重复事件处理:代码里用了
{includeRecurrences: true}参数,会把重复班次的每个实例都导入;如果你只需要重复班次的模板,可以去掉这个参数。 - 性能优化:如果班次数量很多(比如上千条),建议用
setValues()代替多次appendRow(),减少API调用次数,提升速度。比如先把所有数据存在一个二维数组里,最后一次性写入表格。
4. 测试与调试
先选一个小的日期范围(比如一周)运行脚本,检查导入的数据是否正确,确认住院医师姓名、班次时间、标题等信息无误后,再扩大日期范围。如果遇到错误,可以查看脚本编辑器的「日志」(视图 → 日志),里面会显示具体的错误信息,比如日历ID错误、权限不足等。
内容的提问来源于stack exchange,提问作者PirateBill
相关产品推荐
相关产品推荐

