Невозможно перечислить электронные таблицы с помощью API Google Диска в Java

Я страдал от анти-5-минутного быстрого запуска с API Google Диска, и все это в попытке обновить мое программное использование таблиц Google, чтобы оно соответствовало OAuth2 (да, я знаю, я был отстающим).

Сейчас я нахожусь в том месте, где я просто пытаюсь составить список электронных таблиц, которые у меня есть на Диске, и ничего не получаю — ни данных, ни ошибок. Драйв вроде доволен, а я нет.

Был бы очень признателен за любую помощь...

Вот подробности:

  • Да, у меня есть электронные таблицы (несколько) на моем Google Диске. Когда я вхожу в систему через веб-браузер, я вижу ссылки на них по адресу: https://spreadsheets.google.com/feeds/spreadsheets/private/full

  • Я создал учетные данные Google для установленного приложения. Код для программной загрузки Drive Doc (из «быстрого запуска» Google) работал нормально.

  • Следующий код работает нормально, но утверждает, что у меня нет электронных таблиц. Я в замешательстве, почему.



    import java.io.File;
    import java.net.URL;
    import java.util.ArrayList;
    import java.util.List;

    import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
    import com.google.api.client.http.javanet.NetHttpTransport;
    import com.google.api.client.json.jackson2.JacksonFactory;
    import com.google.api.services.drive.DriveScopes;
    import com.google.gdata.client.spreadsheet.SpreadsheetService;
    import com.google.gdata.data.spreadsheet.SpreadsheetEntry;
    import com.google.gdata.data.spreadsheet.SpreadsheetFeed;

    public class Spread {

      public static void main(String[] args) throws Exception {
        ArrayList scopes = new ArrayList();
        scopes.add(0, DriveScopes.DRIVE);
        scopes.add(1, "https://spreadsheets.google.com/feeds");
        GoogleCredential credential = new GoogleCredential.Builder()
            .setTransport(new NetHttpTransport())
            .setJsonFactory(new JacksonFactory())
            .setServiceAccountId(
                "[email protected]")
            .setServiceAccountPrivateKeyFromP12File(new File("/path/to/my/P12/file"))
            .setServiceAccountScopes(scopes).build();

        credential.refreshToken();

        SpreadsheetService service = new SpreadsheetService("tmp");
        service.setOAuth2Credentials(credential);

        // Define the URL to request. This should never change.
        URL SPREADSHEET_FEED_URL = new URL(
            "https://spreadsheets.google.com/feeds/spreadsheets/private/full");

        // Make a request to the API and get all spreadsheets.
        SpreadsheetFeed feed = service.getFeed(SPREADSHEET_FEED_URL,
            SpreadsheetFeed.class);
        List spreadsheets = feed.getEntries();

        // Iterate through all of the spreadsheets returned
        int i = 0;
        for (SpreadsheetEntry spreadsheet : spreadsheets) {
          ++i;
          System.out.println(spreadsheet.getId());
        }
        System.out.println("Done " + i);   
      }
    }

Конечным результатом выполнения этого кода является «Готово, найдено 0 листов».

Помощь!


person kvista    schedule 27.05.2015    source источник
comment
Решено! Ключевым моментом является предоставление общего доступа к определенным электронным таблицам с адресом электронной почты, используемым в качестве идентификатора учетной записи службы (см. код выше). Имеет смысл в ретроспективе, но больно понять. Я бы подумал, что достаточно поделиться адресом электронной почты человека, создавшего учетные данные; что вам не нужен фактический адрес электронной почты для учетных данных, который в любом случае никогда не используется. Google, я знаю, что это бесплатно, и я должен быть благодарен, но, пожалуйста, упростите это, если вы хотите, чтобы больше разработчиков действительно использовали его (поэтому я предполагаю, что на его создание были потрачены деньги).   -  person kvista    schedule 27.05.2015
comment
Формат service account ID stackoverflow.com/a/36861121/1589444   -  person Ramratan Gupta    schedule 28.09.2017