Interakcija s Google tablicama s Jave

1. Pregled

Google tablice pružaju prikladan način za pohranu i manipulaciju proračunskim tablicama te suradnju s drugima na dokumentu.

Ponekad može biti korisno pristupiti tim dokumentima iz aplikacije, recimo za obavljanje automatizirane operacije. U tu svrhu Google nudi API za Google tablice s kojim programeri mogu komunicirati.

U ovom članku, pogledati ćemo kako se možemo povezati s API-jem i izvoditi operacije na Google tablicama.

2. Ovisnosti Mavena

Da bismo se povezali s API-jem i manipulirali dokumentima, trebamo dodati ovisnosti google-api-client, google-oauth-client-jetty i google-api-services-sheet:

 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-listovi v4-rev493-1.23. 0 

3. Ovlaštenje

API Google Sheets zahtijeva odobrenje OAuth 2.0 prije nego što mu pristupimo putem aplikacije.

Prvo moramo dobiti skup vjerodajnica za OAuth, a zatim ga upotrijebiti u našoj aplikaciji za podnošenje zahtjeva za autorizaciju.

3.1. Dobivanje vjerodajnica OAuth 2.0

Da bismo dobili vjerodajnice, morat ćemo stvoriti projekt na Google Developers Console, a zatim omogućiti API za Google tablice za projekt. Prvi korak u vodiču Google Quickstart sadrži detaljne informacije o tome kako to učiniti.

Nakon što preuzmemo datoteku JSON s podacima o vjerodajnicama, kopirajmo sadržaj u google-listovi-klijent-tajna.json datoteku u src / glavni / resursi direktorij naše aplikacije.

Sadržaj datoteke trebao bi biti sličan ovome:

{"instaliran": {"client_id": "", "project_id": "odlučujući oktan-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. Dobivanje a Uvjerenje Objekt

Uspješna autorizacija vraća a Uvjerenje objekt koji možemo koristiti za interakciju s API-jem Google tablica.

Stvorimo a GoogleAuthorizeUtil razred sa statičkim ovlastiti() metoda koja čita sadržaj gornje JSON datoteke i gradi a GoogleClientSecrets objekt.

Zatim ćemo stvoriti GoogleAuthorizationCodeFlow i pošaljite zahtjev za autorizaciju:

javna klasa GoogleAuthorizeUtil {javna statička vjerodajnica autorizacija () baca IOException, GeneralSecurityException {// gradi GoogleClientSecrets iz JSON liste popisa Scopes = Arrays.asList (SheetsScopes.SPREADSHEETS); // gradi objekt vjerodajnica vraća vjerodajnicu; }}

U našem primjeru postavljamo PROSTORNI LISTOVI opsega jer želimo pristupiti Google tablicama i pomoću ugrađene memorije DataStoreFactory za pohranu primljenih vjerodajnica. Druga mogućnost je korištenje a FileDataStoreFactory za pohranu vjerodajnica u datoteku.

Za potpuni izvorni kod GoogleAuthorizeUtil class, pogledajte projekt GitHub.

4. Konstruiranje Listovi Instanca usluge

Za interakciju s Google tablicama trebat će nam a Listovi objekt koji je klijent za čitanje i pisanje putem API-ja.

Stvorimo a SheetsServiceUtil klasa koja koristi Uvjerenje gornji objekt za dobivanje primjerka Listovi:

javna klasa SheetsServiceUtil {private static final String APPLICATION_NAME = "Primjer Google tablica"; javni statički listovi getSheetsService () bacaju IOException, GeneralSecurityException {Vjerodajnice = GoogleAuthorizeUtil.authorize (); vrati novi Sheets.Builder (GoogleNetHttpTransport.newTrustedTransport (), JacksonFactory.getDefaultInstance (), vjerodajnica) .setApplicationName (APPLICATION_NAME) .build (); }}

Zatim ćemo pogledati neke od najčešćih operacija koje možemo izvesti pomoću API-ja.

5. Pisanje vrijednosti na list

Za interakciju s postojećom proračunskom tablicom potrebno je znati ID proračunske tablice koji možemo pronaći na njezinom URL-u.

Za naše primjere koristit ćemo javnu proračunsku tablicu nazvanu "Troškovi" koja se nalazi na:

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

Na temelju ovog URL-a možemo identificirati ID ove proračunske tablice kao “1sILuxZUnyl_7-MlNThjt765oWshN3Xs-PPLfqYe4DhI”.

Također, za čitanje i pisanje vrijednosti koristit ćemo proračunske tablice.vrjednosti zbirke.

Vrijednosti su predstavljene kao ValueRange objekti, koji su popisi Java popisa Predmeti, koji odgovaraju redovima ili stupcima na listu.

Stvorimo test klasu u kojoj inicijaliziramo svoj Listovi objekt usluge i konstanta SPREADSHEET_ID:

javna klasa GoogleSheetsLiveTest {private static Sheets listoviService; privatni statički niz SPREADSHEET_ID = // ... @BeforeClass postavljanje javnih statičkih praznina () baca GeneralSecurityException, IOException {listoviService = SheetsServiceUtil.getSheetsService (); }}

Tada vrijednosti možemo zapisati prema:

  • pisanje u jedan raspon
  • pisanje u više raspona
  • dodavanje podataka nakon tablice

5.1. Pisanje u jednom rasponu

Za zapisivanje vrijednosti u jedan raspon na listu koristit ćemo proračunske tablice (). values ​​(). update () metoda:

@Test public void whenWriteSheet_thenReadSheetOk () baca IOException {ValueRange body = new ValueRange () .setValues ​​(Arrays.asList (Arrays.asList ("Expenses January"), Arrays.asList ("books", "30"), Arrays.asL ("olovke", "10"), Arrays.asList ("Troškovi u veljači"), Arrays.asList ("odjeća", "20"), Arrays.asList ("cipele", "5"))); UpdateValuesResponse rezultat = listovaService.spreadsheets (). Values ​​() .update (SPREADSHEET_ID, "A1", body) .setValueInputOption ("RAW") .execute (); }

Evo, prvo stvaramo ValueRange objekt s više redaka koji sadrži popis troškova za dva mjeseca.

Zatim koristimo ažuriranje() metoda za izgradnju zahtjeva koji zapisuje vrijednosti u proračunsku tablicu s danim id-om, počevši od ćelije "A1".

Za slanje zahtjeva koristimo izvršiti() metoda.

Ako želimo da se naši skupovi vrijednosti smatraju stupcima umjesto redaka, možemo koristiti setMajorDimension (“STUPCI”) metoda.

Opcija unosa "RAW" znači da su vrijednosti zapisane točno onakve kakve jesu, a ne izračunavaju se.

Prilikom izvođenja ovog JUnit testa, aplikacija će otvoriti prozor preglednika pomoću zadanog preglednika sustava koji traži od korisnika da se prijavi i da našem programu odobrenje za interakciju s Google tablicama u ime korisnika:

Imajte na umu da se ovaj ručni korak može zaobići ako imate račun usluge OAuth.

Zahtjev da bi aplikacija mogla pregledavati ili uređivati ​​proračunsku tablicu jest da prijavljeni korisnik ima pristup ili pristup uređivanju proračunske tablice. U suprotnom, zahtjev će rezultirati pogreškom 403. Proračunska tablica koju koristimo za naš primjer postavljena je na javni pristup uređivanju.

Sada, ako provjerimo proračunsku tablicu, vidjet ćemo raspon "A1: B6”Ažurira se s našim skupovima vrijednosti.

Prijeđimo na pisanje u više različitih raspona u jednom zahtjevu.

5.2. Pisanje u više raspona

Ako želimo ažurirati više raspona na listu, možemo koristiti a BatchUpdateValuesRequest za bolje performanse:

Podaci s popisa = novi ArrayList (); data.add (novi ValueRange () .setRange ("D1") .setValues ​​(Arrays.asList (Arrays.asList ("Ukupno u siječnju," = B2 + B3 ")))); data.add (novi ValueRange () .setRange ("D4") .setValues ​​(Arrays.asList (Arrays.asList ("Ukupno u veljači," = B5 + B6 ")))); BatchUpdateValuesRequest batchBody = novi BatchUpdateValuesRequest () .setValueInputOption ("USER_ENTERED") .setData (podaci); BatchUpdateValuesResponse batchResult = listoviService.spreadsheets (). Values ​​() .batchUpdate (SPREADSHEET_ID, batchBody) .execute ();

U ovom primjeru prvo gradimo popis ValueRanges, svaka se sastoji od dvije ćelije koje predstavljaju naziv mjeseca i ukupne troškove.

Zatim stvaramo BatchUpdateValuesRequest s opcija unosa "USER_ENTERED", za razliku od "RAW", što znači da će se vrijednosti ćelija izračunati na temelju formule dodavanja dvije druge stanice.

Konačno, kreiramo i šaljemo batchUpdate zahtjev. Kao rezultat, rasponi „D1: E1"I"D4: E4”Bit će ažuriran.

5.3. Dodavanje podataka nakon tablice

Drugi način zapisivanja vrijednosti u list jest dodavanje na kraj tablice.

Za to možemo koristiti dodati() metoda:

ValueRange appendBody = new ValueRange () .setValues ​​(Arrays.asList (Arrays.asList ("Ukupno", "= E1 + E4"))); AppendValuesResponse appendResult = listoviService.spreadsheets (). Values ​​() .append (SPREADSHEET_ID, "A1", appendBody) .setValueInputOption ("USER_ENTERED") .setInsertDataOption ("INSERT_ROWS "Vase (InSERT_ROWS"). ValueRange ukupno = appendResult.getUpdates (). GetUpdatedData (); assertThat (total.getValues ​​(). get (0) .get (1)). isEqualTo ("65");

Prvo, gradimo ValueRange objekt koji sadrži vrijednosti ćelija koje želimo dodati.

U našem slučaju, ovo sadrži ćeliju s ukupnim troškovima za oba mjeseca koje pronalazimo dodavanjem "E1" i "E2" vrijednosti stanica.

Zatim izrađujemo zahtjev koji će dodati podatke nakon tablice koja sadrži "A1”Ćelija.

The INSERT_ROWS Opcija znači da želimo da se podaci dodaju u novi redak, a ne da zamjenjuju postojeće podatke nakon tablice. To znači da će primjer napisati raspon "A7: B7”U svojoj prvoj vožnji.

U sljedećim izvođenjima tablica koja počinje na "A1" stanica će se sada protezati tako da uključuje "A7: B7" redak, tako da novi red ide na "A8: B8" red i tako dalje.

Također moramo postaviti includeValuesInResponse svojstvo na true ako želimo provjeriti odgovor na zahtjev. Kao rezultat, objekt odgovora sadržavat će ažurirane podatke.

6. Čitanje vrijednosti iz lista

Provjerimo jesu li naše vrijednosti ispravno napisane čitajući ih s lista.

To možemo učiniti pomoću proračunske tablice (). vrijednosti (). get () metoda za čitanje jednog raspona ili batchUpdate () metoda za čitanje više raspona:

Rasponi popisa = Arrays.asList ("E1", "E4"); BatchGetValuesResponse readResult = listoviService.spreadsheets (). Values ​​() .batchGet (SPREADSHEET_ID) .setRanges (rasponi) .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");

Ovdje čitamo raspone "E1" i "E4" i provjeru da li sadrže ukupan iznos za svaki mjesec koji smo ranije napisali.

7. Izrada novih proračunskih tablica

Osim čitanja i ažuriranja vrijednosti, također možemo manipulirati listovima ili čitavim proračunskim tablicama proračunske tablice () i proračunske tablice (). listovi () zbirke.

Pogledajmo primjer izrade nove proračunske tablice:

@Test javni void test () baca IOException {Spreadsheet spreadSheet = new Spreadsheet (). SetProperties (new SpreadsheetProperties (). SetTitle ("My Spreadsheet")); Rezultat proračunske tablice = listoviService .spreadsheets () .create (SpreSheet) .execute (); assertThat (result.getSpreadsheetId ()). isNotNull (); }

Evo, prvo stvaramo Proračunska tablica objekt s naslovom “MojProračunska tablica " zatim izrada i slanje zahtjeva pomoću stvoriti() i izvršiti() metode.

Nova proračunska tablica bit će privatna i stavit će se na Disk prijavljenog korisnika.

8. Ostale operacije ažuriranja

Većina ostalih operacija ima oblik a Zahtjev objekt, koji zatim dodajemo na popis i koristimo za izgradnju a BatchUpdateSpreadsheetRequest.

Pogledajmo kako možemo poslati dva zahtjeva za promjenu naslova proračunske tablice i kopiranje i lijepljenje skupa ćelija s jednog lista na drugi:

@Test public void whenUpdateSpreadSheetTitle_thenOk () baca IOException {UpdateSpreadsheetPropertiesRequest updateSpreadSheetRequest = new UpdateSpreadsheetPropertiesRequest (). SetFields ("*") .setProperties (new SpreadsheetProperits ()). CopyPasteRequest copyRequest = novi CopyPasteRequest () .setSource (novi GridRange (). SetSheetId (0) .setStartColumnIndex (0) .setEndColumnIndex (2) .setStartRowIndex (0) .setEndRowIndex (1)) .set (G). 1) .setStartColumnIndex (0) .setEndColumnIndex (2) .setStartRowIndex (0) .setEndRowIndex (1)) .setPasteType ("PASTE_VALUES"); Popis zahtjeva = novi ArrayList (); request.add (novi zahtjev () .setCopyPaste (copyRequest)); request.add (novi Zahtjev () .setUpdateSpreadsheetProperties (updateSpreadSheetRequest)); BatchUpdateSpreadsheetRequest tijelo = novo BatchUpdateSpreadsheetRequest (). SetRequests (zahtjevi); listoviService.spreadsheets (). batchUpdate (SPREADSHEET_ID, body) .execute (); }

Ovdje stvaramo UpdateSpreadSheetPropertiesRequest objekt koji navodi novi naslov, a CopyPasteRequest objekt koji sadrži izvor i odredište operacije, a zatim dodavanje tih objekata u Popis od Zahtjevi.

Zatim oba zahtjeva izvršavamo kao paketno ažuriranje.

Mnogo drugih vrsta zahtjeva dostupno je za korištenje na sličan način. Na primjer, možemo stvoriti novi list u proračunskoj tablici s AddSheetRequest ili promijenite vrijednosti s a FindReplaceRequest.

Možemo izvoditi druge operacije kao što su promjena granica, dodavanje filtara ili spajanje ćelija. Cjelovit popis Zahtjev vrste dostupna je ovdje.

9. Zaključak

U ovom smo članku vidjeli kako se možemo povezati s API-jem Google tablica iz Java aplikacije i nekoliko primjera manipulacije dokumentima pohranjenim u Google tablicama.

Potpuni izvorni kod primjera može se naći na GitHubu.