如何修改Google Apps Script实现多日历事件提取至表格
修改后的Google Apps Script代码(提取多日历活动到Google Sheets)
实现的功能
- 遍历Z1:Z25单元格内的所有非空日历邮箱,批量提取对应日历的活动数据
- 收集事件中已接受和待处理状态的参会者(包含组织者),整理为易读的文本格式
- 新增「所属日历」列,明确标记每条事件对应的来源日历
完整代码
function importMultipleCalendarEvents() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheet = ss.getActiveSheet(); // 可替换为指定工作表,如ss.getSheetByName("你的工作表名") // 读取Z1:Z25的日历邮箱,过滤空值 const calendarEmails = sheet.getRange("Z1:Z25").getValues().flat().filter(email => typeof email === 'string' && email.trim() !== ''); if (calendarEmails.length === 0) { SpreadsheetApp.getUi().alert("Z1:Z25范围内未找到有效日历邮箱"); return; } // 清空已有数据(保留表头,假设表头在第1行) sheet.getRange(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn()).clearContent(); const outputData = []; const startDate = new Date(); // 可自定义起始日期,如new Date("2024-01-01") const endDate = new Date(startDate.getTime() + 30 * 24 * 60 * 60 * 1000); // 提取未来30天的事件,可调整 // 遍历每个日历邮箱 calendarEmails.forEach(calendarEmail => { try { const calendar = CalendarApp.getCalendarById(calendarEmail); if (!calendar) { console.log(`无法访问日历:${calendarEmail}`); return; } // 获取日历事件 const events = calendar.getEvents(startDate, endDate); events.forEach(event => { // 收集参会者:组织者 + 已接受/待处理的嘉宾 const organizer = event.getOrganizer().getEmail(); const guests = event.getGuestList().filter(guest => { const status = guest.getGuestStatus(); return status === CalendarApp.GuestStatus.ACCEPTED || status === CalendarApp.GuestStatus.NEEDS_ACTION; }).map(guest => guest.getEmail()); // 合并组织者和嘉宾,去重 const allAttendees = [...new Set([organizer, ...guests])].join(", "); // 整理事件数据 outputData.push([ event.getTitle(), event.getStartTime(), event.getEndTime(), event.getLocation(), event.getDescription(), calendarEmail, // 标注所属日历 allAttendees ]); }); } catch (e) { console.log(`处理日历${calendarEmail}时出错:${e.message}`); } }); // 将数据写入工作表(从第2行第1列开始) if (outputData.length > 0) { sheet.getRange(2, 1, outputData.length, outputData[0].length).setValues(outputData); } }
关键代码说明
- 多日历遍历逻辑:通过
getRange("Z1:Z25").getValues().flat().filter()筛选出有效邮箱,避免空值和无效格式的干扰,确保只处理可访问的日历 - 参会者筛选:先获取事件组织者邮箱,再从嘉宾列表中筛选状态为
ACCEPTED(已接受)或NEEDS_ACTION(待处理)的用户,合并后去重,避免重复显示组织者 - 所属日历标注:在每条事件数据中加入当前遍历的日历邮箱,方便后续区分不同来源的活动
- 异常处理:添加
try-catch块捕获单个日历的访问错误,避免因某一个日历无法访问导致整个脚本终止
内容的提问来源于stack exchange,提问作者GoogleSheetsStudent
相关产品推荐
相关产品推荐

