【问题标题】:How to take data in google sheet script via POST request in JSON format?如何通过 JSON 格式的 POST 请求在 google sheet 脚本中获取数据?
【发布时间】:2018-10-26 12:04:05
【问题描述】:

这个问题是关于从某个地方接收 POST 请求。我正在寻找一个可以从 POST 请求中以 JSON 格式获取和处理数据的 google sheet 脚本函数。你能举个例子吗?

POST 请求在这里:

https://script.google.com/macros/s/BOdirjv45Dn6FHrx_4GUguuS6NJxnSEeviMHm3HerJl4UsDBnDgfFPO/

{
  "p1": "writeTitle",
  "p2": [[URL]],
  "p3": [[PIC_A]],
  "p4": [[PIC_B]],
  "p5": [[TITLE]]
}

application/json

doPost() 不起作用:

doPost(e) {
var json = JSON.parse(e.postData.contents);
Logger.log(json);
}

【问题讨论】:

  • Apps Script 具有保留函数名称 doGet()doPost(),它们是对 Apps Script Web App 的已发布 Url 发出的 GET 和 POST 请求的事件侦听器。您可以将脚本发布为绑定到 Google Sheet 的 Apps Script Web App。 (或文档或表单)因此,要从某个外部源发出的 POST 请求中运行代码,您需要创建一个 doPost(e) 函数。参数e 将接收来自 POST 请求的负载对象。请参阅 Apps 脚本文档中的“事件对象”。
  • @Sandy 好的,谢谢!我仍然不明白如何访问已发送的数据?我做了 doPost(e) { var json = JSON.parse(e.postData.contents);记录器.log(json); },它什么也没显示。
  • 记录 e 的值 - Logger.log(typeof e) Logger.log(JSON.stringify(e)) 此外,您必须在每次更改代码时将脚本发布为 Web 应用程序.
  • @Sandy 好的,非常感谢!在发送 POST 请求之前,我将 JSON.stringify 添加到我的初始 json 中,它可以工作。但是当我尝试记录 Logger.log(typeof e) 时,我看到:“未找到日志。使用 Logger API 将日志添加到您的项目。”

标签: post google-apps-script google-sheets http-post


【解决方案1】:
  • 您想从请求正文中检索作为对象的值。
  • 您已经部署了 Web 应用程序。

如果我对你的情况的理解是正确的,那么这次修改怎么样?

发布和检索对象:

作为示例,我使用以下 curl 命令发布到 Web 应用程序。

curl -L \
-H 'Content-Type:application/json' \
-d '{"p1": "writeTitle","p2": "[[URL]]","p3": "[[PIC_A]]","p4": "[[PIC_B]]","p5": "[[TITLE]]"}' \
"https://script.google.com/macros/s/#####/exec"

运行上述命令时,doPost(e) 中的e 如下。

{
  "parameter": {},
  "contextPath": "",
  "contentLength": 90,
  "queryString": "",
  "parameters": {},
  "postData": {
    "type": "application/json",
    "length": 90,
    "contents": "{\"p1\": \"writeTitle\",\"p2\": \"[[URL]]\",\"p3\": \"[[PIC_A]]\",\"p4\": \"[[PIC_B]]\",\"p5\": \"[[TITLE]]\"}",
    "name": "postData"
  }
}

发布的有效载荷可以通过e.postData 检索。从上面的响应中,发现e.postData.contents可以检索到你想要的值。顺便说一下,当查询参数和有效载荷如下给出时,

curl -L \
-H 'Content-Type:application/json' \
-d '{"p1": "writeTitle","p2": "[[URL]]","p3": "[[PIC_A]]","p4": "[[PIC_B]]","p5": "[[TITLE]]"}' \
"https://script.google.com/macros/s/#####/exec?key=value"

value 可以通过e.parametere.parameters 检索。并且payload可以通过e.postData.contents获取。

修改后的脚本:

在这个修改后的脚本中,可以在 Stackdriver 上看到结果,也可以返回结果。

function doPost(e) {
  var json = JSON.parse(e.postData.contents);
  console.log(json);
  return ContentService.createTextOutput(JSON.stringify(json));
}

注意:

  • 当您修改了 Web Apps 脚本时,请将其重新部署为新版本。这样,最新的脚本就会反映到 Web 应用程序中。这一点很重要。

参考:

如果这不是你想要的,我很抱歉。

【讨论】:

  • 非常感谢!在发送 POST 请求之前,我将 JSON.stringify 添加到我的初始 json 中,它可以工作。我可以使用 doPost 函数取回这些数据。但是我还是看不到日志:console.log(json);不显示任何内容。
  • 未找到日志。使用 Logger API 将日志添加到您的项目。
  • @Neret 感谢您的回复。我很高兴你的问题得到了解决。 Stackdriver官方文档可以在here查看。
  • @I'-'我感谢您的支持。
猜你喜欢
  • 1970-01-01
  • 2013-10-12
  • 1970-01-01
  • 1970-01-01
  • 2020-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-23
相关资源
最近更新 更多