假设我有一个包含各种输入的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");
}
和..
function doPost(e) {
//all logic
return ContentService.createTextOutput(JSON.stringify(e.parameter));
}
和..
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();
}
在所有列出的案例中,HTML表单似乎消失了,我只能看到一个空白屏幕。
有什么想法吗?
答案 0 :(得分:3)
在GAS中,通过网络应用程序发送POST请求并不像看起来那么简单。继续尝试一些实验:在关闭&lt; body&gt;之前,将以下JS代码添加到doGet()函数所服务的HTML页面中。标记:
<form method="post" action="<?!= ScriptApp.getService().getUrl() ?>">
<input type="submit" value="submit">
</form>
在控制台中检查输出时,您可能会得到类似的内容:
问题是以“/ exec”结尾的网络应用网址实际上并未链接到自己。 Ratner, googleusercontent.com 链接是您在打开链接和表单时将被重定向到的URL。但是,为了使表单提交工作,POST请求应该发送到您的Web应用程序的“已发布”URL(以'/ exec'结尾的那个)。
因此,您必须通过实施自己的路由来覆盖默认值。有很多方法可以实现这个结果 - 这是最简单的方法:
const punctuation = ['?', '.', '+'];
如果&lt;?!=?&gt;您看起来不熟悉的符号,请查看GAS中https://developers.google.com/apps-script/guides/html/templates
中有关scriptlet和HTML模板的部分基本上,会发生的事情是,在将原始HTML发送到您的浏览器进行渲染之前,会将Web应用程序URL强制打印到模板。这可确保您在“提交”事件发生时点击正确的网址。