Google 应用程序脚本,onclick 和 href 之间的优先级
Google apps script, priority between onclick and href
我有一个按钮(在 HTML 中),它既调用函数 LoginInfoInput(...)
又重定向到页面 (href="..."
) ,即:
<a onclick="LoginInfoInput('<?!= userID; ?>')" href="<?= ScriptApp.getService().getUrl(); ?>?v=form&userID=<?!= userID; ?>" class="waves-effect waves-light btn-large">Log In</a>
,
其中 LoginInfoInput(...)
是一个 javascript 函数,它将触发我的 google 应用程序脚本 (GS) 函数。然后,触发的 GS 函数会将数据插入到我的电子表格中。同时,重定向的 URL 将通过我的 doGet()
函数。为了确定结果,它从我的电子表格中获取数据。我的问题是电子表格并不总是在重定向页面采取行动之前及时更新。
我尝试通过 while 循环 wait/pause 来解决这个问题。然而,当 while 循环处于活动状态时,数据在电子表格中变得可用(至少在视觉上)不起作用,即,无法访问感兴趣的数据。请注意,我还在 while 循环期间添加了更新存储电子表格数据的变量的选项(调用 SpreadsheetApp.openByUrl(url)),但是没有任何改进。
更新
我的LoginInfoInput()
(在JavaScript)如下:
function LoginInfoInput(userID){
var userLO = document.getElementById("id_loginLO").value;
var userPassword = document.getElementById("id_password").value;
google.script.run.LoginAdd(userLO, userPassword, userID);
}
解决方案
我的解决方案是将@IMTheNachoMan and my discovery that the added data in GS to Spreadsheet can be delayed if not forcing the data to be updated. To force an update, one call SpreadsheetApp.flush();
link 在电子表格中插入数据后在 GS 函数中提供的答案组合起来。据我了解,在我更改基于 (GS) 的页面之前,数据需要在我的电子表格中,因为它会在我的基于 (GS) 的页面被调用时尝试访问电子表格,而不是在我调用我的电子表格时当数据可用时(通过 waiting/using while-loop)。
将您的 <a...
替换为:
<a onclick="return LoginInfoInput(this, '<?!= userID; ?>');" href="<?= ScriptApp.getService().getUrl(); ?>?v=form&userID=<?!= userID; ?>" class="waves-effect waves-light btn-large">Log In</a>
用这个替换你的函数:
function LoginInfoInput(a, userID)
{
if(a.className == "done")
{
return true;
}
else
{
google.script.run.withSuccessHandler(function(){
a.className = "done";
a.click();
}).LoginAdd();
}
}
当用户点击 link 时,className
不是 done
所以它调用你的 GAS 函数并且 returns false 所以 href
不是打开。 GAS 函数完成后,它会设置 className
,然后再次设置点击 link。这次 returns 为真所以 href
会得到 运行.
这有意义吗?
请注意,您还可以使用 withUserObject
来传递 a
中的 URL。
参考:https://developers.google.com/apps-script/guides/html/reference/run
我有一个按钮(在 HTML 中),它既调用函数 LoginInfoInput(...)
又重定向到页面 (href="..."
) ,即:
<a onclick="LoginInfoInput('<?!= userID; ?>')" href="<?= ScriptApp.getService().getUrl(); ?>?v=form&userID=<?!= userID; ?>" class="waves-effect waves-light btn-large">Log In</a>
,
其中 LoginInfoInput(...)
是一个 javascript 函数,它将触发我的 google 应用程序脚本 (GS) 函数。然后,触发的 GS 函数会将数据插入到我的电子表格中。同时,重定向的 URL 将通过我的 doGet()
函数。为了确定结果,它从我的电子表格中获取数据。我的问题是电子表格并不总是在重定向页面采取行动之前及时更新。
我尝试通过 while 循环 wait/pause 来解决这个问题。然而,当 while 循环处于活动状态时,数据在电子表格中变得可用(至少在视觉上)不起作用,即,无法访问感兴趣的数据。请注意,我还在 while 循环期间添加了更新存储电子表格数据的变量的选项(调用 SpreadsheetApp.openByUrl(url)),但是没有任何改进。
更新
我的LoginInfoInput()
(在JavaScript)如下:
function LoginInfoInput(userID){
var userLO = document.getElementById("id_loginLO").value;
var userPassword = document.getElementById("id_password").value;
google.script.run.LoginAdd(userLO, userPassword, userID);
}
解决方案
我的解决方案是将@IMTheNachoMan SpreadsheetApp.flush();
link 在电子表格中插入数据后在 GS 函数中提供的答案组合起来。据我了解,在我更改基于 (GS) 的页面之前,数据需要在我的电子表格中,因为它会在我的基于 (GS) 的页面被调用时尝试访问电子表格,而不是在我调用我的电子表格时当数据可用时(通过 waiting/using while-loop)。
将您的 <a...
替换为:
<a onclick="return LoginInfoInput(this, '<?!= userID; ?>');" href="<?= ScriptApp.getService().getUrl(); ?>?v=form&userID=<?!= userID; ?>" class="waves-effect waves-light btn-large">Log In</a>
用这个替换你的函数:
function LoginInfoInput(a, userID)
{
if(a.className == "done")
{
return true;
}
else
{
google.script.run.withSuccessHandler(function(){
a.className = "done";
a.click();
}).LoginAdd();
}
}
当用户点击 link 时,className
不是 done
所以它调用你的 GAS 函数并且 returns false 所以 href
不是打开。 GAS 函数完成后,它会设置 className
,然后再次设置点击 link。这次 returns 为真所以 href
会得到 运行.
这有意义吗?
请注意,您还可以使用 withUserObject
来传递 a
中的 URL。
参考:https://developers.google.com/apps-script/guides/html/reference/run