Найти личный лист Google по имени с помощью API 4 в Android

Я последовал за «быстрым стартом Android» ниже.

https://developers.google.com/sheets/api/quickstart/android

Прекрасно работает.

Но образец жестко кодирует электронную таблицу в существующую таблицу.

String spreadsheetId = "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms"; 

Мне нужно найти существующую таблицу, по имени и сохранить идентификатор (для последующего использования).

Я хотел бы сделать что-то вроде этого:

 private com.google.api.services.sheets.v4.Sheets sheetsService = null; HttpTransport transport = AndroidHttp.newCompatibleTransport(); JsonFactory jsonFactory = JacksonFactory.getDefaultInstance(); sheetsService = new com.google.api.services.sheets.v4.Sheets.Builder( transport, jsonFactory, credential) .setApplicationName("My Application Name") .build(); String spreadsheetId = null; List<Spreadsheet> allSpreadsheets = sheetsService.spreadsheets().getAListOfAllSpreadsheets; for (Spreadsheet spreadsheet : allSpreadsheets) { if (spreadsheet.getName().equals("My Sheet")){ // found! spreadsheetId = spreadsheet.getId(); } } 

Большое спасибо заранее!

Solutions Collecting From Web of "Найти личный лист Google по имени с помощью API 4 в Android"

Мне кажется, что вы запутаны в Spreadsheet и Sheet :

  • Spreadsheet – это файл с идентификатором, доступный по URL-адресу, например https://docs.google.com/spreadsheets/d/ yourSpreadsheetId ; Это документ, хранящийся в папке Google Диска (например, в книге Excel).

  • Sheet – это вкладка в Spreadsheet с ячейками, как страница в вашей книге. У него нет идентификатора и нет прямого URL-адреса. Ну, на самом деле ссылка API v4 указывает на то, что в Sheets также есть идентификаторы, но достаточно смутно это просто ссылочные номера, которые вы даже не можете получить в скрипте Google Apps, и не помогли бы вам в вашей проблеме .

Таким образом, вы не можете получить доступ к диапазону непосредственно в электронной таблице, а также не можете найти лист по идентификатору.

Точно так же, как и ваш ответ, вот что я хотел бы предложить:

_ Просмотр файлов вашего диска (фильтр по mimeType == "application/vnd.google-apps.spreadsheet" )

__Для каждого файла таблицы найдите свои листы ( spreadsheet.sheets[] )

___ Для каждого Листа в текущей Таблице, проверьте, является ли это тем, посмотрев его имя ( sheet.title )

Как только вы найдете правильный лист, вы можете получить его идентификатор spreadsheet.spreadsheetId ( spreadsheet.spreadsheetId ).

Еще одна вещь: в нижней части вашего ответа вы написали ValueRange response = sheetsService.spreadsheets().values().get(spreadsheetId, "A1:B2").execute(); Вы не сможете получить доступ к диапазону ячеек из электронной таблицы, не указав сначала листинг, содержащий диапазон: вместо "A1:B2" вам понадобится "mySheetTitle!A1:B2" .

Надеюсь, это расчищает путаницу 🙂

Похоже, это не может быть сделано с помощью API-интерфейсов таблиц v4.

Однако … похоже, что это можно сделать с помощью совместимого API Google Диска v3.

Примечание. Лучшая часть этого решения заключалась в том, что я мог бы использовать тот же метод аутентификации и сбора учетных данных для обоих API. Например, как только у меня появился код для получения учетных данных, я мог бы использовать его для обоих API взаимозаменяемо и последовательно.

Вот что я сделал:

Добавлено это в мой build.gradle (показано ниже в моей декларации API-интерфейсов)

 compile('com.google.apis:google-api-services-sheets:v4-rev468-1.22.0') { exclude group: 'org.apache.httpcomponents' } compile('com.google.apis:google-api-services-drive:v3-rev69-1.22.0') { exclude group: 'org.apache.httpcomponents' } 

Я уже использовал метод EasyPermissions для получения учетной записи и учетных данных. Отличный пример здесь .

Затем…

 import com.google.api.services.drive.Drive; import com.google.api.services.sheets.v4.Sheets; 

 private static final String[] SCOPES = { SheetsScopes.SPREADSHEETS, DriveScopes.DRIVE_METADATA_READONLY }; 

 credentials = GoogleAccountCredential.usingOAuth2(getApplicationContext(), Arrays.asList(SCOPES)); 

 protected Drive driveService = new Drive.Builder(transport, jsonFactory, credential) .setApplicationName("My Application Name") .build(); protected Sheets sheetsService = new Sheets.Builder(transport, jsonFactory, credential) .setApplicationName("My Application Name") .build(); 

… async:

  Drive.Files.List request = driveService.files().list() .setPageSize(10) // Available Query parameters here: //https://developers.google.com/drive/v3/web/search-parameters .setQ("mimeType = 'application/vnd.google-apps.spreadsheet' and name contains 'smith' and trashed = false") .setFields("nextPageToken, files(id, name)"); FileList result = request.execute(); List<File> files = result.getFiles(); String spreadsheetId = null; if (files != null) { for (File file : files) { // More code here to discriminate best result, if you want spreadsheetId = file.getId(); } } 

Затем вы можете напрямую использовать идентификатор для API-интерфейсов:

  ValueRange response = sheetsService.spreadsheets().values().get(spreadsheetId, "A1:B2").execute(); List<List<Object>> values = response.getValues();