Kapcsolatba léphet a Java táblákkal

1. Áttekintés

A Google Táblázatok kényelmes módot kínálnak a táblázatok tárolására és kezelésére, valamint másokkal való együttműködésre egy dokumentumban.

Néha hasznos lehet hozzáférni ezekhez a dokumentumokhoz egy alkalmazásból, például automatizált művelet végrehajtásához. Erre a célra a Google biztosítja a Google Táblázatok API-t, amellyel a fejlesztők kölcsönhatásba léphetnek.

Ebben a cikkben, megnézzük, hogyan tudunk csatlakozni az API-hoz, és hogyan hajthatunk végre műveleteket a Google Táblázatokon.

2. Maven-függőségek

Az API-hoz való csatlakozáshoz és a dokumentumok manipulálásához hozzá kell adnunk a google-api-client, a google-oauth-client-jetty és a google-api-services-sheets függőségeket:

 com.google.api-client google-api-client 1.23.0 com.google.oauth-client google-oauth-client-móló 1.23.0 com.google.apis google-api-services-sheets v4-rev493-1.23. 0 

3. Engedélyezés

A Google Sheets API OAuth 2.0 jogosultságot igényel mielőtt egy alkalmazáson keresztül elérhetnénk.

Először be kell szereznünk egy sor OAuth hitelesítő adatot, majd ezt kell felhasználnunk alkalmazásunkban engedélyezési kérelem benyújtására.

3.1. OAuth 2.0 hitelesítő adatok beszerzése

A hitelesítő adatok megszerzéséhez létre kell hoznunk egy projektet a Google Developers Console-ban, majd engedélyeznünk kell a Google Sheets API-t a projekthez. A Google Quickstart útmutató első lépése részletes információkat tartalmaz ennek végrehajtásáról.

Miután letöltöttük a JSON fájlt a hitelesítő adatokkal, másoljuk át a tartalmát a google-sheets-client-secret.json fájl a src / main / resources alkalmazásunk könyvtárát.

A fájl tartalmának hasonlónak kell lennie ehhez:

{"telepítve": {"client_id": "", "project_id": "decistic-octane-187810", "auth_uri": "// accounts.google.com/o/oauth2/auth", "token_uri": " //accounts.google.com/o/oauth2/token "," auth_provider_x509_cert_url ":" // www.googleapis.com/oauth2/v1/certs "," client_secret ":" "," redirect_uris ": [" urn: ietf: wg: oauth: 2.0: oob "," // localhost "]}}

3.2. A. Megszerzése Hitelesítő adatok Tárgy

A sikeres engedélyezés a Hitelesítő adatok objektum, amelyet felhasználhatunk a Google Táblázatok API-val való együttműködésre.

Hozzunk létre egy GoogleAuthorizeUtil osztály statikus engedélyez () metódus, amely beolvassa a fenti JSON fájl tartalmát és felépíti a GoogleClientSecrets tárgy.

Ezután létrehozunk egy GoogleAuthorizationCodeFlow és küldje el az engedélyezési kérelmet:

public class GoogleAuthorizeUtil {public static Credential autorize () dobja az IOException, GeneralSecurityException {// GoogleClientSecrets felépítését JSON fájlból List scopes = Arrays.asList (SheetsScopes.SPREADSHEETS); // build Credential object return credential; }}

Példánkban a TÁVOLLAPOK alkalmazási körét, mivel szeretnénk hozzáférni a Google Táblázatokhoz és memóriában DataStoreFactory a kapott hitelesítő adatok tárolására. Egy másik lehetőség az a használata FileDataStoreFactory hogy a hitelesítő adatokat egy fájlban tárolja.

A teljes forráskódért GoogleAuthorizeUtil class, nézze meg a GitHub projektet.

4. A Ágynemű Szolgáltatási példány

A Google Táblázatokkal való együttműködéshez szükségünk lesz a Ágynemű objektum, amely az API-n keresztüli olvasás és írás kliens.

Hozzunk létre egy SheetsServiceUtil osztály, amely a Hitelesítő adatok a fenti objektumot a Ágynemű:

public class SheetsServiceUtil {private static final String APPLICATION_NAME = "Példa a Google Táblázatokra"; public static Sheets getSheetsService () dobja az IOException, GeneralSecurityException {Credential credential = GoogleAuthorizeUtil.authorize (); adja vissza az új Sheets.Builder-t (GoogleNetHttpTransport.newTrustedTransport (), JacksonFactory.getDefaultInstance (), credential) .setApplicationName (APPLICATION_NAME) .build (); }}

Ezután megnézzük a leggyakoribb műveleteket, amelyeket az API használatával elvégezhetünk.

5. Értékek írása egy lapra

A meglévő táblázattal való interakcióhoz ismerni kell a táblázat azonosítóját, amelyet az URL-jéből találhatunk meg.

Példaként egy „Költségek” nevű nyilvános táblázatot fogunk használni, amely a következő címen található:

//docs.google.com/spreadsheets/d/1sILuxZUnyl_7-MlNThjt765oWshN3Xs-PPLfqYe4DhI/edit#gid=0

Ezen URL alapján a táblázat azonosítóját „1sILuxZUnyl_7-MlNThjt765oWshN3Xs-PPLfqYe4DhI” néven azonosíthatjuk.

Is, értékek olvasására és írására használjuk táblázatok.értékek gyűjtemények.

Az értékek a következőképpen vannak ábrázolva ValueRange objektumok, amelyek a Java listáinak listája Tárgyak, egy lap sorainak vagy oszlopainak felel meg.

Hozzunk létre egy teszt osztályt, ahol inicializáljuk a sajátunkat Ágynemű szolgáltatási objektum és egy SPREADSHEET_ID konstans:

public class GoogleSheetsLiveTest {private static Sheets sheetsService; private static String SPREADSHEET_ID = // ... @BeforeClass public static void setup () dobja a GeneralSecurityException, IOException {sheetsService = SheetsServiceUtil.getSheetsService (); }}

Ezután az alábbiak szerint írhatunk értékeket:

  • egyetlen tartományba írva
  • írás több tartományba
  • adatok hozzáfűzése egy táblázat után

5.1. Írás egyetlen tartományba

Ha egy lap egyetlen tartományába írunk értékeket, akkor a táblázatok (). értékek (). frissítés () módszer:

@Test public void whenWriteSheet_thenReadSheetOk () IOException {ValueRange body = new ValueRange () .setValues ​​(Arrays.asList (Arrays.asList ("januári kiadások)", Arrays.asList ("books", "30"), Arrays.asList dobja ("tollak", "10"), Arrays.asList ("februári kiadások"), Arrays.asList ("ruhák", "20"), Arrays.asList ("cipők", "5"))); UpdateValuesResponse result = sheetsService.spreadsheets (). Values ​​() .update (SPREADSHEET_ID, "A1", body) .setValueInputOption ("RAW") .execute (); }

Itt először a ValueRange több soros objektum, amely két hónap költséglistáját tartalmazza.

Akkor használjuk a frissítés () metódus olyan kérés létrehozására, amely az értékeket a táblázatba írja be a megadott azonosítóval, az „A1” cellától kezdve.

A kérés elküldéséhez a végrehajtani () módszer.

Ha azt akarjuk, hogy értékkészleteinket oszlopoknak tekintsük sorok helyett, használhatjuk a setMajorDimension („OSZLOPOK”) módszer.

A „RAW” beviteli opció azt jelenti, hogy az értékeket pontosan úgy írják, ahogy vannak, és nem számítják ki.

A JUnit teszt végrehajtásakor az alkalmazás megnyitja a böngészőablakot a rendszer alapértelmezett böngészőjével, amely megkéri a felhasználót, hogy jelentkezzen be, és engedélyt adjon alkalmazásunknak, hogy a felhasználó nevében léphessen kapcsolatba a Google Táblázatokkal:

Vegye figyelembe, hogy ez a kézi lépés megkerülhető, ha rendelkezik OAuth-szolgáltatásfiókkal.

Ahhoz, hogy az alkalmazás megtekinthesse vagy szerkeszthesse a táblázatot, az a követelmény, hogy a bejelentkezett felhasználónak megtekintési vagy szerkesztési hozzáférése legyen. Ellenkező esetben a kérés 403 hibát eredményez. A példánkhoz használt táblázat nyilvános szerkesztési hozzáférésre van állítva.

Ha megnézzük a táblázatot, látni fogjuk a tartománytA1: B6”Frissül az értékkészleteinkkel.

Térjünk át arra, hogy egyetlen kérelemben több különböző tartományba írjunk.

5.2. Írás több tartományba

Ha egy lapon több tartományt akarunk frissíteni, használhatjuk a BatchUpdateValuesRequest a jobb teljesítmény érdekében:

Lista adatok = new ArrayList (); data.add (new ValueRange () .setRange ("D1") .setValues ​​(Arrays.asList (Arrays.asList ("Január összesen", "= B2 + B3"))); data.add (new ValueRange () .setRange ("D4") .setValues ​​(Arrays.asList (Arrays.asList ("Február összesen", "= B5 + B6"))); BatchUpdateValuesRequest batchBody = új BatchUpdateValuesRequest () .setValueInputOption ("USER_ENTERED") .setData (adatok); BatchUpdateValuesResponse batchResult = sheetsService.spreadsheets (). Values ​​() .batchUpdate (SPREADSHEET_ID, batchBody) .execute ();

Ebben a példában először összeállítunk egy listát ValueRanges, mindegyik két cellából áll, amelyek a hónap nevét és az összes költséget képviselik.

Aztán létrehozunk egy BatchUpdateValuesRequest val vel a beviteli opció „USER_ENTERED”, szemben a "NYERS", vagyis a cellaértékeket a képlet alapján számoljuk ki két másik sejt hozzáadásával.

Végül elkészítjük és elküldjük a batchUpdate kérés. Ennek eredményeként a tartományokD1: E1”És„D4: E4" Frissítve lesz.

5.3. Adatok hozzáfűzése egy táblázat után

Az értékek egy lapba írásának másik módja az, hogy hozzáfűzi őket egy táblázat végéhez.

Ehhez használhatjuk a mellékel() módszer:

ValueRange appendBody = new ValueRange () .setValues ​​(Arrays.asList (Arrays.asList ("Összesen", "= E1 + E4"))); AppendValuesResponse appendResult = sheetsService.spreadsheets (). Értékek () .append (SPREADSHEET_ID, "A1", appendBody) .setValueInputOption ("USER_ENTERED") .setInsertDataOption ("INSERT_ROWS") (InsetInc). ValueRange total = appendResult.getUpdates (). GetUpdatedData (); assertThat (total.getValues ​​(). get (0) .get (1)). isEqualTo ("65");

Először építjük a ValueRange a hozzáadni kívánt cellaértékeket tartalmazó objektum.

Esetünkben ez egy cellát tartalmaz, amely tartalmazza a mindkét hónap összes költségét, amelyet a „E1” és „E2” cellaértékek.

Ezután létrehozunk egy kérést, amely az adatokat a „A1" sejt.

A INSERT_ROWS Az opció azt jelenti, hogy azt akarjuk, hogy az adatok új sorba kerüljenek, és ne cseréljük le a táblázat után a meglévő adatokat. Ez azt jelenti, hogy a példa írja a tartománytA7: B7”Első menetében.

A következő futtatások során a „A1” cella most kinyúlik, hogy tartalmazza a „A7: B7” sor, így egy új sor kerül a „A8: B8” sor, és így tovább.

Be kell állítanunk a includeValuesInResponse tulajdonság igaz, ha ellenőrizni akarjuk a kérésre adott választ. Ennek eredményeként a válaszobjektum tartalmazza a frissített adatokat.

6. Értékek olvasása lapról

Ellenőrizzük, hogy az értékeink helyesen lettek-e megírva a lapról.

Ezt megtehetjük a táblázatok (). értékek (). get () módszer egyetlen tartomány vagy a batchUpdate () módszer több tartomány beolvasására:

Lista tartományok = Arrays.asList ("E1", "E4"); BatchGetValuesResponse readResult = sheetsService.spreadsheets (). Értékek () .batchGet (SPREADSHEET_ID) .setRanges (tartományok) .execute (); ValueRange januaryTotal = readResult.getValueRanges (). Get (0); assertThat (januaryTotal.getValues ​​(). get (0) .get (0)) .isEqualTo ("40"); ValueRange febTotal = readResult.getValueRanges (). Get (1); assertThat (febTotal.getValues ​​(). get (0) .get (0)) .isEqualTo ("25");

Itt olvassuk a tartományokat „E1” és „E4” és annak ellenőrzése, hogy tartalmazzák-e az egyes hónapok összesített összegét, amelyet korábban írtunk.

7. Új táblázatok készítése

Az értékek olvasása és frissítése mellett a lapokkal vagy teljes táblázatokkal is manipulálhatjuk a használatát táblázatok () és táblázatok (). lapok () gyűjtemények.

Lássunk egy példát egy új táblázat létrehozására:

@Test public void test () dobja az IOException-t {Spreadsheet spreadSheet = new Spreadsheet (). SetProperties (new SpreadsheetProperties (). SetTitle ("Saját Spreadsheet")); Táblázat eredmény = sheetsService .spreadsheets () .create (spreadSheet) .execute (); assertThat (result.getSpreadsheetId ()). isNotNull (); }

Itt először a Táblázat objektum címmelAz énTáblázat ” majd kérés összeállítása és elküldése a teremt() és végrehajtani () mód.

Az új táblázat privát lesz, és a bejelentkezett felhasználó Drive-jába kerül.

8. Egyéb frissítési műveletek

A legtöbb egyéb művelet a Kérés objektum, amelyet ezután hozzáadunk egy listához, és felhasználjuk a BatchUpdateSpreadsheetRequest.

Nézzük meg, hogyan küldhetünk két kérelmet egy táblázat címének megváltoztatására, és egy cellakészlet egyik lapról a másikra történő beillesztésére:

@Test public void, amikorUpdateSpreadSheetTitle_thenOk () dobja az IOException {UpdateSpreadsheetPropertiesRequest updateSpreadSheetRequest = new UpdateSpreadsheetPropertiesRequest (). SetFields ("*") .setProperties (új Spreadsheet). CopyPasteRequest copyRequest = új CopyPasteRequest () .setSource (új GridRange (). SetSheetId (0) .setStartColumnIndex (0) .setEndColumnIndex (2) .setStartRowIndex (0) .setEndRowIndex (1)). 1) .setStartColumnIndex (0) .setEndColumnIndex (2) .setStartRowIndex (0) .setEndRowIndex (1)) .setPasteType ("PASTE_VALUES"); Listakérések = new ArrayList (); request.add (új Request () .setCopyPaste (copyRequest)); request.add (új Request () .setUpdateSpreadsheetProperties (updateSpreadSheetRequest)); BatchUpdateSpreadsheetRequest body = új BatchUpdateSpreadsheetRequest (). SetRequests (kérések); sheetsService.spreadsheets (). batchUpdate (SPREADSHEET_ID, body) .execute (); }

Itt létrehozunk egy UpdateSpreadSheetPropertiesRequest objektum, amely meghatározza az új címet, a CopyPasteRequest objektum, amely tartalmazza a művelet forrását és célját, majd ezeket az objektumokat hozzáadja a Lista nak,-nek Kérések.

Ezután mindkét kérést kötegelt frissítésként hajtjuk végre.

Sok más típusú kérelem is elérhető hasonló módon. Például létrehozhatunk egy új táblázatot egy táblázatban egy AddSheetRequest vagy megváltoztathatja az értékeket a-val FindReplaceRequest.

Végezhetünk más műveleteket is, például a határok megváltoztatásával, szűrők hozzáadásával vagy a cellák egyesítésével. A teljes lista Kérés típusok itt érhetők el.

9. Következtetés

Ebben a cikkben azt láttuk, hogyan tudunk csatlakozni a Google Táblázatok API-hoz egy Java alkalmazásból, és néhány példát a Google Táblázatokban tárolt dokumentumok manipulálására.

A példák teljes forráskódja megtalálható a GitHub oldalon.


$config[zx-auto] not found$config[zx-overlay] not found