是否有某种方法可以为单个Java项目包含多个Google API服务(例如表单和文档)?

是否有某种方法可以为单个Java项目包含多个Google API服务(例如表单和文档)?,java,gradle,google-api,google-oauth,google-api-java-client,Java,Gradle,Google Api,Google Oauth,Google Api Java Client,我第一次将Google的API服务用于一个个人Java项目,涉及从Google工作表中读取数据,并将相关信息写入单独的Google文档 我使用了谷歌的快速入门指南,用于列出的和。当我遵循GoogleSheets指南时,我设法让一切都正常运行,并用我自己的文件进行了测试 但是,在尝试将我新生成的凭证(Google Doc)添加到已创建的credentials.json文件时,尝试为文档设置API似乎会出现问题。我假设这是因为已经为我的工作表文件创建了凭据,因此我不能简单地添加新创建的凭据。我还尝试

我第一次将Google的API服务用于一个个人Java项目,涉及从Google工作表中读取数据,并将相关信息写入单独的Google文档

我使用了谷歌的快速入门指南,用于列出的和。当我遵循GoogleSheets指南时,我设法让一切都正常运行,并用我自己的文件进行了测试

但是,在尝试将我新生成的凭证(Google Doc)添加到已创建的credentials.json文件时,尝试为文档设置API似乎会出现问题。我假设这是因为已经为我的工作表文件创建了凭据,因此我不能简单地添加新创建的凭据。我还尝试通过创建一个名为doccredentials.json的新凭据文件来尝试使用这两个文件,但在尝试再次执行
gradle run
以编译Google Doc API服务时遇到了以下问题:

Exception in thread "main" com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
{
  "code" : 403,
  "errors" : [ {
    "domain" : "global",
    "message" : "Insufficient Permission",
    "reason" : "insufficientPermissions"
  } ],
  "message" : "Request had insufficient authentication scopes.",
  "status" : "PERMISSION_DENIED"
}
我最好的猜测是,该工作表的凭据正在使用,但我不知道如何避免这种情况。我还确保我的
CREDENTIALS\u FILE\u PATH
变量也设置到了正确的位置,因此我非常确定它正在尝试从正确的文件读取

如有任何建议,将不胜感激。谢谢

编辑:这是我的身份验证代码块中的内容。它最初只是为了验证Sheet API而设置的,但是,在仔细检查之后,似乎很可能是由于范围设置不正确。关于如何允许范围同时适用于电子表格和文档,有何建议

private static Credential authorize() throws IOException, GeneralSecurityException {
    InputStream in = InventoryManagerSheet.class.getResourceAsStream("/credentials.json");
    GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JacksonFactory.getDefaultInstance(), new InputStreamReader(in));

    List<String> scopes = Arrays.asList(SheetsScopes.SPREADSHEETS);

    GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(GoogleNetHttpTransport.newTrustedTransport(), JacksonFactory.getDefaultInstance(),
    clientSecrets, scopes).setDataStoreFactory(new FileDataStoreFactory(new java.io.File("tokens"))).setAccessType("offline").build();

    Credential credential = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");

    return credential;
}
private static Credential authorize()引发IOException、GeneralSecurityException{
InputStream in=InventoryManagerSheet.class.getResourceAsStream(“/credentials.json”);
GoogleClientSecrets clientSecrets=GoogleClientSecrets.load(JacksonFactory.getDefaultInstance(),新的InputStreamReader(in));
列表范围=数组.asList(SheetsScopes.SPREADSHEETS);
GoogleAuthorizationCodeFlow=新建GoogleAuthorizationCodeFlow.Builder(GoogleNethTTPtTransport.newTrustedTransport(),JacksonFactory.getDefaultInstance(),
setDataStoreFactory(新的FileDataStoreFactory(新的java.io.File(“令牌”))).setAccessType(“脱机”).build();
Credential Credential=new AuthorizationCodeInstalledApp(流,new LocalServerReceiver())。授权(“用户”);
返回凭证;
}
回答与您的错误信息相关的问题 我写这篇文章时没有看到你的代码,一旦你看到了,我会编辑它,但这可能会有所帮助

“请求的身份验证作用域不足。”

表示当前通过身份验证的用户没有授予您足够的权限来执行您尝试执行的操作

您提到您正在跟踪来自用户的以下范围的请求

private static final List<String> SCOPES = Collections.singletonList(DocsScopes.DOCUMENTS_READONLY);
以下服务将允许您的代码访问Google drive api

Drive service = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
                .setApplicationName(APPLICATION_NAME)
                .build();

给他们起不同的名字。请记住为每个api添加所需的作用域,您可以将它们混合使用。

我可以看看您的身份验证代码和发出此错误消息的请求吗?@DalmTo感谢您的回复,它消除了我在身份验证方面的一些困惑。我在编辑中发布了我的凭证代码块,希望能提供更多的见解。
private static final List<String> SCOPES = Collections.singletonList(DriveScopes.DRIVE);
Docs service = new Docs.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
                .setApplicationName(APPLICATION_NAME)
                .build();
Drive service = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
                .setApplicationName(APPLICATION_NAME)
                .build();