尝试Catch for if脚本是否已经在工作表中运行,同时阻止第二个实例?

时间:2018-02-15 21:02:12

标签: google-apps-script

我有一个脚本可以执行一些基本的复制和粘贴数据,创建一个工作表作为PDF格式并附加到电子邮件。我有一个按钮,可以为嵌入在工作表中的经验较少的同事启动它:< / p>

enter image description here

我们共享电子表格文档,我希望将其保留为版本控制方式。设置脚本的最佳方法是什么,以便如果脚本的实例已经在电子表格文档中运行,它会拒绝第二次尝试,直到完成第一次尝试?某种尝试捕捉?

我认为代码与此问题无关,这里是相关功能的开头:

function failedSettlementsEmailz() {
  var contacts; 
  var toastMembers="";
....more code... 

它调用我的脚本文档中绑定到Google表格电子表格的其他两个函数。

由于

2 个答案:

答案 0 :(得分:4)

查看LockService

例如在你的代码中有:

var lock = LockService.getScriptLock();
if (lock.tryLock(1000)) { // Wait for 1s
  // Do stuff ...
  lock.releaseLock()
} else {
  // This script is already running, try again later ... 
}

答案 1 :(得分:0)

我了解到,当通过单击按钮运行脚本时,您不希望在脚本运行时更多地运行脚本。如果我的理解是正确的,那么这个变通方法呢?请将此视为几个答案之一。

在此变通方法中,我选择使用CacheService。 &#34; CacheService允许您访问缓存以便短期存储数据。&#34;默认到期时间为10分钟。这超过了GAS的最长执行时间(6分钟)。所以我选择了这个。

流程:

  1. 检索&#34;脚本&#34;的关键字来自CacheService。
  2. 如果有密钥,则表示脚本正在运行。
  3. 如果没有密钥,则表示该脚本未运行。
    1. 此时,请输入&#34;脚本&#34;有价值的。
    2. 运行您想要的流程。
    3. 完成此过程后,将删除密钥。这意味着脚本没有运行。
  4. 示例脚本:

    function failedSettlementsEmailz(){
      var cache = CacheService.getScriptCache();
      if (!cache.get("script")) {
        cache.put("script", "running"); // you can use various value for the value of "running".
    
        // do something
    
        cache.remove("script");
      }
    }
    

    参考:

    如果我误解了你的问题,我很抱歉。