繁体   English   中英

锁定服务在使用 Apps 脚本的 Google 表格中不起作用

[英]Lock service does not work in Google Sheets using Apps Script

我正在从 android 应用程序中获取学生出勤率,它存储在 Google 表格中。 它包括时间戳,但对于分析我只需要日期。 所以我使用 ON CHANGE 触发器作为时间戳。 当学生输入他的出勤率时(如下所示),时间戳更改为日期,并使用 ON CHANGE 触发器将主题代码添加到此(lastrow,6)单元格。 但现在的问题是,在 50 行数据中,有 8-10 行没有将时间戳更改为日期,因此相应行中也缺少主题代码的插入。 然后我使用 Lock Service 来限制使用 try 和 catch 方法对用户的并发访问,但它不起作用。 数据集示例和应用程序脚本代码如下:

数据如下:

Timestamp  Student ID-Name Umail        Geoloc-Latitude   Geoloc-Longitude Subject-Code 
2020-03-24 1902032 1902032@bubt.ac.bd   23.8669328        90.2858456       ICTE4113
function setSheetName(e) {
  try{
    var ss=e.source;
    var sh=ss.getActiveSheet();
    var key=sh.getName();
    var lastRow=sh.getLastRow();
    var lastColumn=sh.getLastColumn();
    if((lastRow>1) && (key.indexOf("0")>-1 || key.indexOf("1")>-1 || key.indexOf("2")>-1 || key.indexOf("3")>-1 || key.indexOf("4")>-1 || key.indexOf("5")>-1 || key.indexOf("6")>-1 || key.indexOf("7")>-1 || key.indexOf("8")>-1 || key.indexOf("9")>-1)){
      sh.getRange(lastRow,6).setValue(key);     
      sh.getRange(lastRow,1).setNumberFormat("yyyy-mm-dd");
    }       
    LockService.getScriptLock().waitLock(2000);//Throws exception if fail
    
  }catch(e){  
    SpreadsheetApp.flush();
    LockService.getScriptLock().releaseLock();
  }
  
}

在此处输入图像描述

您在try语句的末尾设置锁并在catch内释放它

鉴于try..catch块不是同时执行的,这是行不通的——它要么是一个,要么是另一个。

所以要么你必须用锁来包装语句的两个部分,要么你只在try中使用锁(因为只有在失败的情况下才会执行catch )。

样品 1:

function setSheetName(e) {
  LockService.getScriptLock().waitLock(2000);
  try{
    var ss=e.source;
    var sh=ss.getActiveSheet();
    var key=sh.getName();
    var lastRow=sh.getLastRow();
    var lastColumn=sh.getLastColumn();
    if((lastRow>1) && (key.indexOf("0")>-1 || key.indexOf("1")>-1 || key.indexOf("2")>-1 || key.indexOf("3")>-1 || key.indexOf("4")>-1 || key.indexOf("5")>-1 || key.indexOf("6")>-1 || key.indexOf("7")>-1 || key.indexOf("8")>-1 || key.indexOf("9")>-1)){
      sh.getRange(lastRow,6).setValue(key);     
      sh.getRange(lastRow,1).setNumberFormat("yyyy-mm-dd");
    }           
  }catch(e){  
    SpreadsheetApp.flush();    
  }
 LockService.getScriptLock().releaseLock(); 
}

样本 2:

function setSheetName(e) {
  try{
    LockService.getScriptLock().waitLock(2000);
    var ss=e.source;
    var sh=ss.getActiveSheet();
    var key=sh.getName();
    var lastRow=sh.getLastRow();
    var lastColumn=sh.getLastColumn();
    if((lastRow>1) && (key.indexOf("0")>-1 || key.indexOf("1")>-1 || key.indexOf("2")>-1 || key.indexOf("3")>-1 || key.indexOf("4")>-1 || key.indexOf("5")>-1 || key.indexOf("6")>-1 || key.indexOf("7")>-1 || key.indexOf("8")>-1 || key.indexOf("9")>-1)){
      sh.getRange(lastRow,6).setValue(key);     
      sh.getRange(lastRow,1).setNumberFormat("yyyy-mm-dd");
    }
    LockService.getScriptLock().releaseLock();            
  }catch(e){  
    SpreadsheetApp.flush();    
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM