我使用Google Docs .NET API编写了一个C#程序,根据用户名,密码,电子表格名称和工作表名称将Google工作表读入DataTable。这一切都运行正常,但编程模型似乎围绕为电子表格服务提供一组凭证,然后削减结果Feed以获得特定的电子表格/工作表,即
SpreadsheetsService service = new SpreadsheetsService("Application-Name");
service.setUserCredentials(userName, password);
SpreadsheetQuery spreadsheetQuery = new SpreadsheetQuery();
SpreadsheetFeed spreadsheetFeed = service.Query(spreadsheetQuery);
SpreadsheetEntry spreadsheetEntry = (SpreadsheetEntry)(from entries in spreadsheetFeed.Entries
where entries.Title.Text == spreadsheetName
select entries).SingleOrDefault();
现在,我有兴趣扩展我的程序功能,以便从公开的Google电子表格中读取。也就是说,给定公共Google电子表格的网址(例如“https://spreadsheets.google.com/ccc?key=BUNCH_OF_LETTERS_HERE&hl=en”),我想获得与该文档相对应的SpreadsheetEntry对象。
到目前为止我一直使用的方法显然似乎没有扩展到允许这样做,所以我想知道是否有人知道通过他们的API访问公共Google文档的正确方法?
答案 0 :(得分:4)
您可以只检索公共页面,然后解析行的HTML源代码。
请求标题:
GET https://docs.google.com/spreadsheet/ccc?key=0Au1XehjMeFfYdEE2d0RDSk1FMEMtRjM0MmllUWdoTkE HTTP/1.1
Host: docs.google.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.120 Safari/535.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate,sdch
Accept-Language: tr-TR,tr;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: ISO-8859-9,utf-8;q=0.7,*;q=0.3
Cookie: PREF=ID=68126eb9eb12adef:FF=0:TM=1331371284:LM=1331371284:S=Bkm9mYX8pYy9a4h9
电子表格网格 - 列标签:
<table class="waffle" cellspacing="0" cellpadding="0">
<thead><tr>
<th class="row-header freezebar-top-left"></th>
<th style="width:120px" class="column-headers-background">A</th>
<th style="width:120px" class="column-headers-background">B</th>
<th style="width:120px" class="column-headers-background">C</th>
</tr></thead>
<tbody>
第一行作为用户定义的列名:
<tr style='height:16px;'>
<th style="height: 16px;" class="row-headers-background"><div class="row-header-wrapper" style="height: 16px;">1</div></th>
<td class="g-0-GjugEgs0" dir="auto-ltr">username</td>
<td class="g-0-GjugEgs0" dir="auto-ltr">create</td>
<td class="g-0-GjugEgs0" dir="auto-ltr">expire</td>
</tr>
其余行作为用户数据: 行号:
<tr style='height:16px;'>
<th style="height: 16px;" class="row-headers-background"><div class="row-header-wrapper" style="height: 16px;">2</div></th>
行数据单元格:
<td class="g-0-GjugEgs2">3600001</td>
<td class="g-0-GjugEgs2">2012</td>
<td class="g-0-GjugEgs2">2013</td>
</tr>
您可以使用Html Agility Pack或您自己的解析器。
另一种选择是将公开电子表格下载为CSV或文本格式的文件
文件下载请求标题:
GET https://docs.google.com/spreadsheet/fm?id=tA6wDCJME0C-F342ieQghNA.PREF_08255578241116458508.3736592253424693644&fmcmd=23&gid=0 HTTP/1.1
Host: docs.google.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.120 Safari/535.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Referer: https://docs.google.com/spreadsheet/ccc?key=0Au1XehjMeFfYdEE2d0RDSk1FMEMtRjM0MmllUWdoTkE
Accept-Encoding: gzip,deflate,sdch
Accept-Language: tr-TR,tr;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: ISO-8859-9,utf-8;q=0.7,*;q=0.3
Cookie: PREF=ID=68126eb9eb12adef:FF=0:TM=1331371284:LM=1331371284:S=Bkm9mYX8pYy9a4h9; lbcs=0
请注意 id 参数。您必须从html源中提取它,如下所示:
...
var mergedConfig = {"formToken":"Kg2uOS1UniIe0yFks5zcDZDsGQ=","formStatus":false,"id":"tA6wDCJME0C-F342ieQghNA.PREF_08255578241116458508.3736592253424693644",
...
我使用Fiddler来捕获包括SSL加密消息在内的通信。
答案 1 :(得分:1)
Google文档列表API doesn't seem setup for that(请参阅ahab的回答)。
答案 2 :(得分:0)
我试图读取具有多个标签的电子表格,而当我实现这些其他答案(即直接向网页提出网页请求)时返回的html和javascript几乎是不可读的。经过进一步的挖掘,我发现,如果您确实想获取公共Google电子表格的值而不必处理任何OAuth内容,则首先需要转到https://console.developers.google.com/apis,创建一个项目,转到仪表板,并转到凭据,单击“创建凭据”并设置新的服务帐户密钥(选择json并保存json文件。然后可以使用它来获取任何公共电子表格):
using Google.Apis.Auth.OAuth2;
using Google.Apis.Sheets.v4;
using Google.Apis.Sheets.v4.Data;
using Google.Apis.Services;
GoogleCredential credential;
string spreadSheetId = "k3k5j5nh4h43j5ktb4gf5h5l5"; //https://docs.google.com/spreadsheets/d/k3k5j5nh4h43j5ktb4gf5h5l5/
using(var stream = new FileStream('YOUR_JSON_FILE_PATH', FileMode.Open, FileAccess.Read))
{
credential = GoogleCredential.FromStream(stream).CreateScoped(SheetsService.Scope.SpreadsheetsReadonly);
var sheetsService = new SheetsService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "You application name",
});
var range = "A:B";
var request = sheetsService.Spreadsheets.Values.Get(spreadSheetId, range);
ValueRange response = request.Execute();
}