我用Java编写了一个程序,该程序会生成一个包含VEX团队统计信息的电子表格。我的总体目标是使程序本质上能够生成电子表格并将该工作表的所有权更改为特定的电子邮件。表格功能可以完全正常工作,能够轻松创建和修改电子表格值(使用表格API)。问题是,当我尝试使用Drive API更改文件的所有权时,在运行Drive.permissions().create时收到“权限不足”消息。
在使用API资源管理器并对其进行自我测试时,我能够转让电子表格的所有权,但是我无法在Java中完成。
这是我创建Google凭据的方式:
private void setCredential() throws GeneralSecurityException, IOException {
//Create new transport
HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
//Build authenticated credential
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(jsonFactory)
.setClientSecrets(Constants.GOOGLE_CLIENT_ID,
Constants.GOOGLE_CLIENT_SECRET)
.build();
credential.setAccessToken(this.accessToken)
.setRefreshToken(Constants.GOOGLE_REFRESH_TOKEN);
//Set class field
this.credential = credential;
}
我注意到这里没有任何实际范围(这很奇怪,因为当Sheets API正常工作时此凭据仍然有效),在这里我一直在寻找如何在此处输入适当范围的方法,但没有发现任何问题。我不知道这是我的程序错误的原因,还是其他原因。
这就是我所说的转移所有权的方法:
private void transferOwnership(Drive driveService) throws IOException {
//Print message
System.out.printf("Transferring ownership to %s", this.usrEmail);
//Build request body
Permission body = new Permission()
.setRole("owner")
.setType("user")
.setEmailAddress(this.usrEmail);
//Execute Drive request
Permission permission = driveService.permissions().create(this.spreadsheetId, body)
.setFileId(this.spreadsheetId)
.setEmailMessage("Test - Replace with something")
.setSendNotificationEmail(true)
.setSupportsTeamDrives(true)
.setTransferOwnership(true)
.setUseDomainAdminAccess(false)
.setFields("emailAddress")
.execute();
//Print message
System.out.printf("Ownership successfully transferred to %s", this.usrEmail);
}
这些是我的问题:
编辑:The way I use the APIs explorer to change ownership
编辑2:这就是我获取访问令牌的方式。至于刷新令牌,我使用了Google的Oauth Playground。
public void setAccessToken() throws IOException, GeneralSecurityException{
//Create a token response using refresh token and oauth credentials
this.token_response = new GoogleRefreshTokenRequest(GoogleNetHttpTransport.newTrustedTransport(), JacksonFactory.getDefaultInstance(),
Constants.GOOGLE_REFRESH_TOKEN, Constants.GOOGLE_CLIENT_ID, Constants.GOOGLE_CLIENT_SECRET)
.execute();
//Set the access token
this.accessToken = token_response.getAccessToken();
}