doPost无法在Google应用脚本中使用

时间:2017-07-18 10:04:27

标签: post google-apps-script

我遇到了各种问题,但没有一个能解决我的问题。我在google app脚本中编写了一个简单的doPost()代码:

function doPost(e){
  Logger.log("Hello World");
}

然后我将其部署为网络应用程序并将网址粘贴到hurl.it上以发布帖子请求。但是,日志中没有记录任何内容,响应为200(确定)。我认为它不会进入这个doPost()函数。任何人都可以指导我在这里做错了什么吗?

4 个答案:

答案 0 :(得分:8)

您的实施不符合网络应用程序所需的所有要求。以下是文档摘录(link):

  

网络应用的要求

     

如果脚本满足以下要求,则可以将其发布为Web应用程序:

     
      
  • 它包含doGet(e)doPost(e)函数。
  •   
  • 该函数返回HTML服务HtmlOutput对象或内容服务TextOutput对象。
  •   

以下是一些例子:

function doGet(e) {
  var params = JSON.stringify(e);
  return HtmlService.createHtmlOutput(params);
}

function doPost(e) {
  return ContentService.createTextOutput(JSON.stringify(e.parameter));
}

为了完整起见,每次更改代码时,还必须将Web App重新部署为新版本。在现有版本下重新部署不起作用,您必须为更改设置新版本才能生效。

同样使用标准Logger.log跟踪doGet(e)doPost(e)内的更改对于网络应用来说是不可靠的,因为它们是异步执行的。我建议您将输出记录到电子表格中。有一个很棒的脚本库叫做BetterLog,它扩展了Logger API来做到这一点;它可以在以下链接中找到:

https://github.com/peterherrmann/BetterLog

更新2018-07-18

Apps脚本现在支持StackDriver Logging,可从Apps Scripts编辑器的View菜单访问。

答案 1 :(得分:4)

要使已发布的Web应用程序URL的“exec”版本与任何新更改一起运行,您必须发布一个新版本每次您对脚本进行更改。变化有多小并不重要。我不会使用Logger.log("Hello World");而是将值写入电子表格。

SpreadsheetApp.openById(id).getSheetByName(name).appendRow(['test']);

您的网络应用程序有2个不同的URL。最后一个是“dev”,另一个是“exec”。 'dev'版本始终是当前代码。除非您发布新版本,否则'exec'版本永远不会更改。

答案 2 :(得分:1)

我为此而苦苦挣扎,最终我很幸运。 我大量使用w3schools,因此我充分阅读了form元素及其属性。 ACTION属性似乎是让doPost(e)适用于我和GAS的关键。

  1. 这是我的HTML(已删除了打开和关闭尖括号)
form 
action="https://script.google.com/a/[org]/macros/s/[scriptID]/exec" 
method="post" target="_blank" >

        First name: input type="text" name="fname"
Last name: input type="text" name="lname"
input type="submit" value="Submit" form
  1. 这是我的doPost(运行Logger以及显示e.parameter的新窗口)

    function doPost(e){
        Logger.log("I WAS RAN!!")
        if(typeof e !== 'undefined') {
            return ContentService.createTextOutput(JSON.stringify(e.parameter));
        }
    

    }

答案 3 :(得分:0)

原因之一可能是您正在使用像Postman这样的Rest客户端。它不起作用,尽管我不知道为什么。

尝试使用这种普通形式,它将起作用:

<!DOCTYPE html>
<html>
<body>

<form action="https://script.google.com/macros/s/AKfyc.../exec">
  First name:<br>
  <input type="text" name="param1" value="ABC">
  <br>
  Last name:<br>
  <input type="text" name="param2" value="XYZ">
  <br><br>
  <input type="submit" value="Submit">
</form> 

</body>
</html>