Таблица дисков 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("[email protected]");
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);
Ошибка, которую я получаю, предполагает, что для учетных данных не предоставлена область видимости.
Access Denied: BigQuery BigQuery: No OAuth token with Google Drive scope was found.
Я что-то пропустил?
Спасибо @GrahamPolley - да, видел этот вопрос раньше, следовал инструкциям, как описано
Я подозреваю, что проблема с ADC - когда я инициализирую учетные данные с помощью ключа json, он работает должным образом:
InputStream inputStream = new ChannelInputStream(inputChannel);
bqCredentials = GoogleCredentials
.fromStream(inputStream)
.createScoped(BQ_SCOPES);
Такой подход не сработал:
GoogleCredentials googleCredentials = AppEngineCredentials.getApplicationDefault().createScoped(SCOPES);
Прежде чем перейти к коду, вы проверили все три шага, как описано здесь? stackoverflow.com/questions/40731823/…