防止 Google App 脚本并行执行

Dr *_*mar 2 google-apps-script

我有一个通过单击工作表上的浮动图像来执行的 Google App 脚本。

如何防止人们在第一次执行完成之前再次运行脚本?

好像可以通过点击图片多次执行脚本,后面的执行和前面的有冲突,导致错误的结果。

我打算在脚本运行时暂时解除脚本与浮动图像的关联,然后在退出脚本之前恢复它,但我似乎无法找到一种方法来操作浮动图像的属性。

Rit*_*itz 6

对于客户端处理,您可以为变量赋值以标识函数的状态。

索引.html

<!DOCTYPE html>
<html>
  <body>
    <img src="http://cdn.soulsplay.com/assets//listing/css/comments/submit-button-2.png" onclick="invokeSubmit();">
  </body>
  <script>

    var image_clicked = 0;

    function invokeSubmit(){
      image_clicked ++;
      if(image_clicked == 1){
        alert("Processing");
        google.script.run.withSuccessHandler(function(){
          image_clicked = 0;
          alert("done");
        }).sleep_func();
      }
    }
  </script>
</html>
Run Code Online (Sandbox Code Playgroud)

代码.gs

function doGet() {
  var output = HtmlService.createTemplateFromFile('index').evaluate();
  output.setSandboxMode(HtmlService.SandboxMode.IFRAME);
  output.setTitle('App Script');
  return output;
}

function sleep_func(){
  Utilities.sleep(15000);
  return;
}
Run Code Online (Sandbox Code Playgroud)

您还可以使用Lock Service防止脚本并发访问。

function test_func(){
  var lock = LockService.getScriptLock();
  lock.waitLock(15000);

  //Some operations

  lock.releaseLock();
}
Run Code Online (Sandbox Code Playgroud)

  • 完美的!!!最后一个建议 LockService 正是我所需要的。非常感谢 (2认同)
  • 好主意。我想指出该解决方案缺少的锁定模式中的一个重要细节。锁定时,无论如何,您都希望确保在函数退出时释放锁定。我建议养成使用“try {}finally{}”的习惯,并始终在“finally”子句中释放锁,将可能失败的操作包含在“try”中。`函数 test_func(){ var lock = LockService.getScriptLock(); 锁.waitLock(15000); try { /* 某些操作,任何操作都可能引发异常 */ } finally { lock.releaseLock(); } }` (2认同)