当服务帐户创建Google表格时,需要获得许可。我怎样才能给予许可?

时间:2017-06-06 16:45:34

标签: permissions google-sheets-api

我正在使用Google Sheet API(V4)。

我有我的Google帐户,例如" test@google.com"。要使用google api,我在Google控制台中创建了一个项目并创建了服务帐户。

我想创建一个只有经过授权的人和我自己创建工作表的Google表格。授权人员可以阅读和编辑。我也不。

但是每当我厌倦了我的代码时,它就会很顺利,我可以获得表格网址。但当我点击他们显示的网址时,我需要一个权限。  这是我创建的网址[https://docs.google.com/spreadsheets/d/1RKR-ErUaC_LujUUDf8o_yIprEz223U1EltJ7zYPo7us/edit]

我认为问题是我正在使用OAuth的服务帐户。我需要用这个。

所以..我想创建谷歌表并允许阅读和编辑我选择的人。

请帮帮我......!

 /**
 * Application name.
 */
private static final String APPLICATION_NAME = "Google Sheets API Java";

/**
 * Global instance of the JSON factory.
 */
private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
/**
 * Global instance of the HTTP transport.
 */
private static HttpTransport HTTP_TRANSPORT;

/**
 * Global instance of the scopes required by this quickstart.
 * <p>
 * If modifying these scopes, delete your previously saved credentials
 * at ~/.credentials/sheets.googleapis.com-java-quickstart
 */
private static final List<String> SCOPES = Arrays.asList(SheetsScopes.SPREADSHEETS);

static {
    try {
        HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
    } catch (Throwable t) {
        t.printStackTrace();
        System.exit(1);
    }
}

/**
 * Creates an authorized Credential object.
 *
 * @return an authorized Credential object.
 * @throws IOException
 */
public Credential authorize() throws IOException {
    // Load client secrets.
    InputStream in = GoogleSheetConfig.class.getResourceAsStream("/My Service Account Information.json");
    GoogleCredential credential = GoogleCredential
            .fromStream(in)
            .createScoped(SCOPES);
    return credential;
}

/**
 * Build and return an authorized Sheets API client service.
 *
 * @return an authorized Sheets API client service
 * @throws IOException
 */
@Bean
public Sheets getSheetsService() throws Exception {
    Credential credential = authorize();
    return new Sheets.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
            .setApplicationName(APPLICATION_NAME)
            .build();
}

我的服务帐户信息如下:

{
"type": "service_account",
"project_id": "my project id ",
"private_key_id": "fb925c0954********",
"private_key": 
"client_email": "test-service-accoun@admin-auth-
test.iam.gserviceaccount.com",
"client_id": "my client id",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://accounts.google.com/o/oauth2/token",
"auth_provider_x509_cert_url": 
"https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": 
"https://www.googleapis.com/robot/v1/metadata/x509/admin-auth-test-
service-accoun%40admin-auth-test.iam.gserviceaccount.com"
}

以下是我创建工作表的测试代码:

Spreadsheet requestBody = new Spreadsheet();

Sheets.Spreadsheets.Create request = sheets.spreadsheets().create(requestBody);

Spreadsheet response = request.execute();
System.out.println(response);

2 个答案:

答案 0 :(得分:1)

您是对的,因为您使用的是服务帐户,因此该帐户只能访问该文件。正如此tutorial关于服务帐户所述:

  

使用service account访问Google Drive API非常有用,但请务必记住服务帐户不是您。如果您希望能够访问上传的文件,则必须通过服务帐户授予自己访问权限的权限。

向自己添加对文件的权限:

  1. 使用Drive API
  2. 使用Permissions: updatePermissions: create
  3. 我建议您使用Drive API创建工作表,以便在工作表创建中添加权限。然后使用Sheets API编辑内容。

    希望这会有所帮助。

答案 1 :(得分:0)

您还可以在个人Google云端硬盘帐户(不是Google Cloud项目/服务帐户的帐户)中创建Google表格,并与您的服务帐户(即Google Cloud项目(如以及其他帐户(如果您愿意)。

您可以从Google控制台下载服务帐户文件中的“ client_email”属性。这就是您的服务帐户的电子邮件地址。

您可以在Google云端硬盘网络界面中使用该电子邮件地址,与您的服务帐户和/或其他人的Google帐户共享对文件夹或文件的访问权限。