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

在Google Sheets中从多日历获取事件的脚本问题求助

解决多Google日历事件导入Google Sheets的问题

原代码核心问题

  • 变量拼写错误:CALENDER_IDS应为CALENDAR_IDS(单词拼写失误)
  • 日历名称获取错误:cal.getName未加括号,实际获取的是函数引用而非日历名称,正确写法是cal.getName()
  • 变量覆盖:内层循环重新定义start_time和end_time,覆盖了外层的时间范围参数,导致后续日历的事件查询范围异常
  • 写入位置重复:每个日历的事件都从第5行开始写入,会覆盖之前日历的事件数据
  • 效率低下:多次调用getRange()和setValue(),在Google Apps Script中这类操作耗时且易触发配额限制

修正后的代码

// 创建菜单供执行脚本
function onOpen(e) {
  SpreadsheetApp.getUi()
      .createMenu('📅 导入Google日历')
        .addItem('▶️ 执行脚本', 'getEvents')
      .addToUi();
}

// 多日历事件导入核心函数
function getEvents() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName("Sheet1");
  // 重命名时间变量避免内层覆盖
  const dateStart = sheet.getRange("A2").getValue();
  const dateEnd = sheet.getRange("B2").getValue();
  
  // 修正拼写错误:CALENDAR_IDS
  const CALENDAR_IDS = [
    "calendar1@group.calendar.google.com",
    "calendar2@group.calendar.google.com",
    "calendar3@group.calendar.google.com",
    "calendar4@group.calendar.google.com",
    "calendar5@group.calendar.google.com",
  ];

  // 存储所有事件数据的数组
  const eventsData = [];

  // 遍历所有日历ID
  for (let i = 0; i < CALENDAR_IDS.length; i++) {
    const cal = CalendarApp.getCalendarById(CALENDAR_IDS[i]);
    if (!cal) {
      Browser.msgBox(`无法访问日历:${CALENDAR_IDS[i]}`);
      continue;
    }
    const calName = cal.getName();
    const events = cal.getEvents(new Date(dateStart), new Date(dateEnd));

    // 遍历当前日历的事件
    for (let j = 0; j < events.length; j++) {
      const event = events[j];
      // 收集单条事件数据,新增日历名称用于区分来源
      eventsData.push([
        event.getTitle(),
        event.getStartTime(),
        event.getEndTime(),
        event.getDescription(),
        event.getColor(),
        event.getLocation(),
        calName
      ]);
    }
  }

  // 清空之前的导入数据(从第5行开始,可根据需求调整)
  if (sheet.getLastRow() >= 5) {
    sheet.getRange(5, 1, sheet.getLastRow() - 4, 7).clearContent();
  }
  // 批量写入所有数据,提升执行效率
  if (eventsData.length > 0) {
    sheet.getRange(5, 1, eventsData.length, eventsData[0].length).setValues(eventsData);
  }

  Browser.msgBox(`共导入 ${eventsData.length} 条事件`);
  Logger.log("事件已成功添加到表格");
}

关键修改说明

  1. 变量作用域优化:将外层时间范围变量改为dateStart和dateEnd,避免被内层事件时间变量覆盖
  2. 日历名称正确获取:修正cal.getName()调用方式,同时将日历名称加入输出数据,方便区分事件来源
  3. 批量写入提升效率:用数组收集所有事件数据,最后通过setValues()一次性写入,大幅减少API调用次数
  4. 错误处理:添加日历访问失败的判断,弹出提示避免脚本中断
  5. 数据清理:写入前清空历史导入数据,避免新旧数据混杂
  6. 拼写修正:修正CALENDER_IDS为正确的CALENDAR_IDS

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 18:02:47