4

Ich bin auf diesem einen verloren. Ich versuche, Java mit Google-Tabellenkalkulation zu verbinden, und obwohl die Dokumentation der API beim Abrufen von Daten vollständig ist (und es funktioniert gut), kann ich nicht herausfinden, wie ich in die Tabelle schreiben soll.Schreiben Sie Daten in Google Spreadsheet mit Java

Könnte jemand, geben Sie bitte ein voll Beispiel (mit den notwendigen Importen und alle), wie eine sehr einfache Dateneingabe in eine Google-Tabelle tun (zum Beispiel, geben Sie „asdf“ in die Zelle A1 von Sheet1)?

Wenn ein Tutorial wie dieses irgendwo existiert, könnte ich es nicht finden - irgendwelche Hinweise würden sehr geschätzt werden.

Vielen Dank, Zsolt

+0

[Erstes Ergebnis] (https://developers.google.com/google-apps/spreadsheets/) Ich habe anscheinend Informationen zum Ausschreiben von Zellen. – CodeChimp

+0

Entdecken Sie einfach die API/Java DOCS. Sie können vielleicht herausfinden, – JavaHopper

+0

CodeChimp, Sie verknüpfen mit Legacy-Code. Ich würde mich für ein funktionierendes Beispiel mit der aktuellen, aktuellen Version interessieren. Vielen Dank –

Antwort

1

Nutzen Sie XmlHttpRequest Anfrage.

Ich gebe Ihnen eine kurze Demo, wo Sie tatsächlich in eine Google-Tabelle schreiben. Sie wenden die Konzepte dann in Ihrer bevorzugten Sprache Java an.

  1. Öffnen Sie eine Google-Tabelle, um zu schreiben. Holen Sie es Tabelle ID
  2. Zum oauth playground und navigieren Sie zu Google Sheets API v4
  3. https://www.googleapis.com/auth/drive Erlaubnis wählen. Klicken Sie auf APIs autorisieren. Erlaube die Erlaubnis.
  4. Drücken Sie in Schritt 2 die Taste Exchange-Autorisierungscode für Token.
  5. Auf Schritt 3 Fügen Sie diese auf Anfrage URI:

    https://sheets.googleapis.com/v4/spreadsheets/ {SpreadsheetID}/Werte/Tabelle1 A1 valueInputOption = USER_ENTERED

HTTP-Methode ist PUT!?.

Dieses in Ihrem eingeben Anfrage Körper

{ 
    "range":"Sheet1!A1", 
    "majorDimension": "ROWS", 
    "values": [ 
    ["Hello World"] 
    ], 
} 

Klicken Sie Schicken Sie die Anfrage. Wenn Sie die Antwort 200 OK erhalten, erwarten Sie, dass "Hello World" in die A1-Zelle Ihrer Tabelle geschrieben wird. Sie können mehr über writing data in Sheets v4 here lesen.

Wie geht das in Java? Erfahren Sie mehr über die Implementierung von AJAX oder XHR in Java. Überprüfen Sie this tutorial, um loszulegen.

8

OK, es hat einige Stunden gedauert, bis ich es herausgefunden habe, und die Antwort erweist sich als einfacher als das Erstellen einer Ajax-Anfrage von Grund auf. In der Hoffnung, Stunden und Stunden für andere zu sparen, hier ist die Lösung, die für mich arbeitete.

Voraussetzung: Ich habe die Quickstart tutorial of the Google Sheets API verwendet, um aus einer Tabelle zu lesen, das ist ziemlich komplex, aber funktionierte gut für mich.

Nach dem Tutorial ich, ein paar Dinge zu ändern, benötigen allerdings

1, die

private static final List<String> SCOPES = 
     Arrays.asList(SheetsScopes.SPREADSHEETS_READONLY); 

zu

private static final List<String> SCOPES = 
     Arrays.asList(SheetsScopes.SPREADSHEETS); 

aus offensichtlichen Gründen

Linie ändern (wie wir die schreiben wollen Tabelle, nicht nur lesen Sie es

2, löschen Sie die gespeicherten Anmeldeinformationen, die in yo gespeichert sind ur Benutzerverzeichnis in einem Ordner /.credentials/

Noch eine Anmerkung genannt: scheint es eine Methode

spreadsheets.values.update() 

wird genannt, aber ich konnte nicht, dass die Arbeit bekommen, da es einen valueInputOption Parameter benötigt werden Set, und Stunden der Suche erwies sich nicht genug, um zu finden, wo man es einstellen kann.

Also ich schließlich mit einer Methode namens

spreadsheets.values.batchUpdate() 

Hier ist der Code vollständig Methode, die den Trick "Hello World!" des Schreibens für mich in eine Tabellenzelle tat schließlich (wie für Importe, ich das gleiche verwendet, wie in den Quickstart-Tutorial oben):

void WriteExample() throws IOException { 
    Sheets service = getSheetsService(); 
    List<Request> requests = new ArrayList<>(); 

     List<CellData> values = new ArrayList<>(); 


     values.add(new CellData() 
       .setUserEnteredValue(new ExtendedValue() 
         .setStringValue("Hello World!"))); 
     requests.add(new Request() 
       .setUpdateCells(new UpdateCellsRequest() 
         .setStart(new GridCoordinate() 
           .setSheetId(0) 
           .setRowIndex(0) 
           .setColumnIndex(0)) 
         .setRows(Arrays.asList(
           new RowData().setValues(values))) 
         .setFields("userEnteredValue,userEnteredFormat.backgroundColor"))); 

     BatchUpdateSpreadsheetRequest batchUpdateRequest = new BatchUpdateSpreadsheetRequest() 
       .setRequests(requests); 
     service.spreadsheets().batchUpdate(spreadsheetId, batchUpdateRequest) 
       .execute(); 
    } 

die SheetId ist die ID des Arbeitsblatt Sie schreiben (es immer 0 für das erste Arbeitsblatt in einem bestimmten spreadheet ist, und Sie können es von der URL für andere erhalten: es ist der Teil nach #gid=

Wenn Sie in weitere Komplexitäten wie Formatierung oder Verwendung von Formeln gehen möchten, können Sie in diesem Fall die Java example provided here verwenden.

Hoffe, dass es hilft, Zsolt

10

Hier ist eine modifizierte Version des kurzen Tutorial-Code-Start, eine Schreib auszuführen.

import com.google.api.client.auth.oauth2.Credential; 
import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; 
import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; 
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow; 
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; 
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; 
import com.google.api.client.http.HttpTransport; 
import com.google.api.client.json.jackson2.JacksonFactory; 
import com.google.api.client.util.store.FileDataStoreFactory; 
import com.google.api.services.sheets.v4.Sheets; 
import com.google.api.services.sheets.v4.SheetsScopes; 
import com.google.api.services.sheets.v4.model.ValueRange; 
import java.io.*; 
import java.util.*; 

public class SheetsIntegration { 

    private static HttpTransport transport; 
    private static JacksonFactory jsonFactory; 
    private static FileDataStoreFactory dataStoreFactory; 

Ich bekomme eine Berechtigung auf dieser Linie Warnung, aber es ist nicht tödlich

private static final java.io.File DATA_STORE_DIR = new java.io.File(System.getProperty("user.home"), ".credentials/sheets.googleapis.com.json"); 

Schnellstart-Tutorial nur lesbar Umfang statt

private static List<String> scopes = Arrays.asList(SheetsScopes.SPREADSHEETS); 

    public SheetsIntegration() { 
     try { 
      transport = GoogleNetHttpTransport.newTrustedTransport(); 
      dataStoreFactory = new FileDataStoreFactory(DATA_STORE_DIR); 
      jsonFactory = JacksonFactory.getDefaultInstance(); 

      service = getSheetsService(); 
     } catch (Exception e) { 
      // handle exception 
     } 
    } 

Per Schnellstart Tutorial verwendet, werden Sie müssen Sie die Zertifizierungsdatei von Google herunterladen.

public static Credential authorize() throws IOException { 
    // Load client secrets. 
    File cfile = new File("certs/cert.json"); 
    cfile.createNewFile(); 
    GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(jsonFactory, new InputStreamReader(new FileInputStream(cfile))); 

    // Build flow and trigger user authorization request. 
    GoogleAuthorizationCodeFlow flow = 
      new GoogleAuthorizationCodeFlow.Builder(
        transport, jsonFactory, clientSecrets, scopes) 
        .setDataStoreFactory(dataStoreFactory) 
        .setAccessType("offline") 
        .build(); 
    Credential credential = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); 
    return credential; 
} 

public static Sheets getSheetsService() throws IOException { 
    Credential credential = authorize(); 
    return new Sheets.Builder(transport, jsonFactory, credential) 
      .setApplicationName("INSERT_YOUR_APPLICATION_NAME") 
      .build(); 
} 

public void writeSomething(List<Data> myData) { 

    try { 
     String id = "INSERT_SHEET_ID"; 
     String writeRange = "INSERT_SHEET_NAME!A3:E"; 

     List<List<Object>> writeData = new ArrayList<>(); 
     for (Data someData: myData) { 
      List<Object> dataRow = new ArrayList<>(); 
      dataRow.add(someData.data1); 
      dataRow.add(someData.data2); 
      dataRow.add(someData.data3); 
      dataRow.add(someData.data4); 
      dataRow.add(someData.data5); 
      writeData.add(dataRow); 
     } 

     ValueRange vr = new ValueRange().setValues(writeData).setMajorDimension("ROWS"); 
     service.spreadsheets().values() 
       .update(id, writeRange, vr) 
       .setValueInputOption("RAW") 
       .execute(); 
    } catch (Exception e) { 
     // handle exception 
    } 
} 

Eine andere Anmerkung - ich musste servlet-api.jar zu meinem Projekt hinzufügen.

Verwandte Themen