Создание таблицы BigQuery из Google Sheet с использованием Java API - доступ запрещен - PullRequest
0 голосов
/ 06 сентября 2018

Лист диска Google был создан (из XLS) с помощью Drive API - приложением App Engine с учетной записью службы по умолчанию. Недавно созданный документ был разослан частным лицам, и доступ к файлу был подтвержден.

File file = driveService.files().create(fileMetadata, inputStreamContent)
        .setFields("id")
        .execute();
    Logger.info("Created file: %s", file.getId());
    BatchRequest batch = driveService.batch();
    Permission userPermission = new Permission()
        .setType("user")
        .setRole("writer")
        .setEmailAddress("personal.email@gmail.com");
    driveService.permissions().create(file.getId(), userPermission)
        .setFields("id")
        .execute();

Теперь я хотел бы создать таблицу BigQuery из этого Google Sheet. Итак, я получил Drive API, очевидно, для предыдущего шага. Я настроил службу BigQuery для создания учетных данных с необходимой областью действия:

private static final List<String> SCOPES = asList(DriveScopes.DRIVE, 
DriveScopes.DRIVE_READONLY, SheetsScopes.SPREADSHEETS, AUTH, BIGQUERY);
GoogleCredentials googleCredentials = AppEngineCredentials.getApplicationDefault().createScoped(SCOPES); 
BigQueryOptions options = BigQueryOptions.newBuilder().setCredentials(googleCredentials).build(); 
BigQuery bigQuery = options.getService();

Но все равно не повезло, когда я позвонил контроллеру, чтобы проглотить лист с этим кодом:

ExternalTableDefinition tableDefinition = ExternalTableDefinition
        .of(String.format(GOOGLE_DRIVE_LOCATION_FORMAT, fileId), categoryMappingSchema(),
            GoogleSheetsOptions.newBuilder().setSkipLeadingRows(FIRST_ROW).build());
    TableInfo tableInfo = TableInfo.newBuilder(tableId, tableDefinition).build();

    Table table = bigQuery.create(tableInfo);

Ошибка, которую я получаю, предполагает, что область не была предоставлена ​​учетным данным.

Доступ запрещен: BigQuery BigQuery: токен OAuth с областью действия Google Диска не найден.

Я что-то упустил?

1 Ответ

0 голосов
/ 10 сентября 2018

Я подозреваю, что есть проблема с АЦП - когда я инициализирую учетные данные из ключа json, он работает как ожидалось:

InputStream inputStream = new ChannelInputStream(inputChannel);
            bqCredentials = GoogleCredentials
                .fromStream(inputStream)
                .createScoped(BQ_SCOPES);

Этот подход не сработал:

GoogleCredentials googleCredentials = AppEngineCredentials.getApplicationDefault().createScoped(SCOPES); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...