首页 > 解决方案 > 我可以跨两个函数使用 LockService 吗?

问题描述

LockService 文档指出我可以锁定对一段代码的访问,但是如果有两个函数可以访问我的电子表格中的同一张工作表?

有没有办法阻止两个函数同时访问该表?

现在我的工作是通过属性服务设置和取消设置脚本属性:

{
  'lock': True
}

当然,这里的问题是,如果我的一个功能在中途失败,锁定状态将永久存在。

编辑

应评论者的要求,这里是有问题的两个函数的一些伪代码

SHEET = SpreadsheetApp.getActive.getSheetByName('Sheet 1')

// clock trigger to run this once every 5 minutes
function funcA() {
  range = SHEET.getRange('C2:E')
  vals = range.getValues();
  updatedVals = doSomeProcessing(vals);
  range.setValues(vals);
}

// clock trigger to run this once every 6 hours
function funcB() {
  range = SHEET.getRange('A2:Z')
  vals = range.getValues();
  updateVals = doSomeOtherProcessing(vals);
  range.setValues(vals);
  sheet.sort(1);
}

所以问题是如果funcA从 读取SHEET,然后funcB排序,然后funcA写回SHEET. (并且可能还有其他可能的问题)。

标签: google-apps-scriptgoogle-sheets

解决方案


方法

在并发访问共享资源期间,您可以使用 Apps Script LockService 来防止竞争条件。

这里有一个简单的例子,你的两个函数funcAfuncB

// this function takes 10 seconds to run, waits 5 seconds for the lock to be released otherwise it fails.
function funcA() {
  var lock = LockService.getScriptLock(); // gets the lock from the LockService 
  try {
    lock.waitLock(5000); // Tries for at most 5 seconds to get the lock
    Utilities.sleep(10000);
  } catch (e) {
    Logger.log('funcA could not obtain lock after 5 seconds.');
  }
}

// this functions takes 20 seconds to run, waits 5 seconds for the lock to be released otherwise it fails.
function funcB() {
  var lock = LockService.getScriptLock();
  try {
    lock.waitLock(5000);
    Utilities.sleep(20000);
  } catch (e) {
    Logger.log('funcB could not obtain lock after 5 seconds.');
  }
}

您可以轻松地尝试在函数 B 之后调用函数 A 的锁定行为。

参考:

锁定服务


推荐阅读