【问题标题】:Check if function is running with Google Apps Script and Google Web Apps检查函数是否正在使用 Google Apps 脚本和 Google Web Apps 运行
【发布时间】:2018-02-15 14:09:55
【问题描述】:

我编写了一个简单的 Google Apps 脚本,可以连接到智能手机上的 IFTTT 并发送 SMS。现在我正在尝试通过将脚本部署为 Google Web App 来开发用户友好的界面:想法是您应该单击一个按钮,然后它应该显示“发送 SMS”并让您等待直到完成。

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

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')}
}

以及检查变量isRunningtrue还是false的函数:

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"/>

这段代码在&lt;script&gt;&lt;/script&gt;之间(使用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 秒。因此,如果我单击“执行”按钮,在接下来的几秒钟内,我应该能够单击“检查运行”按钮并输出 true。但它总是输出 false,因为 checkRunning() 函数返回 false
但在脚本日志中,isRunning 变量在开始时正确设置为 true,在 execute() 结束时正确设置为 false
有什么想法吗?

【问题讨论】:

  • 为什么要这么复杂?更改按钮状态或显示某种进度微调器,当onSuccessHandler 从脚本返回时解决。
  • 我使用withSuccessHandler() 来调用resetspinner() 函数而不是传递变量并且它运行良好。很简单,谢谢。

标签: javascript google-apps-script


【解决方案1】:

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

【讨论】:

  • 我也是这么想的。我不知道缓存服务,但这肯定是实现我想要的另一种方式,虽然我解决了这个问题,只是使用withSuccessHandler() 调用一个函数而不是传递一个变量。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-26
  • 1970-01-01
  • 1970-01-01
  • 2014-01-20
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多