如何使用服务帐户在其他用户文件夹中搜索文件/打开/创建googlesheet?

时间:2017-09-26 15:33:18

标签: java selenium google-drive-api google-sheets-api

以下是该方案。我有一个帐户,我保留测试结果电子表格。我有一个服务帐户,我用它以编程方式(使用java和google驱动器apiv3)添加/更新这些电子表格。我需要一种方法来创建电子表格,并从服务帐户中搜索该用户帐户和文件夹中的电子表格。我有以下代码获取文件列表,但它是服务帐户文件夹中的文件,而不是用户帐户文件夹。有什么帮助吗?

private static boolean findSpreadsheetFile(String sSpreadsheetName)
                throws GeneralSecurityException, IOException, URISyntaxException
{
    String pageToken = null;
    // Build a new authorized API client service.
    Drive driveService = getDriveService();
    // Print the names and IDs
    do
    {
        FileList result = driveService.files().list()
                        .setPageToken(pageToken)
                        .setFields("nextPageToken, files(id, name)")
                        .execute();
        for (com.google.api.services.drive.model.File file : result.getFiles())
        {
            System.out.printf("Found file: %s (%s)\n", file.getName(), file.getId());
        }
        pageToken = result.getNextPageToken();
    }
    while (pageToken != null);
    return true;
}

public static Drive getDriveService() throws GeneralSecurityException, IOException, URISyntaxException
{
    Credential credential = authorizeDrive();
    return new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential).setApplicationName(APPLICATION_NAME).build();
}

private static GoogleCredential authorizeDrive() throws GeneralSecurityException, IOException, URISyntaxException
{
    JacksonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
    HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
    URL fileUrl = ParseTestResultsEmails.class.getResource(sP12Filename);
    GoogleCredential credential = new GoogleCredential.Builder().setTransport(httpTransport)
                    .setJsonFactory(JSON_FACTORY).setServiceAccountId(sServiceAccountID)
                    .setServiceAccountPrivateKeyFromP12File(new File(fileUrl.toURI()))
                    .setServiceAccountScopes(DRIVE_SCOPES).build();
    return credential;
}

2 个答案:

答案 0 :(得分:1)

根据此documentation,域管理员可以使用OAuth 2.0服务帐户以这种方式委派权限。

  

在企业应用程序中,您可能希望以编程方式访问用户数据,而无需他们进行任何手动授权。在G Suite域中,域管理员可以向第三方应用程序授予对其用户的全域访问权限。数据 - 这称为域范围的授权。

     

警告:服务帐户只应用于执行授权,其中有效身份是域中单个用户的身份。使用服务帐户作为公共所有者来创建许多共享文档可能会产生严重的性能影响。此外,服务帐户可能无法获得额外的存储配额,也不会充当域的成员。

您可以查看Using OAuth 2.0 for Server to Server Applications文档以获取更多信息。

答案 1 :(得分:0)

似乎无法使用API​​在Google云端硬盘中执行我想要的操作。我最终做的是创建工作表作为"服务帐户",然后将所有权转让给我想要的用户,然后可以将其分享给需要访问的组。这很棒!