Class Lock

נעילה

ייצוג של נעילת הדדית.

המחלקות האלה מאפשרות לסקריפטים לוודא שרק מופע אחד של הסקריפט יבצע קטע קוד נתון בכל פעם. האפשרות הזו שימושית במיוחד לקריאות חוזרות (callback) ולטריגרים, שבהם פעולת משתמש עשויה לגרום לשינויים במשאב משותף, ואתם רוצים לוודא שלא יהיו התנגשויות.

בדוגמה הבאה אפשר לראות איך משתמשים בנעילה ב-handler של שליחת טופס.

// 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);
}
בלי שירות הנעילה, אם שני משתמשים שולחים את הטופס בערך באותו הזמן, יכול להיות שמספרי הכרטיסים יהיו זהים, כי המאפיין lastTicketNumber יכול להשתנות אחרי שהוא נקרא מ-ScriptProperties אבל לפני שהערך החדש נכתב בחזרה.

Methods

שיטהסוג הערך שמוחזרתיאור קצר
hasLock()Booleanהפונקציה מחזירה את הערך true אם הנעילה הושגה.
releaseLock()voidהפונקציה משחררת את הנעילה, ומאפשרת לתהליכים אחרים שממתינים לנעילה להמשיך.
tryLock(timeoutInMillis)Booleanהפונקציה מנסה להשיג את הנעילה, ומפסיקה אחרי מספר אלפיות השנייה שצוין.
waitLock(timeoutInMillis)voidהפונקציה מנסה לקבל את הנעילה, ומפסיקה עם חריגה אחרי מספר אלפיות השנייה שצוין.

תיעוד מפורט

hasLock()

הפונקציה מחזירה את הערך true אם הנעילה הושגה. ה-method הזו מחזירה false אם מעולם לא בוצעה קריאה ל-tryLock(timeoutInMillis) או ל-waitLock(timeoutInMillis), אם חלף הזמן הקצוב לתפוס את הנעילה לפני שאפשר היה לאחזר אותה, או אם בוצעה קריאה ל-releaseLock().

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

חזרה

Booleantrue אם הנעילה נוספה, false אחרת.


releaseLock()

הפונקציה משחררת את הנעילה, ומאפשרת לתהליכים אחרים שממתינים לנעילה להמשיך. הנעילה משתחררת אוטומטית כשהסקריפט מסתיים, אבל כדי לשפר את היעילות, מומלץ לשחרר אותה ברגע שכבר לא צריך גישה בלעדית לקטע קוד. לשיטה הזו אין השפעה אם הנעילה לא הושגה.

הערה: אם אתם עובדים עם גיליון אלקטרוני, כדאי להפעיל את הפונקציה SpreadsheetApp.flush() לפני שמשחררים את הנעילה, כדי לבצע את כל השינויים שממתינים בגיליון האלקטרוני בזמן שעדיין יש לכם גישה בלעדית אליו.

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

tryLock(timeoutInMillis)

הפונקציה מנסה להשיג את הנעילה, ומפסיקה אחרי מספר אלפיות השנייה שצוין. לשיטה הזו אין השפעה אם הנעילה כבר הושגה.

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

פרמטרים

שםסוגתיאור
timeoutInMillisIntegerמשך ההמתנה עד לקבלת הנעילה, באלפיות שנייה.

חזרה

Booleantrue אם הנעילה נוספה, false אחרת.


waitLock(timeoutInMillis)

הפונקציה מנסה לקבל את הנעילה, ומפסיקה עם חריגה אחרי מספר אלפיות השנייה שצוין. השיטה הזו זהה לשיטה tryLock(timeoutInMillis), אלא שהיא מציגה חריגה כשהנעילה לא מתבצעת, במקום להחזיר false.

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

פרמטרים

שםסוגתיאור
timeoutInMillisIntegerמשך ההמתנה עד לקבלת הנעילה, באלפיות שנייה.

מקפיצה את הודעות השגיאה (Throws)

Error – אם חלף הזמן הקצוב לתפוגה של השיטה לפני שההסגר הושג