9

öffentliche Google Spreadsheet-Daten mithilfe von Google Spreadsheet API Java-Bibliothek erhalten -was ichWie ohne Authentifizierung

Ich mag würde bekommen Daten aus Google-Tabelle mit Google Spreadsheet API Java-Bibliothek ohne Authentifizierung tun will. Die Google-Tabelle wird öffentlich veröffentlicht. Ich möchte die folgende Methode verwenden: com.google.gdata.data.spreadsheet.CustomElementCollection

-Ausgabe

CustomElementCollection Rückgabedaten mit Authentifizierung sammeln. Aber CustomElementCollection gibt null ohne Authentifizierung zurück.

Wie listEntry.getPlainTextContent() zeigt Daten, so denke ich, ich sollte in der Lage sein, die Daten in irgendeiner Weise zu bekommen.

-Quelle Code angebracht

Mit Authentifizierung: Auth.java

import java.net.URL; 
import java.util.List; 
import com.google.gdata.client.spreadsheet.ListQuery; 
import com.google.gdata.client.spreadsheet.SpreadsheetService; 
import com.google.gdata.data.spreadsheet.CustomElementCollection; 
import com.google.gdata.data.spreadsheet.ListEntry; 
import com.google.gdata.data.spreadsheet.ListFeed; 
import com.google.gdata.data.spreadsheet.SpreadsheetEntry; 
import com.google.gdata.data.spreadsheet.WorksheetEntry; 

public class Auth { 
    public static void main(String[] args) throws Exception{ 
     String applicationName = "AppName"; 
     String user = args[0]; 
     String pass = args[1]; 
     String key = args[2]; 
     String query = args[3]; 

     SpreadsheetService service = new SpreadsheetService(applicationName); 
     service.setUserCredentials(user, pass); //set client auth 

     URL entryUrl = new URL("http://spreadsheets.google.com/feeds/spreadsheets/" + key); 
     SpreadsheetEntry spreadsheetEntry = service.getEntry(entryUrl, SpreadsheetEntry.class); 
     WorksheetEntry worksheetEntry = spreadsheetEntry.getDefaultWorksheet(); 

     ListQuery listQuery = new ListQuery(worksheetEntry.getListFeedUrl()); 
     listQuery.setSpreadsheetQuery(query); 

     ListFeed listFeed = service.query(listQuery, ListFeed.class); 
     List<ListEntry> list = listFeed.getEntries(); 
     for(ListEntry listEntry : list) 
     { 
      System.out.println("content=[" + listEntry.getPlainTextContent() + "]"); 
      CustomElementCollection elements = listEntry.getCustomElements(); 
      System.out.println(
        " name=" + elements.getValue("name") + 
        " age=" + elements.getValue("age")); 
     } 
    } 
} 

Ohne Authentifizierung: NoAuth.java

import java.net.URL; 
import java.util.List; 
import com.google.gdata.client.spreadsheet.FeedURLFactory; 
import com.google.gdata.client.spreadsheet.ListQuery; 
import com.google.gdata.client.spreadsheet.SpreadsheetService; 
import com.google.gdata.data.spreadsheet.CustomElementCollection; 
import com.google.gdata.data.spreadsheet.ListEntry; 
import com.google.gdata.data.spreadsheet.ListFeed; 
import com.google.gdata.data.spreadsheet.WorksheetEntry; 
import com.google.gdata.data.spreadsheet.WorksheetFeed; 

public class NoAuth { 
    public static void main(String[] args) throws Exception{ 
     String applicationName = "AppName"; 
     String key = args[0]; 
     String query = args[1]; 

     SpreadsheetService service = new SpreadsheetService(applicationName); 

     URL url = FeedURLFactory.getDefault().getWorksheetFeedUrl(key, "public", "basic"); 

     WorksheetFeed feed = service.getFeed(url, WorksheetFeed.class); 
     List<WorksheetEntry> worksheetList = feed.getEntries(); 
     WorksheetEntry worksheetEntry = worksheetList.get(0); 

     ListQuery listQuery = new ListQuery(worksheetEntry.getListFeedUrl()); 
     listQuery.setSpreadsheetQuery(query); 

     ListFeed listFeed = service.query(listQuery, ListFeed.class); 
     List<ListEntry> list = listFeed.getEntries(); 
     for(ListEntry listEntry : list) 
     { 
      System.out.println("content=[" + listEntry.getPlainTextContent() + "]"); 
      CustomElementCollection elements = listEntry.getCustomElements(); 
      System.out.println(
        " name=" + elements.getValue("name") + 
        " age=" + elements.getValue("age")); 
     } 
    } 
} 

Google-Tabelle:

https://docs.google.com/spreadsheet/pub?key=0Ajawooo6A9OldHV0VHYzVVhTZlB6SHRjbGc5MG1CakE&output=html

-Ergebnis

ohne Authentifizierung

Gehalt = [Alter: 23] name = null Alter = null

mit Authentifizierung

Gehalt = [Alter: 23] name = Taro Alter = 23

Bitte lassen Sie mich wissen, die nützlichen Informationen, um das Problem zu vermeiden.

Antwort

3

Ich weiß nicht, warum es so funktioniert, aber wenn Sie mit Anmeldeinformationen nicht Anfrage zugreifen zu können, sind nicht in der Lage Zellen über abzurufen:

CustomElementCollection elements = listEntry.getCustomElements(); 
System.out.println(" name=" + elements.getValue("name") + " age=" + elements.getValue("age")); 

Ich habe es getestet und ich habe nur auf diese Weise zum abrufen von Daten gefunden:

List<ListEntry> list = listFeed.getEntries(); 
for (ListEntry row : list) { 
    System.out.println(row.getTitle().getPlainText() + "\t" 
      + row.getPlainTextContent()); 
} 

Er druckt:

Taro age: 23 
Hanako age: 16 

Wie Sie sehen, sollten Sie analysieren Text und r etrieve Alter von roh String.

+0

Vielen Dank für Ihre Zeit und Mühe! Ich werde es versuchen. – user2128521

+0

Bitte werfen Sie einen Blick auf die Antwort von euclio. Es erklärt, warum die Codes in der Frage nicht funktionieren. – xhe8

0

Ich fragte mich auch darüber. Ich habe mir den Feed angeschaut (fügen Sie einfach die URL zum Blatt in Chrome ein), und es scheint, als gäbe es kein XML-Markup und alle kommen unter dem <Inhalt> Tag. Es macht also Sinn, dass der Parser alles in den Textinhalt des BaseEntry einbindet (anstatt einen ListEntry zu machen).

2

Ich glaube, das Problem ist, dass Sie die "basic" Projektion für Ihre Tabelle verwenden. Wenn Sie die "values" Projektion verwenden, sollte alles wie erwartet funktionieren.

+0

Dies liefert keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klärung zu bitten, hinterlasse einen Kommentar unter seinem Beitrag - du kannst deine eigenen Beiträge jederzeit kommentieren, und sobald du genügend [Reputation] (http://stackoverflow.com/help/whats-reputation) hast, wirst du das tun in der Lage sein [jeden Beitrag kommentieren] (http://stackoverflow.com/help/privileges/comment). –

+3

Was meinst du? Die angenommene Antwort beantwortet die Frage sicher nicht. Der Wechsel von der Grundprojektion zur Werteprojektion behebt das Problem. – euclio

+0

Ich denke, das sollte die richtige Antwort sein. Ich habe es getestet. Die akzeptierte Antwort funktioniert irgendwie, aber sie erreicht nicht, was die ursprüngliche Frage wirklich will. – xhe8

Verwandte Themen