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



我正在从安卓应用程序中获取学生出勤率,它存储在谷歌表格中。它包括时间戳,但对于分析,我只需要日期。所以我使用ON CHANGE触发器作为时间戳。当学生输入其出勤情况(如下所示(时,时间戳将更改为日期,并使用 ON CHANGE 触发器将主题代码添加到此(最后一行,6(单元格中。但现在的问题是,在 50 行数据中,有 8-10 行没有更改迄今为止的时间戳,因此相应的行中也缺少主题代码的插入。然后我使用锁定服务使用 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

鉴于尝试..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();    
}
}

最新更新