2012-06-02 2 views
0

Я пишу код в Google Apps Script. Мне нужно указать уникальный номер для каждого пользователя.Свойства шлюза и скриптов в скрипте Google Apps

Сначала я написал код с классом tryLock и ScriptProperties. Он дал то же количество для нескольких лиц, когда 6 пользователей вызвали функцию почти в одно и то же время. Итак, теперь я использую waitLock и ScriptProperties.

Есть ли разница между tryLock и waitLock с точки зрения способности блокировки? Кроме того, мне интересно время обновления ScriptProperties. Он обновляется немедленно для всех пользователей?

Если вы дадите советы по этому вопросу, я действительно ценю это.


// Мой код с tryLock: это дало то же число для 3 пользователей в тесте 6 пользователями.

var glock = LockService.getPublicLock(); 
if(glock.tryLock(10000)) 
{ 
    var val = ScriptProperties.getProperty(proName) * 1 + 1; 
    ScriptProperties.setProperty(proName, val); 
    glock.releaseLock(); 
    return val; 
} else { return null; } 

// Другой код с waitLock: Это дало уникальный номер для каждого в тесте на 8 пользователей.

var val = null; 
try{ 
    var glock = LockService.getPublicLock(); 
    glock.waitLock(10000); 
    val = ScriptProperties.getProperty(proName) * 1 + 1; 
    ScriptProperties.setProperty(proName, val); 
    glock.releaseLock(); 
} catch (e) { } 
return val; 
+0

Я тестировал второй код с waitLock несколько раз. Это несколько раз давало некоторую ценность. Кроме того, я заменил функцию getProperty() функцией getLastRow() Speradsheet с помощью функции flush(). Однако я не мог создавать уникальные значения для каждого. Pls, дайте свой совет. – user1431847

ответ

0

Если вам не нужны идентификаторы, чтобы быть последовательными, вы можете быть лучше использовать метку времени вместо того, чтобы:

var glock = LockService.getPublicLock(); 
if (glock.tryLock(10000)) { 
    var val = (new Date()).getTime(); 
    glock.releaseLock(); 
    return val; 
} else { 
    return null; 
} 

Методы tryLock() и waitLock() работы тот же, что это просто, что первые возвращается false, если он не может получить блокировку, а второй - исключение в этом случае.

+0

Дорогой Эрик, Спасибо за советы. Я думаю, getTime() дает тот же ID в течение секунды ... Есть ли способ сохранить параллелизм в жестких случаях? Я протестировал LockService. Кажется, О.К. для обычных случаев с сериализованным доступом. Но несколько раз он активирует несколько потоков одновременно, когда мы одновременно получаем доступ к скрипту ... – user1431847

0

Если вы хотите идентифицировать уникальных пользователей скрипта, вы можете использовать свойство в хранилище userproperties, поскольку каждый пользователь имеет уникальный магазин. Если вы никогда не видели его раньше, то генерируете уникальный номер, используя отметку времени или что-то в своем хранилище свойств пользователя. Если вы видели его до того, как его магазин уже будет содержать уникальный номер, который вы создали во время его последнего визита. Если вам нужно объединить все номера, скопируйте их в хранилище свойств скрипта.

Например, см http://ramblings.mcpher.com/Home/excelquirks/gassnips/anonymoususerregistration

Смежные вопросы