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

如何用GScript提取GCalendar重复事件初始条目并修正脚本错误?

修正后的Google Apps Script:提取重复日历事件初始条目

你的脚本存在几个关键问题,导致无法正确获取重复事件的初始条目和间隔信息,以下是问题说明和修正后的代码:

原脚本的错误点

  • 日历ID获取错误:CalendarApp.getId() 不是有效的方法,要获取默认日历ID应该用 CalendarApp.getDefaultCalendar().getId(),或者直接调用默认日历对象。
  • 日期参数错误:new Date(1901-01-01) 会被解析为数字运算(1901-1-1=1899),正确写法是传入字符串 new Date('1901-01-01')。
  • 重复事件实例重复获取:getEvents() 会返回所有重复事件的实例,而你需要的是重复事件的初始母系列,应该用 getEventSeries() 来筛选。
  • 重复间隔获取错误:event.isRecurringEvent() 返回布尔值,无法获取间隔信息,要通过 getRecurrenceRule() 获取重复规则,再提取间隔类型和时长。
  • 未写入间隔信息:原脚本没有将间隔数据写入表格,不符合需求。

修正后的脚本

function extractRecurringEvents() {
  // 获取默认日历
  var calendar = CalendarApp.getDefaultCalendar();
  // 获取指定时间范围内的所有事件
  var events = calendar.getEvents(new Date('1901-01-01'), new Date('2099-12-31'));
  
  // 创建新表格并设置表头
  var spreadsheet = SpreadsheetApp.create('RecurringCalendarEvents');
  var sheet = spreadsheet.getSheets()[0];
  sheet.appendRow(['主题', '开始时间', '结束时间', '重复间隔']);

  // 用于存储已处理的重复事件系列ID,避免重复写入
  var processedSeriesIds = [];

  for (var i = 0; i < events.length; i++) {
    var event = events[i];
    // 判断是否为重复事件
    if (event.isRecurringEvent()) {
      var eventSeries = event.getEventSeries();
      var seriesId = eventSeries.getId();
      
      // 仅处理未记录过的重复事件系列
      if (!processedSeriesIds.includes(seriesId)) {
        processedSeriesIds.push(seriesId);
        
        // 获取事件初始信息
        var title = eventSeries.getTitle();
        var startTime = eventSeries.getStartTime();
        var endTime = eventSeries.getEndTime();
        // 获取重复规则并解析间隔
        var recurrenceRule = eventSeries.getRecurrenceRule();
        var interval = recurrenceRule.getInterval();
        var frequency = recurrenceRule.getFrequency();
        
        // 格式化重复间隔文本
        var intervalText = '';
        switch(frequency) {
          case CalendarApp.RecurrenceFrequency.DAILY:
            intervalText = interval + ' 天';
            break;
          case CalendarApp.RecurrenceFrequency.WEEKLY:
            intervalText = interval + ' 周';
            break;
          case CalendarApp.RecurrenceFrequency.MONTHLY:
            intervalText = interval + ' 月';
            break;
          case CalendarApp.RecurrenceFrequency.YEARLY:
            intervalText = interval + ' 年';
            break;
          default:
            intervalText = '未知间隔';
        }
        
        // 写入表格
        sheet.appendRow([title, startTime, endTime, intervalText]);
      }
    }
  }

  Logger.log('表格已创建:' + spreadsheet.getUrl());
}

关键改进说明

  • 使用processedSeriesIds数组记录已处理的重复事件系列ID,确保每个重复事件只写入一次初始条目。
  • 通过getEventSeries()获取重复事件的母系列,直接获取初始的开始/结束时间和重复规则。
  • 解析RecurrenceRule的频率和间隔,将其格式化为易读的文本(如"2周"、"1月")。
  • 修正了日历和日期参数的错误调用方式。

内容的提问来源于stack exchange,提问作者J. Doe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 07:23:16