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

使用Google Calendar API创建工作日重复会议失败,寻求技术支持

解决Google Calendar API创建每周一至周五8点重复会议的问题

原代码存在的核心问题

  • 重复规则(RRULE)不符合需求:原代码用FREQ=DAILY;COUNT=2仅会重复2天,无法实现周一到周五的周循环逻辑
  • 事件时间为过去日期(2015年):Google Calendar API会拒绝创建已过期的重复事件
  • 回调与async/await混用:异步逻辑处理不规范,可能导致错误捕获不完整
  • 事件时长设置不合理:原事件持续8小时,未匹配常规会议需求

修正后的代码

const fs = require('fs').promises;
const path = require('path');
const process = require('process');
const { authenticate } = require('@google-cloud/local-auth');
const { google } = require('googleapis');

// 权限范围,若修改需删除token.json
const SCOPES = ['https://www.googleapis.com/auth/calendar'];
const TOKEN_PATH = path.join(process.cwd(), 'token.json');
const CREDENTIALS_PATH = path.join(process.cwd(), 'credentials.json');

async function loadSavedCredentialsIfExist() {
    try {
        const content = await fs.readFile(TOKEN_PATH);
        const credentials = JSON.parse(content);
        return google.auth.fromJSON(credentials);
    } catch (err) {
        return null;
    }
}

async function saveCredentials(client) {
    const content = await fs.readFile(CREDENTIALS_PATH);
    const keys = JSON.parse(content);
    const key = keys.installed || keys.web;
    const payload = JSON.stringify({
        type: 'authorized_user',
        client_id: key.client_id,
        client_secret: key.client_secret,
        refresh_token: client.credentials.refresh_token,
    });
    await fs.writeFile(TOKEN_PATH, payload);
}

async function authorize() {
    let client = await loadSavedCredentialsIfExist();
    if (client) {
        return client;
    }
    client = await authenticate({
        scopes: SCOPES,
        keyfilePath: CREDENTIALS_PATH,
    });
    if (client.credentials) {
        await saveCredentials(client);
    }
    return client;
}

async function createWeekdayMeeting(auth) {
    const calendar = google.calendar({ version: 'v3', auth });
    
    // 自动计算下一个周一作为会议起始日
    const startDate = new Date();
    while (startDate.getDay() !== 1) {
        startDate.setDate(startDate.getDate() + 1);
    }
    
    const event = {
        'summary': '工作日早会',
        'description': '每周一至周五8点的固定会议',
        'start': {
            'dateTime': `${startDate.getFullYear()}-${String(startDate.getMonth()+1).padStart(2, '0')}-${String(startDate.getDate()).padStart(2, '0')}T08:00:00`,
            'timeZone': 'Asia/Shanghai', // 根据你的实际时区调整,比如America/Los_Angeles
        },
        'end': {
            'dateTime': `${startDate.getFullYear()}-${String(startDate.getMonth()+1).padStart(2, '0')}-${String(startDate.getDate()).padStart(2, '0')}T09:00:00`,
            'timeZone': 'Asia/Shanghai',
        },
        // 重复规则:每周一至周五循环,可追加;UNTIL=YYYYMMDD指定结束日期
        'recurrence': [
            'RRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR'
        ],
        'reminders': {
            'useDefault': true,
        },
    };

    try {
        const response = await calendar.events.insert({
            calendarId: 'primary',
            resource: event,
        });
        console.log('会议创建成功:%s', response.data.htmlLink);
    } catch (err) {
        console.error('调用Calendar API出错:', err);
    }
}

authorize().then(createWeekdayMeeting).catch(console.error);

关键修改说明

  1. 修正重复规则:使用RRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR实现每周一到周五重复,如需指定结束日期可追加;UNTIL=YYYYMMDD(例如UNTIL=20241231)
  2. 设置有效起始日期:自动计算下一个周一作为会议起始日,避免使用过去日期被API拒绝
  3. 统一异步处理:改用async/await替代回调函数,错误捕获更可靠
  4. 调整时区和时长:根据实际需求修改时区,将会议时长设为1小时,符合常规场景
  5. 简化事件配置:移除不必要的参会者和自定义提醒,保留核心功能,可根据需要添加

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 05:07:24