Javascript 检查该函数是否正在使用Google Apps脚本和Google Web Apps运行
我已经编写了一个简单的谷歌应用程序脚本,可以连接到智能手机上的IFTTT并发送短信。现在,我正试图开发一个用户友好的界面,将该脚本部署为一个Google Web应用程序:其想法是,您应该单击一个按钮,然后它应该显示为“发送短信”,并让您等待完成 我认为这需要按钮代码来检查脚本是否正在运行(因此它被终止),但我无法让它工作。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
这是我的设置 在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');
}