javascript - 使用表格 API 和 XMLHttpRequest 将请求正文发送到 google 表格

标签 javascript qt xmlhttprequest qml google-sheets-api

对于上下文,我正在 Qt QML 中做一个小型应用程序,它需要将数据读/写到 google 工作表中。阅读部分工作正常,但是我在使用 google sheets API V4 中的“sheets.spreadsheets.values.append”函数时遇到了问题(可以在此处找到文档:https://developers.google.com/sheets/api/reference/rest/)

下面的 Javascript 函数将此 URL 作为参数:https://sheets.googleapis.com/v4/spreadsheets/{SHEET-ID}/values/A2:ZZ:append?valueInputOption=RAW&key={API -KEY

作为参数传递的请求体是这个:

{
 "majorDimension": "ROWS",
 "values": [
  [
   "15:41 02/08/2019",
   "Steven",
   "20",
   "Male",
   "test@mail.com",
   "FooBar"
  ]
 ]
}

调用执行 POST 的函数:

function postReq(url, callback, request = null) {
    var xhr = new XMLHttpRequest();
    xhr.open("POST", url);
    xhr.onload = function (e) {
        if (e) console.log(e);
        if (xhr.readyState === 4) {
            if (xhr.status === 200) {
                console.log(xhr.responseText);
                callback(xhr.responseText.toString());
            } else {
                callback(null);
                console.log(xhr.status);
            }
        } else {
            console.log(xhr.status);
        };
    };
    xhr.send(request);
};

这总是会返回一个 401 响应代码,即使我将工作表发布到 Web 并且 API key 不应该是问题,因为它在读取数据时工作正常(我确保工作表也是可编辑的)。

最佳答案

  • 您想使用 Sheets API 的 values.append 方法追加行。
  • 您正在为此使用 API key 。
  • 已在 API 控制台启用 Sheets API。

如果我的理解是正确的,这个修改怎么样?请将此视为几个答案之一。

修改点:

  • 很遗憾,API key 不能用于 POST 方法。 API key 只能用于 GET 方法。因此,请使用 OAuth2 和服务帐户检索到的访问 token 。
  • 对于您的脚本,请将请求正文作为内容类型的 application/json 发送。

修改后的脚本:

作为使用访问 token 的脚本,我修改了你的脚本如下。在使用它之前,请设置您的访问 token 。

function postReq(url, callback, request = null) {
    const accessToken = "###"; // <--- Please set your access token here.

    // Sample request body?
    var request = {
     "majorDimension": "ROWS",
     "values": [
      [
       "15:41 02/08/2019",
       "Steven",
       "20",
       "Male",
       "test@mail.com",
       "FooBar"
      ]
     ]
    };

    var xhr = new XMLHttpRequest();
    xhr.open("POST", url);
    xhr.setRequestHeader('Authorization', 'Bearer ' + accessToken); // Added
    xhr.setRequestHeader('Content-Type', 'application/json'); // Added
    xhr.onload = function (e) {
        if (e) console.log(e);
        if (xhr.readyState === 4) {
            if (xhr.status === 200) {
                console.log(xhr.responseText);
                callback(xhr.responseText.toString());
            } else {
                callback(null);
                console.log(xhr.status);
            }
        } else {
            console.log(xhr.status);
        };
    };
    xhr.send(JSON.stringify(request)); // Modified
};

备注:

  • 以上修改后的脚本,在我的环境中,我可以确认它有效。

引用资料:

如果我误解了您的问题并且这不是您想要的方向,我深表歉意。

关于javascript - 使用表格 API 和 XMLHttpRequest 将请求正文发送到 google 表格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57331104/

相关文章:

JavaScript 未完成循环

c++ - Qt Creator 构建项目 - 没有这样的文件或目录

qt - "file.open(QIODevice::ReadOnly)"是什么意思?

javascript - 使用 XMLHttpRequest 抑制控制台错误

javascript - Google Maps API v3 中是否有等效的 GDownloadUrl 函数

javascript - 在 Chrome 扩展中使用图像 Sprite 有意义吗?

javascript - 如何将数组从 HTML 传递到 Javascript?

javascript - Typescript 声明的静态类方法不是函数

javascript - .after 方法在 jQuery 1.9.1 中断开连接的 DOM 元素上的预期行为

css - 如何使用 CSS 在 Qt4 中悬停/按下时设置 PushButton 的图像大小