Найдите личный лист 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();
    }
}

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

Ответ 1

Похоже, это не может быть сделано с помощью 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();

Ответ 2

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

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

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

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

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

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

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

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

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

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

Я надеюсь, что это разоблачает путаницу:)