我已经编写了一个简单的Google Apps脚本,它可以连接智能手机上的IFTTT并发送短信。现在,我正在尝试将该脚本部署为Google Web App,以开发一个用户友好的界面:这个想法是,你应该点击一个按钮,然后它应该读"发送短信",让你等待,直到完成。
我认为这需要按钮代码来检查脚本是否正在运行(因此它被终止),但我无法使它工作。
这是我的设置。
在code. gs中我有发送短信的主要函数:
var isRunning;
function execute() {
isRunning = true;
if (checkRunning() == true) {Logger.log('isRunning: TRUE')} else {Logger.log('isRunning: FALSE')}
OTHER STUFF;
isRunning = false;
if (checkRunning() == true) {Logger.log('isRunning: TRUE')} else {Logger.log('isRunning: FALSE')}
}
以及检查变量isRunning
是 * 真 * 还是 * 假 * 的函数:
function checkRunning() {
if (isRunning == true) {
return true}
else {return false}
}
在我的index.html文件中有一个执行按钮和一个检查按钮:
<input class="button" type="button" value="Send SMS" onclick="google.script.run.execute()"/>
<input class="btncheck" type="button" value="Check running"/>
<script></script>
之间的代码(使用Jquery):
var c;
setInterval(function() {google.script.run.withSuccessHandler(varSet).checkRunning()},1000);
function varSet(value) {c = value}
$('.btncheck').on('click', function() {
alert();
});
function alert() {
alert(c)
}
我确信execute()
函数运行大约15秒,因此如果我单击"execute"按钮,在接下来的几秒内我应该能够单击"check running"按钮并输出 * true *,但它总是输出 * false *,因为checkRunning()
函数返回 * false *。
在脚本Log though中,isRunning
变量在execute()
的开头正确设置为 * true *,在结尾正确设置为 * false *。
你知道吗?
1条答案
按热度按时间dfty9e191#
我的猜测是每次客户端到服务器的调用总是创建新的执行上下文。换句话说,不可能在函数调用之间持久化变量,除非你将它们保存到一个“稳定”对象,比如电子表格或文件。因为google.script.run调用异步运行,它们从.gs文件中获得全局对象的不同示例。因此“checkRunning()”函数被锁定在其自己的执行上下文内,并且无法访问并行线程或与并行线程通信。
您可以通过使用CacheService持久化数据并完全摆脱全局变量来解决这个限制。
注意,我返回(currentState == 'true')将String转换为Boolean,Boolean('false')将产生true;