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

