在Android中使用API​​ 4按名称查找Google云端硬盘表

时间:2017-04-11 12:12:19

标签: android google-sheets google-spreadsheet-api

我按照下面的“Android快速入门”。

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

效果很好。

但该示例会将spreadsheetId硬编码为现有电子表格。

String spreadsheetId = "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms";

我需要能够找到现有的电子表格,按名称并存储ID (供以后使用)。

我想做这样的事情:

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();
    }
}

提前多多谢谢!

2 个答案:

答案 0 :(得分:5)

使用Sheets API v4看起来无法做到这一点。

但是......看起来可以使用兼容的Google云端硬盘API v3。

注意:关于此解决方案的最佳部分是我可以对两个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方法获取帐户和凭据。 Great example here

则...

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();
        }
    }

然后您可以直接使用Sheets API的ID:

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

答案 1 :(得分:2)

在我看来,您可能会混淆SpreadsheetSheet个对象:

  • Spreadsheet是一个带有ID的文件,可通过https://docs.google.com/spreadsheets/d/ yourSpreadsheetId 等网址访问;它是存储在Google云端硬盘文件夹(如Excel工作簿)中的文档。

  • SheetSpreadsheet中的标签,带有单元格,就像工作簿中的页面一样。它没有ID,也没有直接的URL。 实际上,API v4 reference表示Sheets也有ID,但令人困惑的是,这些只是您在Google Apps脚本中无法访问的参考号,并且无法帮助解决您的问题

因此,您无法直接在电子表格中访问范围,也无法通过ID找到工作表。

与你的回答相似,这就是我的建议:

_浏览您的云端硬盘文件(按mimeType == "application/vnd.google-apps.spreadsheet"过滤)

__对于每个电子表格文件,请浏览其表格(spreadsheet.sheets[]

___对于当前电子表格中的每个工作表,通过查看其名称(sheet.title

来检查它是否是一个。

找到合适的工作表后,您可以获取其中包含的电子表格ID(spreadsheet.spreadsheetId)。

还有一件事:在答案的最底层,你写道 ValueRange response = sheetsService.spreadsheets().values().get(spreadsheetId, "A1:B2").execute(); 如果没有先指定包含范围的工作表,您将无法从电子表格访问单元格范围:因此,您需要"A1:B2"而不是"mySheetTitle!A1:B2"

我希望这可以解决困惑:)