使用Javascript读/写Google Spreadsheet单元格Feed

时间:2012-11-08 09:42:54

标签: javascript jquery google-api google-sheets google-data-api

我尝试使用javascript的http请求在谷歌电子表格中读取和写入一个单元格。 “读取”操作有效,但“写入”操作失败。 请帮助指出我应该在我的“写”操作代码中修改哪一部分。

我所遵循的写作示例来自https://developers.google.com/google-apps/spreadsheets/, 它不起作用。

我的阅读操作(这是有效的):

http_request.onreadystatechange = function() {
    process_cellrw(http_request);
};
http_request.open('GET',"https://spreadsheets.google.com/feeds/cells/0Aqed....RHdGc/od6/private/full/R1C1", true);
http_request.setRequestHeader('Authorization','Bearer ' + strAccessToken);
http_request.send(null);

我的写操作(这不起作用):

var testxml =  ['&lt;entry xmlns="http://www.w3.org/2005/Atom" <br>
    xmlns:gs="http://schemas.google.com/spreadsheets/2006"&gt;',<br>
    '&lt;id>https://spreadsheets.google.com/feeds/cells/0Aqed....RHdGc/od6/private/full/R1C1&lt;/id&gt;',<br>
    '&lt;link rel="edit" type="application/atom+xml"<br> href="https://spreadsheets.google.com/feeds/cells/0Aqed....RHdGc/od6/private/full/R1C2/9zlgi"/&gt;',<br>
    '&lt;gs:cell row="1" col="1" inputValue="xxxx"/&gt;',<br>
    '&lt;/entry&gt;'].join('');<br>

http_request.onreadystatechange = function() {
    process_cellrw();
};

http_request.open('PUT',"https://spreadsheets.google.com/feeds/cells/0Aqed....RHdGc/od6/private/full/R1C2/9zlgi");
http_request.setRequestHeader('Authorization','Bearer ' + strAccessToken);
http_request.setRequestHeader('GData-Version','3.0');
http_request.setRequestHeader('Content-Type', 'application/atom+xml');
http_request.setRequestHeader('If-Match','*');
http_request.setRequestHeader('Content-Length', testxml.length.toString());
http_request.send(testxml);

写操作始终在回调函数http_request.status = 0接收process_cellrw()

我的环境是Windows 7 + Chrome浏览器。我也在Android + Webkit上测试过,但仍然失败。

我还测试过按列表Feed添加行,也因接收http_request.status = 0而失败。

2 个答案:

答案 0 :(得分:0)

我知道这不能解答您的问题,但我会打开Chrome“开发人员工具”,转到“网络”并检查谷歌针对API调用的响应。它可能包含解释失败的标题......

答案 1 :(得分:0)

我找到了根本原因:docs.googole.com和spreadsheets.google.com不支持跨域XMLHttpRequest POST / PUT

XMLHttpRequest POST / PUT将首先向另一个域上的资源发送HTTP OPTIONS请求标头,以确定实际请求是否可以安全发送。但docs.googole.com和preadsheets.google.com始终会针对此请求回复“404 Not Found”。这就是为什么我总是在回调函数http_request.status = 0收到process_cellrw()

一种解决方案是使用另一个允许跨域HTTP请求的CGI,例如PHP。 另一个解决方案是使用函数UrlFetchApp实现写操作以在Google Apps Script中发送HTTP PUT请求,然后我们可以使用XMLHttpRequest GET来触发此Apps脚本。