javascript - 功能未按预期执行。我希望页面切换到“设置”,但这不会发生
问题描述
我正在 GAS HTML 上创建一个非常基本的登录功能。在我的 HTML 中,我有一个表单,它收集和存储带有分配变量(fn、ln、em、pw)的用户输入。然后它将信息发送到工作表(具有验证凭据的公式),然后某个单元格('E2')将显示“找到”或“未找到”。if
如果语句为假,它将在单元格('E1')中打印名称。这部分确实执行正确,但是 2 个函数,render('setup')
并且notFound()
不会执行(无论if
语句是真还是假,都不起作用。
我知道该render('setup')
函数doGet
在其他函数中调用时运行良好。
function signIn(fn,ln,em,pw) {
var url = 'www.somelink.com'
var ss = SpreadsheetApp.openByUrl(url);
var login = ss.getSheetByName('login');
var fname = login.getRange('F1');
var lname = login.getRange('G1');
var email = login.getRange('H1');
var pword = login.getRange('I1');
fname.setValue(fn);
lname.setValue(ln);
email.setValue(em);
pword.setValue(pw);
var check = login.getRange('E2').getDisplayValue();
var name = login.getRange('F2').getDisplayValue();
if (check === "Not Found"){
return notFound(); // THIS DOESN'T EXECUTE
} else {
login.getRange('E1').setValue(name);
return render('setup'); // AND THIS DOESN'T EXECUTE
}
}
编辑:调用signIn
函数的 HTML。
<div class="button" align="center">
<button id="submit" class="btn waves-effect waves-light" onclick="var fn = document.getElementById('first_name').value;
var ln = document.getElementById('last_name').value;
var em = document.getElementById('email').value;
var pw = document.getElementById('password').value;
google.script.run.signIn(fn,ln,em,pw)">Submit
<i class="material-icons right">send</i>
</button>
解决方案
如果我理解正确,您希望您的网络应用程序在提交值后将用户重定向到另一个 HTML 页面(如果满足某些条件)。
您不能仅通过从客户端调用服务器端函数来做到这一点:google.script.run用于检索客户端上不可用的数据,但不用于呈现不同的 HTML 文件。
你可以做的是以下内容:
- 不是返回一个函数(如
render
ornotFound
),而是返回一个可以在客户端使用的参数。例如,您可以这样做:
function signIn(fn,ln,em,pw) {
// Rest of your code
if (check === "Not Found") {
return "notFound";
} else {
return "setup";
}
}
- 多亏了withSuccessHandler(function) ,您的客户端函数(我称之为
callSignIn
)然后可以将此返回的参数传递给另一个名为的函数(此处理程序是必要的,因为它本身将始终返回):redirect
google.script.run.signIn(fn,ln,em,pw)
void
function callSignIn() {
var fn = document.getElementById('first_name').value;
// Rest of your code
google.script.run.withSuccessHandler(refresh).signIn(fn,ln,em,pw);
}
- 接下来,返回的值
signIn
作为函数的参数传递,如果参数是,则使用window.openrefresh
刷新 Web 应用程序,同时作为查询参数 ( )传递,稍后可以由(您可以从服务器端动态检索 Web 应用程序 URL,而不是手动编写它 - 请参阅此答案):setup
setup
pageRedirect
event parameter
function refresh(redirectPage) {
if (redirectPage === "setup") {
window.open("https://script.google.com/macros/s/{your-web-app-id}/exec?pageRedirect=" + redirectPage, "_top");
} else {
// Whatever you want to do if "notFound"
}
}
- 最后,回到服务器端,该函数
doGet
被来自的GET
请求调用window.open
。e.parameter
这个函数可以通过事件对象检查请求中是否有查询参数,并根据这个参数渲染不同的页面:
function doGet(e) {
if (!e.parameter.pageRedirect) {
return HtmlService.createHtmlOutputFromFile("index");
} else {
return HtmlService.createHtmlOutputFromFile(e.parameter.pageRedirect)
}
}
参考:
推荐阅读
- ruby-on-rails - 无法为我不使用的格式拯救 ActionController::UnknownFormat
- php - 使用 php Doctrine,有没有办法通过具有不同排序规则的两列来建立关系?
- autohotkey - 使用 AutoHotKey 编写一系列简单的键盘快捷键
- python - 如何使用 Beautiful Soup 提取 div 的内容(图像)
- android - Xamarin Android:如何将按钮添加到 recyclerview
- android - Android Worker PeriodicWorkRequest 错误
- javascript - 如何在 jQuery 调用函数中从 php 获取错误消息?
- r - 通过合并 R 中的两个现有列来创建一个新列
- node.js - 在js中循环创建不同的对象
- django - 关于postgreSql的安装问题