2016-05-01 5 views
1

フォームを送信するときに一意の番号を生成しようとしています。テストのためにスクリプトを以下のように単純化しました。GetScriptLockが機能していないようです

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

}; 

2つのフォームを1秒以内に提出すると、同じチケット番号が取得されることがわかります。

ご協力いただければ幸いです。

答えて

2

はじめに:償却されたScriptPropertiesサービスを使用していますが、これはProperties Serviceに置き換えられました。これを最初に変更したいと思うでしょう。

過去に私はプロジェクトプロパティを素早く利用しようとしたときに同じ結果を得ました。これは、ほとんどの場合、古い値がアプリスクリプトが何秒間スクリプトプロパティーに使用するキャッシュにもハングアップしているかのようです。

Cache Serviceを使用して、すぐに変更を反映する必要のあるスクリプトを追加することをお勧めします。

修正コード:

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

}; 
関連する問題