javascript 检查功能是否与Google Apps脚本和Google Web Apps一起运行

0lvr5msh  于 2023-02-07  发布在  Java
关注(0)|答案(1)|浏览(167)

我已经编写了一个简单的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 *。
你知道吗?

dfty9e19

dfty9e191#

我的猜测是每次客户端到服务器的调用总是创建新的执行上下文。换句话说,不可能在函数调用之间持久化变量,除非你将它们保存到一个“稳定”对象,比如电子表格或文件。因为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')将String转换为Boolean,Boolean('false')将产生true;

相关问题