简体   繁体   English

GetScriptLock似乎不起作用

[英]GetScriptLock does not seem to work

I am trying to generate a unique number when a form is submitted. 我正在尝试在提交表单时生成唯一的号码。 I have simplified my script to the following for testing. 我已将我的脚本简化为以下测试。

function onFormSubmit(event) {

  // Get a script lock, because we're about to modify a shared resource.
  var lock = LockService.getScriptLock();

  // Wait for up to 30 seconds for other processes to finish.
  lock.waitLock(30000);

  var ticketNumber = Number(ScriptProperties.getProperty('lastTicketNumber')) + 1;
  ScriptProperties.setProperty('lastTicketNumber', ticketNumber);

  targetCell = event.range.offset(0, event.range.getNumColumns(), 1, 1); 
  targetCell.setValue(ticketNumber);

  SpreadsheetApp.flush();

  // Release the lock so that other processes can continue. 
  lock.releaseLock();

};

I find that if I submit two forms within a second of each other I get the same ticketnumber. 我发现,如果我在一秒钟内提交两个表格,我会得到相同的票号。

Any help would be appreciated. 任何帮助,将不胜感激。

Preface : You are using the deprecated ScriptProperties service, this has been replaced by the Properties Service . 前言 :您正在使用已弃用的ScriptProperties服务,该服务已由Properties Service替换。 You probably want to change this first. 你可能想先改变它。

In the past I have received the same results when trying to utilize the project properties in rapid succession. 在过去,我在尝试快速连续使用项目属性时收到了相同的结果。 It's almost as if the old value hangs around in whatever caching apps script uses for script properties for a few seconds. 几乎就像旧的值在任何缓存应用程序脚本用于脚本属性几秒钟时都会挂起。

I would recommend utilizing the Cache Service to suppliment for scripts that need to reflect changes immediately. 我建议使用缓存服务来补充需要立即反映更改的脚本。

Modified Code: 修改代码:

function onFormSubmit(event) {

  // Get a script lock, because we're about to modify a shared resource.
  var lock = LockService.getScriptLock();

  // Wait for up to 30 seconds for other processes to finish.
  lock.waitLock(30000);      

  var scriptCache = CacheService.getScriptCache();
  var scriptProperties = PropertiesService.getScriptProperties(); 

  var cachedTicketNumber =  scriptCache.get('lastTicketNumber');
  var ticketNumber;

  if(cachedTicketNumber !== null){
    ticketNumber = Number(cachedTicketNumber) + 1;
  } else { 

    //Cache has expired/does not exist, fall back to properties service     
    ticketNumber = Number(scriptProperties.getProperty('lastTicketNumber')) + 1;
  }

  //Set properties service, and cache values of the ticket number
  scriptProperties.setProperty('lastTicketNumber', ticketNumber);
  scriptCache.put('lastTicketNumber', ticketNumber, 21600); //21600 seconds = 6 hours, if you want it to last that long

  targetCell = event.range.offset(0, event.range.getNumColumns(), 1, 1); 
  targetCell.setValue(ticketNumber);

  SpreadsheetApp.flush();

  // Release the lock so that other processes can continue. 
  lock.releaseLock();

};

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

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