Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 从Google Web App中的doPost()重定向,带有应用程序脚本的HTML表单_Google Apps Script_Web Applications_Forms - Fatal编程技术网

Google apps script 从Google Web App中的doPost()重定向,带有应用程序脚本的HTML表单

Google apps script 从Google Web App中的doPost()重定向,带有应用程序脚本的HTML表单,google-apps-script,web-applications,forms,Google Apps Script,Web Applications,Forms,假设我有一个包含各种输入的HTML文件。根据这些输入,我想发送一封电子邮件,然后显示感谢信息或重定向到感谢页面 我正在doGet()中加载index.html文件,如下所示: function doGet(){ var template = HtmlService.createTemplateFromFile('index'); template.action = ScriptApp.getService().getUrl(); return template.evalu

假设我有一个包含各种输入的HTML文件。根据这些输入,我想发送一封电子邮件,然后显示感谢信息或重定向到感谢页面

我正在doGet()中加载index.html文件,如下所示:

function doGet(){
    var template = HtmlService.createTemplateFromFile('index');
    template.action = ScriptApp.getService().getUrl();
    return template.evaluate();
}
在doPost(e)函数中添加了我所需的实现,将代码部署到web应用程序中,填写表单并提交之后,除了最后一点之外,一切似乎都正常工作。我想显示一条输出消息,或者重定向到一个感谢页面,或者类似的东西,但我看到的只是一个空白页面,那里可能有HTML表单

我试过:

function doPost(e) {
    //all logic
    return ContentService.createTextOutput("Thank you");
}

在所有列出的例子中,HTML表单似乎都消失了,我只能看到一个空白屏幕


有什么想法吗?

在GAS中,通过web应用程序发送帖子请求并不像看上去那么简单。继续并尝试一个小实验:将以下JS代码添加到doGet()函数提供的HTML页面,就在结束标记之前:

。。。
控制台日志(窗口位置);
在控制台中检查输出时,可能会得到如下结果:

问题是以“/exec”结尾的web应用程序URL实际上没有链接到self。Ratner,googleusercontent.com链接是打开链接和表单时重定向到的URL。但是,为了让表单提交生效,POST请求应该发送到web应用程序的“已发布”URL(以“/exec”结尾的URL)

因此,您必须通过实现自己的路由来覆盖默认值。有许多方法可以实现此结果-以下是最简单的方法:

    <form method="post" action="<?!= ScriptApp.getService().getUrl() ?>">
    <input type="submit" value="submit">
    </form>

doPost(e)
显示如何调用此
doPost(e)
非常相关。请注意,仅仅因为它返回一些值并不意味着调用函数的代码使用函数的输出。根据官方文档:如果脚本满足以下要求,则可以将其发布为web应用程序:它包含doGet(e)或doPost(e)函数。。我能向你们展示更多信息的唯一方法,就是拍摄一段视频,记录我自己在问题中所做的一切。我很乐意提供更多细节,但是,很可能您从未使用过Google Web表单,因此不知道在提交表单时doPost(e)功能实际上会自动启动。您的HTML表单可能在表单标签中有一个按钮,该按钮会导致浏览器页面重新加载并删除显示的内容。这是HTML的一个内置设计功能,用于防止人们提交重复的内容。但是,对于设计HTML的人来说,它会导致您遇到的问题。有多种方法可以解决您的问题。如果表单标记中有一个
action
属性来发出post请求,则必须删除该属性。您不能在表单标记中使用submit按钮。如果您没有绑定来自应用程序脚本webapp的函数调用,即
google.Script.run.withSuccessHandler(yourClientSideFunction)。yourServerSideFunction(yourData)
,则您只需丢弃
yourServerSideFunction
的返回值。您已经加载了由
doGet()
函数返回的网页,除非您在客户端表单提交代码中指出客户端HTML应替换为其他输入HTML,否则不会发生这种情况。“如果你成功了,你会这么做的。”SandyGood谢谢你的回复。我已尝试删除该操作,doPost()被激发,但问题未得到解决。从表单标签中删除submit按钮不会在单击按钮时提交表单。表单如何在没有按钮的情况下提交?然后如何在doPost()末尾返回感谢消息?我尝试了原始问题中列出的所有方法,在所有情况下,除了最后一种情况:createTemplateHtmlFromFile,我仍然得到一个空页面。在本例中,我得到:Google Apps脚本已完成,但未返回任何内容您的问题中至少有3个不同版本的doPost()函数。我没办法知道你要回哪一个。在我的例子中,它显示doPost()函数提供的页面。另外,您的基本[目标]属性的值是多少?是否设置为“\u self”?在文件->管理版本下部署另一个版本,然后在发布下重新发布应用程序。此外,请检查浏览器中的控制台。您得到的消息意味着doPost()函数将被执行。但是,我怀疑您只是没有部署新版本。我有4个不同的版本,我用您的解决方案尝试了所有版本。我每次都会再版。在:HtmlService.createTemplateFromFile(“谢谢”)的情况下,我正在完成Google Apps脚本,但没有返回任何内容,在所有其他情况下,我会得到通常的空页面。我的第一个问题中的最后一个例子理论上可行吗?它们确实可行,至少在我的例子中是这样的——我在这个例子中测试了代码。你的“谢谢”文件看起来怎么样?另外,您的基本[“目标”]属性设置为什么?您的GS项目中是否有名为“谢谢”(区分大小写)的实际文件?(文件->新建->HTML文件)
function doPost(e) {
    //all logic
    var htmlBody = "<h1>Thank you.</h1>";
    return HtmlService.createHtmlOutput(htmlBody);
}
function doPost(e) {
    //all logic
    var template = HtmlService.createTemplateFromFile('Thanks');
    return template.evaluate();
}
... 
<script>
console.log(window.location);
</script>
</body>
    <form method="post" action="<?!= ScriptApp.getService().getUrl() ?>">
    <input type="submit" value="submit">
    </form>