sheets sheet read quickstart library google example java oauth google-spreadsheet-api google-api-java-client google-sheets-api

sheet - ¿Cuál es un ejemplo del uso de OAuth 2.0 y la API de hoja de cálculo de Google con Java?



read google sheets java (3)

¿Dónde está el código de ejemplo que muestra cómo usar la Google Data Java Client Library y su compatibilidad con OAuth 2.0 con la Google Spreadsheet API (ahora llamada Google Sheets API )?


La respuesta se movió de la pregunta original al formato de sitio "Q y A".

La Google Data Java Client Library admite OAuth 2.0 . Desafortunadamente, no hay ejemplos completos en la biblioteca que muestren cómo usarlo con la Google Spreadsheet API .

Aquí hay un ejemplo que me ha funcionado. Espero que alguien lo encuentre útil.

import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeRequestUrl; import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeTokenRequest; import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; import com.google.api.client.googleapis.auth.oauth2.GoogleTokenResponse; import com.google.api.client.http.HttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.jackson.JacksonFactory; import com.google.gdata.util.ServiceException; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.List; public class NewClass { // Retrieve the CLIENT_ID and CLIENT_SECRET from an APIs Console project: // https://code.google.com/apis/console static String CLIENT_ID = "your-client-id"; static String CLIENT_SECRET = "your-client-secret"; // Change the REDIRECT_URI value to your registered redirect URI for web // applications. static String REDIRECT_URI = "the-redirect-uri"; // Add other requested scopes. static List<String> SCOPES = Arrays.asList("https://spreadsheets.google.com/feeds"); public static void main (String args[]) throws IOException, ServiceException, com.google.protobuf.ServiceException{ Credential credencial = getCredentials(); JavaApplication20.printDocuments(credencial); } /** * Retrieve OAuth 2.0 credentials. * * @return OAuth 2.0 Credential instance. */ static Credential getCredentials() throws IOException { HttpTransport transport = new NetHttpTransport(); JacksonFactory jsonFactory = new JacksonFactory(); // Step 1: Authorize --> String authorizationUrl = new GoogleAuthorizationCodeRequestUrl(CLIENT_ID, REDIRECT_URI, SCOPES).build(); // Point or redirect your user to the authorizationUrl. System.out.println("Go to the following link in your browser:"); System.out.println(authorizationUrl); // Read the authorization code from the standard input stream. BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); System.out.println("What is the authorization code?"); String code = in.readLine(); // End of Step 1 <-- // Step 2: Exchange --> GoogleTokenResponse response = new GoogleAuthorizationCodeTokenRequest(transport, jsonFactory, CLIENT_ID, CLIENT_SECRET, code, REDIRECT_URI).execute(); // End of Step 2 <-- // Build a new GoogleCredential instance and return it. return new GoogleCredential.Builder().setClientSecrets(CLIENT_ID, CLIENT_SECRET) .setJsonFactory(jsonFactory).setTransport(transport).build() .setAccessToken(response.getAccessToken()).setRefreshToken(response.getRefreshToken()); } // … }

Aquí la otra clase:

import com.google.api.client.auth.oauth2.Credential; import com.google.gdata.client.docs.DocsService; import com.google.gdata.client.spreadsheet.SpreadsheetService; import com.google.gdata.data.docs.DocumentListEntry; import com.google.gdata.data.docs.DocumentListFeed; import com.google.gdata.data.docs.SpreadsheetEntry; import com.google.gdata.data.spreadsheet.CellEntry; import com.google.gdata.data.spreadsheet.CellFeed; import com.google.gdata.data.spreadsheet.SpreadsheetFeed; import com.google.gdata.data.spreadsheet.WorksheetEntry; import com.google.gdata.data.spreadsheet.WorksheetFeed; import com.google.gdata.util.ServiceException; // ... import java.io.IOException; import java.net.URL; import java.util.List; // ... public class JavaApplication20 { // … static void printDocuments(Credential credential) throws IOException, ServiceException { // Instantiate and authorize a new SpreadsheetService object. SpreadsheetService service = new SpreadsheetService("Aplication-name"); service.setOAuth2Credentials(credential); // Send a request to the Documents List API to retrieve document entries. 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<com.google.gdata.data.spreadsheet.SpreadsheetEntry> spreadsheets = feed.getEntries(); if (spreadsheets.isEmpty()) { // TODO: There were no spreadsheets, act accordingly. } com.google.gdata.data.spreadsheet.SpreadsheetEntry spreadsheet = spreadsheets.get(0); System.out.println(spreadsheet.getTitle().getPlainText()); // Get the first worksheet of the first spreadsheet. // TODO: Choose a worksheet more intelligently based on your // app''s needs. WorksheetFeed worksheetFeed = service.getFeed( spreadsheet.getWorksheetFeedUrl(), WorksheetFeed.class); List<WorksheetEntry> worksheets = worksheetFeed.getEntries(); WorksheetEntry worksheet = worksheets.get(0); // Fetch the cell feed of the worksheet. URL cellFeedUrl = worksheet.getCellFeedUrl(); CellFeed cellFeed = service.getFeed(cellFeedUrl, CellFeed.class); // Iterate through each cell, printing its value. for (CellEntry cell : cellFeed.getEntries()) { // Print the cell''s address in A1 notation System.out.print(cell.getTitle().getPlainText() + "/t"); // Print the cell''s address in R1C1 notation System.out.print(cell.getId().substring(cell.getId().lastIndexOf(''/'') + 1) + "/t"); // Print the cell''s formula or text value System.out.print(cell.getCell().getInputValue() + "/t"); // Print the cell''s calculated value if the cell''s value is numeric // Prints empty string if cell''s value is not numeric System.out.print(cell.getCell().getNumericValue() + "/t"); // Print the cell''s displayed value (useful if the cell has a formula) System.out.println(cell.getCell().getValue() + "/t"); } } // ... }


Puedes encontrar una explicación paso a paso con ejemplos here . Como resultado, su código podría verse así:

SpreadsheetService service = new SpreadsheetService("MySpreadsheetIntegration-v1"); service.setProtocolVersion(SpreadsheetService.Versions.V1); // It''s important to specify the version service.setRequestFactory(makeAuthorization()); SpreadsheetQuery q = new SpreadsheetQuery(new URL(DEFAULT_SPREADSHEET_QUERY)); SpreadsheetFeed feed; try { feed = service.query(q, SpreadsheetFeed.class); } catch (AuthenticationException e) { refreshAccessToken(service); feed = service.query(q, SpreadsheetFeed.class); } SpreadsheetEntry spreadsheet = findSpreadSheet(feed); ... // do your stuff ... // a couple of utility methods are used above: private void refreshAccessToken(SpreadsheetService service) throws Exception { String accessToken = callGetAccessTokenApi(); // save access token service.getRequestFactory().setAuthToken(new GoogleAuthTokenFactory.OAuth2Token(new GoogleCredential().setAccessToken(accessToken))); } //private static final String GOOGLE_API_HOST = "https://www.googleapis.com/"; private String callGetAccessTokenApi() throws Exception { HttpClient client = HttpClients.createDefault(); String url = String.format( "%soauth2/v3/token?client_id=%s&client_secret=%s&refresh_token=%s&grant_type=refresh_token", GOOGLE_API_HOST, googleAuthorization.getClientId(), googleAuthorization.getClientSecret(), googleAuthorization.getRefreshToken() ); HttpPost post = new HttpPost(url); post.addHeader(ACCEPT_HEADER_NAME, "application/x-www-form-urlencoded"); try { HttpResponse response = client.execute(post); JSONObject object = readJson(response); return object.getString("access_token"); } finally { post.releaseConnection(); } } private Service.GDataRequestFactory makeAuthorization() { Service.GDataRequestFactory requestFactory = new HttpGDataRequest.Factory(); // load access token requestFactory.setAuthToken(new GoogleAuthTokenFactory.OAuth2Token(new GoogleCredential().setAccessToken(accessToken))); return requestFactory; }


(Diciembre de 2016) Gran parte de esta pregunta y la mayoría de las respuestas están ahora desactualizadas, ya que: 1) Las API de GData son la generación anterior de API de Google. Si bien no todas las API de GData han quedado en desuso, todas las API modernas de Google no utilizan el protocolo de datos de Google ; y 2) Google lanzó una nueva API de Google Sheets v4 (no GData) en 2016. Para utilizar la nueva API, debe obtener la biblioteca de clientes de API de Google para Java y usar la última API de hojas , que es mucho más potente y Flexible que cualquier API anterior.

Aquí está nuestro ejemplo de código de inicio rápido de Java para ayudarlo a seguir usando la API; también contiene el código OAuth2. Además, aquí está la referencia de JavaDocs para el API Sheets que describe todas las clases a su disposición. Si no es "alérgico" a Python, también he creado un video sobre el código de autorización de OAuth y otro par de videos con más ejemplos del "mundo real" utilizando la API de Sheets:

La última API proporciona funciones que no están disponibles en versiones anteriores, es decir, otorga a los desarrolladores acceso programático a una Hoja como si estuviera usando la interfaz de usuario (cree filas congeladas, realice el formateo de celdas, cambie el tamaño de filas / columnas, agregue tablas dinámicas, cree gráficos, etc. ) También tenga en cuenta que esta API es principalmente para las operaciones y la funcionalidad de la hoja de cálculo programática como se describe anteriormente.

Para realizar el acceso a nivel de archivo, como cargas y descargas, importaciones y exportaciones (igual que cargas y descargas, pero conversión a / desde varios formatos), usaría la API de Google Drive en su lugar, y aquí hay un par de ejemplos que he creado. (También Python):

  • (simple) Exportar una hoja de Google como CSV ( blogpost )
  • (intermedio) Conversor de "texto simple a PDF del pobre" ( blogpost ) (*)

(*) - TL; DR: cargue un archivo de texto sin formato en Drive, importe / convierta al formato de Google Docs y luego exporte ese Doc como PDF. La publicación anterior utiliza Drive API v2; esta publicación de seguimiento describe cómo migrarla a Drive API v3, y aquí hay un video para desarrolladores que combina ambas publicaciones.

Para obtener más información sobre cómo utilizar las API de Google (en su mayoría Python o JavaScript), consulte la variedad de videos para desarrolladores de Google ( series 1 y 2 ) que estoy produciendo.