【问题标题】:Lock service does not work in Google Sheets using Apps Script锁定服务在使用 Apps 脚本的 Google 表格中不起作用
【发布时间】:2020-07-05 08:23:41
【问题描述】:

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

数据如下:

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();
  }
  
}

enter image description here

【问题讨论】:

  • 锁需要在函数顶部获取。将waitLock() 放在try{ 下方。
  • 对不起,我这样做了,但结果还是一样。等待锁不起作用!
  • 是否发现了错误? }catch(e){ Logger.log("Error: " + e.message);Logger.log("Stack: " + e.stack) 另外,运行代码后,单击查看菜单,然后单击执行记录或执行。
  • 没有发现错误。但是,我猜在执行记录中存在一些问题。请检查原帖正下方的图片。
  • 如果执行失败,状态栏中会有红色的“失败”字样,我看不到。

标签: google-apps-script google-sheets triggers


【解决方案1】:

您在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();    
  }
}

【讨论】:

    猜你喜欢
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    相关资源
    最近更新 更多