通过API向Google Spreadsheet添加行

时间:2015-01-16 01:18:18

标签: ajax google-chrome-extension xmlhttprequest google-spreadsheet-api

我正在构建一个Chrome扩展程序,它应该将新行写入Google电子表格。我设法阅读工作表内容,但无法写一个额外的行。目前我的错误是" 400(错误请求)"。知道我在这里做错了吗?

我在此处查看了Google Sheets API documentation和其他已发布的问题,但无法找到任何解决方案。

以下是我用来获取工作表内容的代码(这可行):

function loadSpreadsheet(token) {

    var y = new XMLHttpRequest();
    y.open('GET', 'https://spreadsheets.google.com/feeds/list/spreadsheet_id/default/private/values?access_token=' + token);
    y.onload = function() {
        console.log(y.response);
    };
    y.send();

}

这是我尝试发布新行的代码(给我" 400 - 错误请求"):

function appendRow(token){

    function constructAtomXML(foo){
        var atom = ["<?xml version='1.0' encoding='UTF-8'?>",
            '<entry xmlns="http://www.w3.org/2005/Atom" xmlns:gsx="http://schemas.google.com/spreadsheets/2006/extended">',//'--END_OF_PART\r\n',
            '<gsx:name>',foo,'</gsx:name>',//'--END_OF_PART\r\n',
            '</entry>'].join('');
        return atom;
    };

    var params = {
        'body': constructAtomXML("foo")
    };

    url = 'https://spreadsheets.google.com/feeds/list/spreadsheet_id/default/private/full?alt=json&access_token=' + token;

    var z = new XMLHttpRequest();
    z.open("POST", url, true);
    z.setRequestHeader("Content-type", "application/atom+xml");
    z.setRequestHeader("GData-Version", "3.0");
    z.setRequestHeader("Authorization", 'Bearer '+ token);
    z.onreadystatechange = function() {//Call a function when the state changes.
        if(z.readyState == 4 && z.status == 200) {
            alert(z.responseText);
        }
    }
    z.send(params); 

}

注意: spreadsheet_id 是我实际工作表ID的占位符。

1 个答案:

答案 0 :(得分:3)

遵循协议并使其有效。

假设电子表格ID为&#39; 1TCLgzG-AFsERoibIUOUUE8aNftoE7476TWYKqXQ0xb8&#39;

首先使用电子表格ID检索工作表列表:

获取https://spreadsheets.google.com/feeds/worksheets/1TCLgzG-AFsERoibIUOUUE8aNftoE7476TWYKqXQ0xb8/private/full?alt=json

在那里,您可以阅读工作表及其ID的列表。让我们使用示例中的第一个工作表。您将在feed > entry[0] > link数组中找到其ID。寻找&#34; rel&#34;等于&#39; http://schemas.google.com/spreadsheets/2006#listfeed&#39;

在我的示例中,此工作表的URL是(工作表URL):https://spreadsheets.google.com/feeds/list/1TCLgzG-AFsERoibIUOUUE8aNftoE7476TWYKqXQ0xb8/ofs6ake/private/full

现在,要阅读其内容使用:

获取[工作表网址]?alt = json

除了列表行Feed之外,您还会找到一个&#34;帖子&#34;应使用列表行Feed更改电子表格的URL。它是&#34; rel&#34;等于&#34; http://schemas.google.com/g/2005#post&#34;在feed > link下。

它与GET请求的URL相同。就我而言:https://spreadsheets.google.com/feeds/list/1TCLgzG-AFsERoibIUOUUE8aNftoE7476TWYKqXQ0xb8/ofs6ake/private/full。请务必不要追加alt = json。

现在,要使用list-row feed插入新行,您需要发送带有docs中指定的有效负载的POST。您需要发送一个前缀为&#34; gsx:&#34;的列名。作为标签名称。但是,它可能与电子表格中的列名称不同。你需要删除任何空格,使其全部小写,没有任何国家字符。因此,要使您的示例正常工作,您需要将<gsx:Name>替换为<gsx:name>。 在更改之前,您可能有以下有效内容消息:

  

无法写入空行;改为使用删除。

这是因为API并不了解&#34; Name&#34;它只是从请求中删除了这部分条目。没有它,就没有更多的项目,而且这行是空白的。

或者,您可以从GET响应中读取列名称。 feed > entry数组中以gsk$开头的对象中的键是列定义($ sign后面的所有内容都是列名)。

=============================================== ==================

修改

回答评论中的问题。

我从你的例子中改变了两件事:

function appendRow(token){

    function constructAtomXML(foo){
        var atom = ["<?xml version='1.0' encoding='UTF-8'?>",
            '<entry xmlns="http://www.w3.org/2005/Atom" xmlns:gsx="http://schemas.google.com/spreadsheets/2006/extended">',
            '<gsx:name>',foo,'</gsx:name>',
            '</entry>'].join('');
        return atom;
    };

    /*
    var params = {
        'body': constructAtomXML("foo")
    };
    */
    var params = constructAtomXML("foo");

    url = 'https://spreadsheets.google.com/feeds/list/'+spredsheetId+'/default/private/full?alt=json&access_token=' + token;

    var z = new XMLHttpRequest();
    z.open("POST", url, true);
    z.setRequestHeader("Content-type", "application/atom+xml");
    z.setRequestHeader("GData-Version", "3.0");
    z.setRequestHeader("Authorization", 'Bearer '+ token);
    z.onreadystatechange = function() {//Call a function when the state changes.
        if(z.readyState == 4 && z.status == 200) {
            alert(z.responseText);
        }
    }
    z.send(params); 
}

1)<gsx:Name><gsx:name>。没有它,您将收到错误。 2)params对象应该是一个字符串!不是某个身体&#39;的对象。键。您只需要传递要发送到服务器的值。