Javascript 检查该函数是否正在使用Google Apps脚本和Google Web Apps运行

Javascript 检查该函数是否正在使用Google Apps脚本和Google Web Apps运行,javascript,google-apps-script,Javascript,Google Apps Script,我已经编写了一个简单的谷歌应用程序脚本,可以连接到智能手机上的IFTTT并发送短信。现在,我正试图开发一个用户友好的界面,将该脚本部署为一个Google Web应用程序:其想法是,您应该单击一个按钮,然后它应该显示为“发送短信”,并让您等待完成 我认为这需要按钮代码来检查脚本是否正在运行(因此它被终止),但我无法让它工作。 这是我的设置 在code.gs中,我有发送短信的主要功能: var isRunning; function execute() { isRunning = true; i

我已经编写了一个简单的谷歌应用程序脚本,可以连接到智能手机上的IFTTT并发送短信。现在,我正试图开发一个用户友好的界面,将该脚本部署为一个Google Web应用程序:其想法是,您应该单击一个按钮,然后它应该显示为“发送短信”,并让您等待完成

我认为这需要按钮代码来检查脚本是否正在运行(因此它被终止),但我无法让它工作。
这是我的设置

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')}
}
以及检查变量
是否正在运行的函数

在我的index.html文件中,有一个要执行的按钮和一个要检查的按钮:

<input class="button" type="button" value="Send SMS" onclick="google.script.run.execute()"/>
<input class="btncheck" type="button" value="Check running"/>
我确信
execute()
函数运行大约15秒。因此,如果我单击“执行”按钮,在接下来的几秒钟内,我应该能够单击“检查运行”按钮并输出true。但是它总是输出false,因为
checkRunning()
函数返回false。
不过,在脚本日志中,
isRunning
变量在
execute()
的开头正确设置为true,在结尾正确设置为false

有什么想法吗?

我猜每次客户端到服务器的调用都会创建新的执行上下文。换句话说,不可能在函数调用之间持久化变量,除非将它们保存到“稳定”对象,例如电子表格或文件。由于google.script.run调用是异步运行的,它们从.gs文件中获取全局对象的不同实例,因此“checkRunning()”函数被锁定在自己的执行上下文中,无法访问并行线程或与并行线程通信

您可以通过使用CacheService持久化数据并完全消除全局变量来克服此限制。我通过做以下更改来实现这一点

function setIsRunning(value){

  CacheService.getScriptCache().put("isRunning", value.toString());

}

function execute() {

 setIsRunning(true);

  Utilities.sleep(15000); // simulate execution for 15 secs

 setIsRunning(false);

}


function checkRunning() {

var currentState = CacheService.getScriptCache().get("isRunning");

 return (currentState == 'true');
}

请注意,我返回(currentState=='true')以将字符串转换为布尔值。布尔值('false')将生成true

为什么这么复杂?更改按钮状态或显示某种进度微调器,该微调器在
onSuccessHandler
从脚本返回时解析。我使用
withSuccessHandler()
调用resetspinner()函数,而不是传递变量,它工作得很好。很简单,谢谢。我也是这么想的。我不知道缓存服务,但这肯定是实现我想要的另一种方式,尽管我只是使用
withSuccessHandler()
调用函数而不是仅仅传递变量来解决问题。非常感谢。
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)
}
function setIsRunning(value){

  CacheService.getScriptCache().put("isRunning", value.toString());

}

function execute() {

 setIsRunning(true);

  Utilities.sleep(15000); // simulate execution for 15 secs

 setIsRunning(false);

}


function checkRunning() {

var currentState = CacheService.getScriptCache().get("isRunning");

 return (currentState == 'true');
}