You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 00:45:11