Interakcia s Tabuľkami Google z jazyka Java

1. Prehľad

Tabuľky Google poskytujú pohodlný spôsob ukladania a manipulácie s tabuľkami a spolupráce s ostatnými na dokumente.

Niekedy môže byť užitočné získať prístup k týmto dokumentom z aplikácie, napríklad vykonať automatizovanú operáciu. Na tento účel poskytuje Google rozhranie Google Sheets API, s ktorým môžu vývojári interagovať.

V tomto článku ideme sa pozrieť na to, ako sa môžeme pripojiť k API a vykonávať operácie v Tabuľkách Google.

2. Maven závislosti

Na pripojenie k API a manipuláciu s dokumentmi budeme musieť pridať závislosti serverov google-api-client, google-oauth-client-jetty a google-api-services-sheets:

 com.google.api-client google-api-client 1.23.0 com.google.oauth-client google-oauth-client-jetty 1.23.0 com.google.apis google-api-services-sheets v4-rev493-1.23. 0 

3. Povolenie

Rozhranie Google Sheets API vyžaduje autorizáciu OAuth 2.0 skôr, ako k nej získame prístup prostredníctvom aplikácie.

Najskôr musíme získať sadu poverení OAuth a potom ich pomocou tejto žiadosti odoslať žiadosť o autorizáciu.

3.1. Získanie poverení OAuth 2.0

Ak chcete získať poverenia, budeme musieť vytvoriť projekt v konzole Google Developers Console a potom povoliť pre projekt rozhranie Google Sheets API. Prvý krok v sprievodcovi rýchlym štartom Google obsahuje podrobné informácie o tom, ako to urobiť.

Po stiahnutí súboru JSON s informáciami o poverení skopírujeme obsah do a google-sheets-client-secret.json súbor v src / main / resources adresár našej aplikácie.

Obsah súboru by mal byť podobný tomuto:

{"installed": {"client_id": "", "project_id": "decisive-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. Získanie a Poverovacie listiny Objekt

Úspešná autorizácia vráti a Poverovacie listiny objekt, ktorý môžeme použiť na interakciu s rozhraním API Tabuliek Google.

Vytvorme a GoogleAuthorizeUtil triedy so statickým povoliť() metóda, ktorá načíta obsah súboru JSON vyššie a vytvorí a GoogleClientSecrets objekt.

Potom vytvoríme a GoogleAuthorizationCodeFlow a pošlite žiadosť o autorizáciu:

public class GoogleAuthorizeUtil {public static Credential authorize () throws IOException, GeneralSecurityException {// build GoogleClientSecrets from JSON file List scopes = Arrays.asList (SheetsScopes.SPREADSHEETS); // vytvorenie poverenia na vrátenie objektu poverenia; }}

V našom príklade nastavujeme ROZHĽADY rozsah, pretože chceme pristupovať k Tabuľkám Google a používať v pamäti DataStoreFactory na uloženie prijatých poverení. Ďalšou možnosťou je použitie a FileDataStoreFactory na uloženie poverení do súboru.

Celý zdrojový kód GoogleAuthorizeUtil klass, vyskúšať projekt GitHub.

4. Stavba Listy Inštancia služby

Na prácu s Tabuľkami Google budeme potrebovať a Listy objekt, ktorý je klientom na čítanie a zápis cez API.

Vytvorme a SheetsServiceUtil trieda, ktorá používa Poverovacie listiny objekt vyššie na získanie inštancie Listy:

public class SheetsServiceUtil {private static final String APPLICATION_NAME = "Príklad tabuliek Google"; public static Sheets getSheetsService () throws IOException, GeneralSecurityException {Credential credential = GoogleAuthorizeUtil.authorize (); vrátiť nové Sheets.Builder (GoogleNetHttpTransport.newTrustedTransport (), JacksonFactory.getDefaultInstance (), poverenie) .setApplicationName (APPLICATION_NAME) .build (); }}

Ďalej sa pozrieme na niektoré z najbežnejších operácií, ktoré môžeme pomocou API vykonať.

5. Zápis hodnôt na list

Interakcia s existujúcou tabuľkou vyžaduje znalosť ID tabuľky, ktorú nájdeme z jej adresy URL.

Ako príklad uvedieme verejnú tabuľku s názvom „Výdavky“, ktorá sa nachádza na adrese:

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

Na základe tejto adresy URL môžeme identifikovať ID tejto tabuľky ako „1sILuxZUnyl_7-MlNThjt765oWshN3Xs-PPLfqYe4DhI“.

Tiež na čítanie a zápis hodnôt použijeme tabuľky.hodnoty zbierky.

Hodnoty sú vyjadrené ako ValueRange objekty, čo sú zoznamy zoznamov Java Predmety, zodpovedajúce riadkom alebo stĺpcom v hárku.

Vytvorme testovaciu triedu, kde inicializujeme našu Listy objekt služby a konštanta SPREADSHEET_ID:

verejná trieda GoogleSheetsLiveTest {private static Sheets sheetsService; private static String SPREADSHEET_ID = // ... @BeforeClass public static void setup () vrhá GeneralSecurityException, IOException {sheetsService = SheetsServiceUtil.getSheetsService (); }}

Potom môžeme hodnoty zapisovať pomocou:

  • zápis do jedného rozsahu
  • zápis do viacerých rozsahov
  • pripojenie údajov za tabuľku

5.1. Zápis do jedného rozsahu

Na zápis hodnôt do jedného rozsahu na hárok použijeme tabuľky (). hodnoty (). aktualizácia () metóda:

@Test public void whenWriteSheet_thenReadSheetOk () hodí IOException {ValueRange body = new ValueRange () .setValues ​​(Arrays.asList (Arrays.asList ("Výdavky január"), Arrays.asList ("knihy", "30"), Arrays.asList („perá“, „10“), Arrays.asList („Výdavky vo februári“), Arrays.asList („oblečenie“, „20“), Arrays.asList („topánky“, „5“))); UpdateValuesResponse result = sheetsService.spreadsheets (). Values ​​() .update (SPREADSHEET_ID, "A1", body) .setValueInputOption ("RAW") .execute (); }

Tu najskôr vytvárame a ValueRange objekt s viacerými riadkami obsahujúcimi zoznam výdavkov na dva mesiace.

Potom používame aktualizácia () metóda na vytvorenie požiadavky, ktorá zapíše hodnoty do tabuľky s daným ID, počínajúc bunkou „A1“.

Na odoslanie žiadosti používame vykonať () metóda.

Ak chceme, aby sa naše množiny hodnôt považovali namiesto stĺpcov za stĺpce, môžeme použiť znak setMajorDimension („COLUMNS“) metóda.

Možnosť vstupu „RAW“ znamená, že hodnoty sa zapisujú presne tak, ako sú, a nevypočítavajú sa.

Pri vykonávaní tohto testu JUnit aplikácia otvorí okno prehliadača pomocou predvoleného prehľadávača systému, ktorý žiada používateľa, aby sa prihlásil a udelil našej aplikácii povolenie na interakciu s Tabuľkami Google v mene používateľa:

Upozorňujeme, že tento manuálny krok je možné obísť, ak máte účet služby OAuth.

Požiadavka, aby mohla aplikácia prezerať alebo upravovať tabuľku, je to, aby prihlásený používateľ mal prístup na prezeranie alebo úpravy. V opačnom prípade bude mať žiadosť za následok chybu 403. Tabuľka, ktorú používame v našom príklade, je nastavená na prístup pre verejné úpravy.

Teraz, ak skontrolujeme tabuľku, uvidíme rozsah “A1: B6”Je aktualizovaný o naše množiny hodnôt.

Prejdime k písaniu do viacerých nesúrodých rozsahov v jednej žiadosti.

5.2. Zápis do viacerých rozsahov

Ak chceme na hárku aktualizovať viac rozsahov, môžeme použiť a BatchUpdateValuesRequest pre lepší výkon:

Zoznam údajov = nový ArrayList (); data.add (new ValueRange () .setRange ("D1") .setValues ​​(Arrays.asList (Arrays.asList ("January Total", "= B2 + B3")))); data.add (new ValueRange () .setRange ("D4") .setValues ​​(Arrays.asList (Arrays.asList ("February Total", "= B5 + B6")))); BatchUpdateValuesRequest batchBody = nový BatchUpdateValuesRequest () .setValueInputOption ("USER_ENTERED") .setData (údaje); BatchUpdateValuesResponse batchResult = sheetsService.spreadsheets (). Values ​​() .batchUpdate (SPREADSHEET_ID, batchBody) .execute ();

V tomto príklade najskôr zostavujeme zoznam Rozsahy hodnôt, každá pozostáva z dvoch buniek, ktoré predstavujú názov mesiaca a celkové výdavky.

Potom vytvoríme a BatchUpdateValuesRequest s možnosť zadania „USER_ENTERED“, oproti „RAW“, čo znamená, že hodnoty buniek budú vypočítané na základe vzorca pridania ďalších dvoch buniek.

Nakoniec vytvárame a odosielame batchUpdate žiadosť. Výsledkom je, že rozsahy „D1: E1“A„D4: E4”Bude aktualizované.

5.3. Pripojenie údajov za tabuľku

Ďalším spôsobom, ako zapísať hodnoty do hárka, je pridať ich na koniec tabuľky.

Na tento účel môžeme použiť pridať () metóda:

ValueRange appendBody = nový ValueRange () .setValues ​​(Arrays.asList (Arrays.asList ("Total", "= E1 + E4"))); AppendValuesResponse appendResult = sheetsService.spreadsheets (). Values ​​() .append (SPREADSHEET_ID, "A1", appendBody) .setValueInputOption ("USER_ENTERED") .setInsertDataOption ("INSERT_ROWS") .setIncludee) ValueRange total = appendResult.getUpdates (). GetUpdatedData (); assertThat (total.getValues ​​(). get (0) .get (1)). isEqualTo ("65");

Najprv staviame ValueRange objekt obsahujúci hodnoty buniek, ktoré chceme pridať.

V našom prípade obsahuje bunku s celkovými nákladmi za oba mesiace, ktoré nájdeme pridaním „E1“ a „E2“ hodnoty buniek.

Potom vytvárame požiadavku, ktorá pripojí údaje za tabuľku obsahujúcu „A1" bunka.

The INSERT_ROWS Táto možnosť znamená, že chceme, aby sa údaje pridávali do nového riadku, a nie aby sa nahradili všetky existujúce údaje za tabuľkou. To znamená, že príklad napíše rozsah „A7: B7“V prvom spustení.

Pri ďalších behoch bude tabuľka začínajúca na „A1“ bunka sa teraz roztiahne tak, aby obsahovala „A7: B7“ riadok, takže nový riadok prejde na „A8: B8“ riadok, a tak ďalej.

Musíme tiež nastaviť includeValuesInResponse property to true, ak chceme overiť odpoveď na požiadavku. Výsledkom bude, že objekt odpovede bude obsahovať aktualizované údaje.

6. Čítanie hodnôt z listu

Overme si, či boli naše hodnoty správne napísané, a to tak, že ich prečítame z hárka.

Môžeme to urobiť pomocou tabuľky (). hodnoty (). get () metóda na čítanie jedného rozsahu alebo batchUpdate () metóda na čítanie viacerých rozsahov:

Rozsahy zoznamov = Arrays.asList ("E1", "E4"); BatchGetValuesResponse readResult = sheetsService.spreadsheets (). Values ​​() .batchGet (SPREADSHEET_ID) .setRanges (rozsahy) .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");

Tu čítame rozsahy „E1“ a „E4“ a overenie, či obsahujú súčet za každý mesiac, ktorý sme napísali predtým.

7. Vytváranie nových tabuliek

Okrem čítania a aktualizácie hodnôt môžeme manipulovať aj s hárkami alebo celými tabuľkami pomocou tabuľky () a tabuľky (). listy () zbierky.

Pozrime sa na príklad vytvorenia novej tabuľky:

@ Test public void test () hodí IOException {Spreadsheet spreadSheet = new Spreadsheet (). SetProperties (new SpreadsheetProperties (). SetTitle ("My Spreadsheet")); Výsledok tabuľky = sheetsService .spreadsheets () .create (spreadSheet) .execute (); assertThat (result.getSpreadsheetId ()). isNotNull (); }

Tu najskôr vytvárame a Tabuľka objekt s názvom „MôjTabuľka “ potom zostavenie a odoslanie žiadosti pomocou vytvoriť () a vykonať () metódy.

Nová tabuľka bude súkromná a bude umiestnená na Disk prihláseného používateľa.

8. Ďalšie aktualizačné operácie

Väčšina ostatných operácií má formu a Žiadosť objekt, ktorý potom pridáme do zoznamu a použijeme na zostavenie a BatchUpdateSpreadsheetRequest.

Pozrime sa, ako môžeme poslať dve žiadosti o zmenu názvu tabuľky a kopírovanie a prilepenie sady buniek z jedného listu do druhého:

@Test public void whenUpdateSpreadSheetTitle_thenOk () vyvolá IOException {UpdateSpreadsheetPropertiesRequest updateSpreadSheetRequest = nový UpdateSpreadsheetPropertiesRequest (). SetFields ("*") .setProperties (nový SpreadsheetProperties (). SetTitle (). CopyPasteRequest copyRequest = nový CopyPasteRequest () .setSource (nový GridRange (). SetSheetId (0) .setStartColumnIndex (0) .setEndColumnIndex (2) .setStartRowIndex (0) .setEndRowIndex (1)) .setDestination (1)). 1) .setStartColumnIndex (0) .setEndColumnIndex (2) .setStartRowIndex (0) .setEndRowIndex (1)) .setPasteType ("PASTE_VALUES"); Zoznam požiadaviek = nový ArrayList (); requests.add (new Request () .setCopyPaste (copyRequest)); requests.add (new Request () .setUpdateSpreadsheetProperties (updateSpreadSheetRequest)); BatchUpdateSpreadsheetRequest body = nový BatchUpdateSpreadsheetRequest (). SetRequests (požiadavky); sheetsService.spreadsheets (). batchUpdate (SPREADSHEET_ID, body) .execute (); }

Tu tvoríme UpdateSpreadSheetPropertiesRequest objekt, ktorý určuje nový názov, a CopyPasteRequest objekt, ktorý obsahuje zdroj a cieľ operácie a následné pridanie týchto objektov do a Zoznam z Žiadosti.

Potom vykonávame obe žiadosti ako dávkovú aktualizáciu.

Mnoho ďalších typov požiadaviek je k dispozícii na použitie podobným spôsobom. Napríklad môžeme vytvoriť nový hárok v tabuľke pomocou znaku AddSheetRequest alebo zmeňte hodnoty pomocou a FindReplaceRequest.

Môžeme vykonávať ďalšie operácie, ako je zmena orámovania, pridanie filtrov alebo zlúčenie buniek. Celý zoznam Žiadosť typy sú k dispozícii tu.

9. Záver

V tomto článku sme videli, ako sa môžeme pripojiť k rozhraniu Google Sheets API z aplikácie Java, a niekoľko príkladov manipulácie s dokumentmi uloženými v tabuľkách Google.

Celý zdrojový kód príkladov nájdete na GitHub.


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