9

-Co chcę zrobićJak zdobyć publiczne dane z arkusza kalkulacyjnego Google za pomocą Google biblioteki API Java bez uwierzytelniania

chciałbym uzyskać dane z arkusza kalkulacyjnego Google z wykorzystaniem arkusza kalkulacyjnego Google API biblioteki Java bez uwierzytelniania. Arkusz kalkulacyjny Google jest publikowany publicznie. ja posługiwać się w następujący sposób: com.google.gdata.data.spreadsheet.CustomElementCollection

-Issue

CustomElementCollection powrotu zbierać dane z uwierzytelniania. Ale funkcja CustomElementCollection zwraca wartość null bez uwierzytelnienia.

Ponieważ listEntry.getPlainTextContent() pokazuje dane, więc myślę, że powinienem być w stanie uzyskać dane w dowolny sposób.

kod -source dołączony

Z uwierzytelniania: 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")); 
     } 
    } 
} 

bez uwierzytelniania: 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")); 
     } 
    } 
} 

kalkulacyjny Google:

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

-Result

bez uwierzytelnienia

= zawartość [wiek: 23] nazwa = NULL wiek = NULL

z uwierzytelniania

= zawartość [wiek: 23] nazwa = taro wiek = 23

Proszę dać mi znać przydatne informacje, aby uniknąć problemu.

Odpowiedz

3

Nie wiem, dlaczego to działa tak, ale gdy użytkownik nie korzysta z poświadczeniami wniosek, że nie jesteś w stanie pobrać komórki poprzez:

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

Przetestowałem go i mam znaleziono tylko w ten sposób, aby pobrać dane:

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

drukuje:

Taro age: 23 
Hanako age: 16 

Jak widać, należy przeanalizować tekst i R wiek od surowego String.

+0

Dziękuję za poświęcony czas i wysiłek! Spróbuję. – user2128521

+0

Proszę spojrzeć na odpowiedź euclio. Wyjaśnia, dlaczego kody w pytaniu nie działają. – xhe8

0

Zastanawiam się również nad tym. Spojrzałem na nadchodzący kanał (po prostu wklej adres URL do arkusza w Chrome) i wygląda na to, że nie ma żadnych znaczników XML i wszystkie są umieszczane pod znacznikiem < treści >. Ma więc sens, że parser wrzuca wszystko do treści tekstowej BaseEntry (zamiast tworzyć ListEntry).

2

Uważam, że problem polega na tym, że używasz projekcji "basic" dla swojego arkusza kalkulacyjnego. Jeśli używasz projekcji "values", wszystko powinno działać zgodnie z oczekiwaniami.

+0

Nie zapewnia to odpowiedzi na pytanie. Aby skrytykować lub poprosić o wyjaśnienie od autora, zostaw komentarz pod swoim postem - zawsze możesz komentować swoje posty, a gdy już masz wystarczającą [reputację] (http://stackoverflow.com/help/whats-reputation), być w stanie [komentować dowolny wpis] (http://stackoverflow.com/help/privileges/comment). –

+3

Co masz na myśli? Przyjęta odpowiedź z pewnością nie odpowiada na pytanie. Przejście od podstawowej projekcji do wartości projekcji rozwiązuje problem. – euclio

+0

Myślę, że to powinna być właściwa odpowiedź. Przetestowałem to. Przyjęta odpowiedź jest w pewnym sensie działająca, ale nie spełnia tego, czego naprawdę chce oryginalne pytanie. – xhe8

Powiązane problemy