我遇到了各种问题,但没有一个能解决我的问题。我在google app脚本中编写了一个简单的doPost()
代码:
function doPost(e){
Logger.log("Hello World");
}
然后我将其部署为网络应用程序并将网址粘贴到hurl.it上以发布帖子请求。但是,日志中没有记录任何内容,响应为200(确定)。我认为它不会进入这个doPost()
函数。任何人都可以指导我在这里做错了什么吗?
答案 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的关键。
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
这是我的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>