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

无法为会议室资源日历创建事件的技术问题咨询

问题描述

已配置具备Domain-wide delegation权限的Google服务账号,使用Google Calendar APIs管理日历事件。示例代码如下:

InputStream inputstream = null;
try {
    inputstream = new ByteArrayInputStream(this.key);
    Credential cred = new GoogleCredential.Builder().setTransport(new NetHttpTransport())
        .setJsonFactory(new JacksonFactory())
        .setServiceAccountId(cs.getGoogleServiceAccountId())
        .setServiceAccountScopes(Arrays.asList(CalendarScopes.CALENDAR))
        .setServiceAccountUser("c_188d28jockafkhljibdpn05gio6iq@resource.calendar.google.com")
        .setServiceAccountPrivateKey(SecurityUtils.loadPrivateKeyFromKeyStore(SecurityUtils.getPkcs12KeyStore(), 
                                                                                inputstream,"notasecret",
                                                                                "privatekey", "notasecret"))
        .build();
    calendar = new Calendar.Builder(new NetHttpTransport(), new JacksonFactory(), cred).setApplicationName("applicationName").build();
    
    Event e = new Event().setSummary("Test");
    e.setDescription("Test");
    e.setStart(new EventDateTime().setDateTime(new DateTime(new Date().getTime())));
    e.setStart(new EventDateTime().setDateTime(new DateTime(DateUtils.addHours(new Date(), 1).getTime())));
    Event insert = calendar.events().insert("c_188d28jockafkhljibdpn05gio6iq@resource.calendar.google.com", e).setSendNotifications(true).execute();
    logger.info("event created = {}", JsonUtil.getJSONString(insert));
}
finally {
    if(inputstream != null) {
        inputstream.close();
    }
}

尝试为会议室资源日历创建事件时,出现如下异常:

com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request
POST https://oauth2.googleapis.com/token
{
  "error" : "invalid_grant",
  "error_description" : "Invalid email or User ID"
}
    at com.google.api.client.auth.oauth2.TokenResponseException.from(TokenResponseException.java:105)
    at com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:326)
    at com.google.api.client.auth.oauth2.TokenRequest.execute(TokenRequest.java:346)
    at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken(GoogleCredential.java:397)
    at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:494)
    at com.google.api.client.auth.oauth2.Credential.intercept(Credential.java:217)
    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:880)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:541)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:474)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:591)

将资源邮箱ID替换为普通用户邮箱后,可为任意活跃用户日历创建事件且运行正常,请问问题出在哪里?

解决方案
  • 核心问题:setServiceAccountUser参数仅支持指定域内普通用户账号邮箱,不能填入资源日历邮箱。资源日历属于Google Workspace的资源实体,不属于用户账号范畴,服务账号尝试模拟它时会触发invalid_grant错误。
  • 正确操作:移除setServiceAccountUser的调用,直接借助已配置域全权限的服务账号发起请求,在events().insert方法中传入资源日历ID即可完成事件创建。
  • 额外修复:代码中重复调用e.setStart导致事件结束时间未设置,需将第二个setStart改为setEnd,否则事件会因时间参数无效被拒绝。

修改后的核心代码片段:

Credential cred = new GoogleCredential.Builder().setTransport(new NetHttpTransport())
    .setJsonFactory(new JacksonFactory())
    .setServiceAccountId(cs.getGoogleServiceAccountId())
    .setServiceAccountScopes(Arrays.asList(CalendarScopes.CALENDAR))
    // 移除setServiceAccountUser调用
    .setServiceAccountPrivateKey(SecurityUtils.loadPrivateKeyFromKeyStore(SecurityUtils.getPkcs12KeyStore(), 
                                                                            inputstream,"notasecret",
                                                                            "privatekey", "notasecret"))
    .build();

// 修复事件时间设置
Event e = new Event().setSummary("Test");
e.setDescription("Test");
e.setStart(new EventDateTime().setDateTime(new DateTime(new Date().getTime())));
e.setEnd(new EventDateTime().setDateTime(new DateTime(DateUtils.addHours(new Date(), 1).getTime()))); // 改为setEnd
Event insert = calendar.events().insert("c_188d28jockafkhljibdpn05gio6iq@resource.calendar.google.com", e).setSendNotifications(true).execute();

内容的提问来源于stack exchange,提问作者Kushal Chokhani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:18:03