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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 05:15:00