Google apps script 锁定服务在使用应用程序脚本的Google工作表中不起作用

Google apps script 锁定服务在使用应用程序脚本的Google工作表中不起作用,google-apps-script,google-sheets,triggers,Google Apps Script,Google Sheets,Triggers,我从一个android应用程序中获取学生出勤率,它存储在谷歌表单中。它包括时间戳,但对于分析,我只需要日期。所以我在时间戳上使用了CHANGE触发器。当学生输入他的出勤(如下所示)时,时间戳更改为日期,并使用ON CHANGE Trigger将科目代码添加到此(lastrow,6)单元格中。但现在的问题是,在50行数据中,有8-10行没有将时间戳更改为date,因此相应行中也缺少主题代码的插入。然后我使用锁服务来限制用户使用try-and-catch方法的并发访问,但它不起作用。数据集示例和应用

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

数据如下:

时间戳学生ID姓名Umail Geoloc纬度Geoloc经度主题代码
2020-03-24 1902032 1902032@bubt.ac.bd23.8669328 90.2858456 ICTE4113
函数设置表名称(e){
试一试{
var ss=e.来源;
var sh=ss.getActiveSheet();
var key=sh.getName();
var lastRow=sh.getLastRow();
var lastColumn=sh.getLastColumn();
如果((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{
sh.getRange(lastRow,6).setValue(键);
sh.getRange(最后一行,1).setNumberFormat(“yyyy-mm-dd”);
}       
LockService.getScriptLock().waitLock(2000);//失败时引发异常
}第(e)款{
SpreadsheetApp.flush();
LockService.getScriptLock().releaseLock();
}
}

您正在
try
语句末尾设置锁,并在
catch
考虑到这些块不是同时执行的,这是不可行的——要么是一个,要么是另一个

因此,要么必须用锁将语句的两个部分都包装起来,要么只在
try
中使用锁(因为
catch
仅在失败时才会执行)

样本1:

函数设置表名称(e){
LockService.getScriptLock().waitLock(2000);
试一试{
var ss=e.来源;
var sh=ss.getActiveSheet();
var key=sh.getName();
var lastRow=sh.getLastRow();
var lastColumn=sh.getLastColumn();
如果((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{
sh.getRange(lastRow,6).setValue(键);
sh.getRange(最后一行,1).setNumberFormat(“yyyy-mm-dd”);
}           
}第(e)款{
SpreadsheetApp.flush();
}
LockService.getScriptLock().releaseLock();
}
样本2:

函数设置表名称(e){
试一试{
LockService.getScriptLock().waitLock(2000);
var ss=e.来源;
var sh=ss.getActiveSheet();
var key=sh.getName();
var lastRow=sh.getLastRow();
var lastColumn=sh.getLastColumn();
如果((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{
sh.getRange(lastRow,6).setValue(键);
sh.getRange(最后一行,1).setNumberFormat(“yyyy-mm-dd”);
}
LockService.getScriptLock().releaseLock();
}第(e)款{
SpreadsheetApp.flush();
}
}

需要在函数顶部获得锁。将
waitLock()
放在
的正下方,尝试{
。抱歉,我这样做了,但结果保持不变。等待锁不工作!!是否捕获到错误?
}catch(e){Logger.log(“错误:+e.message”);Logger.log(“堆栈:+e.Stack”)
此外,在运行代码后,单击“查看”菜单,然后单击“执行记录”或“执行”。没有发现错误。但是,我猜执行记录中存在一些问题。请检查原始帖子下方的图片。如果执行失败,则会出现“失败”一词在状态栏中显示为红色,我看不到。