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

如何修改脚本实现多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行开始的行数)。

使用方法:

  1. 修改CALENDAR_CONFIGS数组,添加所有需要处理的日历ID和对应的工作表名称。
  2. 在Google Apps Script编辑器中运行exportAllCalendarsToSheets函数,即可批量导出所有日历数据到对应工作表。

内容的提问来源于stack exchange,提问作者RoosterMagic22

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 00:50:28