Class Lock

Kunci

Representasi kunci eksklusif bersama.

Class ini memungkinkan skrip memastikan bahwa hanya satu instance skrip yang menjalankan bagian kode tertentu dalam satu waktu. Hal ini sangat berguna untuk callback dan pemicu, ketika tindakan pengguna dapat menyebabkan perubahan pada resource bersama dan Anda ingin memastikan tidak ada konflik.

Contoh berikut menunjukkan cara menggunakan kunci dalam pengendali pengiriman formulir.

// Generates a unique ticket number for every form submission.
function onFormSubmit(e) {
  const targetCell = e.range.offset(0, e.range.getNumColumns(), 1, 1);

  // Gets a script lock before modifying a shared resource.
  const lock = LockService.getScriptLock();
  // Waits for up to 30 seconds for other processes to finish.
  lock.waitLock(30000);

  const scriptProperties = PropertiesService.getScriptProperties();

  const ticketNumber =
      Number(scriptProperties.getProperty('lastTicketNumber')) + 1;
  scriptProperties.setProperty('lastTicketNumber', ticketNumber);

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

  targetCell.setValue(ticketNumber);
}
Tanpa layanan Lock, jika dua pengguna mengirimkan formulir pada waktu yang hampir bersamaan, nomor tiket dapat menjadi sama, karena properti lastTicketNumber dapat berubah setelah dibaca dari ScriptProperties, tetapi sebelum nilai baru ditulis kembali.

Metode

MetodeJenis nilai yang ditampilkanDeskripsi singkat
hasLock()BooleanMenampilkan true jika kunci diperoleh.
releaseLock()voidMelepaskan kunci, sehingga proses lain yang menunggu kunci dapat dilanjutkan.
tryLock(timeoutInMillis)BooleanMencoba mendapatkan kunci, dengan waktu tunggu habis setelah jumlah milidetik yang diberikan.
waitLock(timeoutInMillis)voidMencoba mendapatkan kunci, yang akan berakhir dengan pengecualian setelah jumlah milidetik yang diberikan.

Dokumentasi mendetail

hasLock()

Menampilkan true jika kunci diperoleh. Metode ini menampilkan false jika tryLock(timeoutInMillis) atau waitLock(timeoutInMillis) tidak pernah dipanggil, waktunya habis sebelum kunci dapat diambil, atau jika releaseLock() dipanggil.

const lock = LockService.getScriptLock();
lock.tryLock(10000);
if (!lock.hasLock()) {
  Logger.log('Could not obtain lock after 10 seconds.');
}

Pulang pergi

Booleantrue jika kunci diperoleh, false jika tidak.


releaseLock()

Melepaskan kunci, sehingga proses lain yang menunggu kunci dapat dilanjutkan. Kunci akan dilepaskan secara otomatis saat skrip berakhir, tetapi untuk efisiensi, sebaiknya lepaskan kunci segera setelah Anda tidak lagi memerlukan akses eksklusif ke bagian kode. Metode ini tidak berpengaruh jika kunci belum diperoleh.

Perhatikan bahwa jika Anda sedang mengerjakan spreadsheet, Anda harus memanggil SpreadsheetApp.flush() sebelum melepaskan kunci, untuk melakukan semua perubahan yang tertunda pada spreadsheet saat Anda masih memiliki akses eksklusif ke spreadsheet tersebut.

const lock = LockService.getScriptLock();
lock.waitLock(10000);
// Do some work on a shared resource.
lock.releaseLock();

tryLock(timeoutInMillis)

Mencoba mendapatkan kunci, dengan waktu tunggu habis setelah jumlah milidetik yang diberikan. Metode ini tidak berpengaruh jika kunci sudah diperoleh.

const lock = LockService.getScriptLock();
const success = lock.tryLock(10000);
if (!success) {
  Logger.log('Could not obtain lock after 10 seconds.');
}

Parameter

NamaJenisDeskripsi
timeoutInMillisIntegerDurasi tunggu untuk mendapatkan kunci, dalam milidetik.

Pulang pergi

Booleantrue jika kunci diperoleh, false jika tidak.


waitLock(timeoutInMillis)

Mencoba mendapatkan kunci, yang akan berakhir dengan pengecualian setelah jumlah milidetik yang diberikan. Metode ini sama dengan tryLock(timeoutInMillis), tetapi menampilkan pengecualian jika kunci tidak dapat diperoleh, bukan menampilkan false.

const lock = LockService.getScriptLock();
try {
  lock.waitLock(10000);
} catch (e) {
  Logger.log('Could not obtain lock after 10 seconds.');
}

Parameter

NamaJenisDeskripsi
timeoutInMillisIntegerDurasi tunggu untuk mendapatkan kunci, dalam milidetik.

Menampilkan

Error — jika waktu tunggu metode habis sebelum kunci diperoleh