Node.js调用Google Calendar使用指定非primary CalendarID报错解决求助
问题排查与修复方案
核心错误原因
- JavaScript 不支持直接通过
.操作符访问包含@、.等特殊字符的对象属性名,你的自定义日历ID包含大量特殊字符,直接写res.data.calendars.xxx@yyy.com属于语法错误,无法正确解析属性,因此返回undefined,调用undefined下的属性就触发了你遇到的类型错误。 - 附加隐藏问题:代码中设置事件时间时错误使用了
getDay()方法,该方法返回的是星期序号(0代表周日,6代表周六),而非当月日期,会导致事件时间计算不符合预期,需要替换为getDate()。
修复后的代码片段
首先把报错位置的代码替换为如下内容:
const calId = 'gd3q30fhkprf0ubsk3pnqkc64k@group.calendar.google.com' // 用方括号语法访问带特殊字符的属性 const eventsArray = res.data.calendars[calId].busy
同时修正时间计算的代码:
const eventStartTime = new Date() // 替换getDay为getDate eventStartTime.setDate(eventStartTime.getDate() + 2) const eventEndTime = new Date() eventEndTime.setDate(eventEndTime.getDate() + 2) eventEndTime.setMinutes(eventEndTime.getMinutes() + 45)
完整可运行修正代码
const { google } = require('googleapis'); const { OAuth2 } = google.auth; const oAuth2Client = new OAuth2( 'id_works_with_primary_calender', 'key_works_with_primary_calender' ) oAuth2Client.setCredentials({ refresh_token: 'works_with_primary', }) const calendar = google.calendar( { version: 'v3', auth: oAuth2Client } ); // 统一提取日历ID,避免重复书写出错 const TARGET_CAL_ID = 'gd3q30fhkprf0ubsk3pnqkc64k@group.calendar.google.com' const eventStartTime = new Date() eventStartTime.setDate(eventStartTime.getDate() + 2) const eventEndTime = new Date() eventEndTime.setDate(eventEndTime.getDate() + 2) eventEndTime.setMinutes(eventEndTime.getMinutes() + 45) const event = { summary: '和David会面', location: '加利福尼亚街295号,旧金山,CA 94111', description: '和David讨论新客户项目,同时沟通其他相关事宜', colorId: 1, start: { dateTime: eventStartTime, timeZone: 'Europe/Zurich', }, end: { dateTime: eventEndTime, timeZone: 'Europe/Zurich', }, } calendar.freebusy.query( { resource: { timeMin: eventStartTime, timeMax: eventEndTime, timeZone: 'Europe/Zurich', items: [ { id: TARGET_CAL_ID } ], }, }, (err, res) => { if (err) return console.error('闲忙查询错误:', err) // 修正属性访问写法 const eventsArray = res.data.calendars[TARGET_CAL_ID].busy if(eventsArray.length === 0) return calendar.events.insert( { calendarId: TARGET_CAL_ID, resource: event, }, err => { if (err) return console.error('日历事件创建错误:' + err) return console.log('事件创建成功:', event) }) return console.log("当前时段已有安排") })
内容的提问来源于stack exchange,提问作者Mats Groeneweg
相关产品推荐
相关产品推荐

