Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 我可以跨两个功能使用锁服务吗?_Google Apps Script_Google Sheets - Fatal编程技术网

Google apps script 我可以跨两个功能使用锁服务吗?

Google apps script 我可以跨两个功能使用锁服务吗?,google-apps-script,google-sheets,Google Apps Script,Google Sheets,声明我可以锁定对一段代码的访问,但是如果有两个函数访问我的电子表格中的同一个工作表,则使用 有没有办法阻止两个函数同时访问该工作表 现在,我的工作是通过Properties服务设置和取消设置脚本属性: { 'lock': True } 当然,这里的问题是,如果我的一个函数中途失败,锁状态将永久存在 编辑 应评论员的要求,这里有一些关于这两个函数的伪代码 SHEET = SpreadsheetApp.getActive.getSheetByName('Sheet 1') // clock

声明我可以锁定对一段代码的访问,但是如果有两个函数访问我的电子表格中的同一个工作表,则使用

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

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

{
  '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
。(可能还有其他可能的问题)。

方法 在并发访问共享资源期间,您可以使用应用程序脚本锁定服务来防止竞争条件

下面是两个函数
funcA
funcB
的简单示例:

// 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的锁行为

参考:

这两个函数是如何调用的?请您发布函数代码好吗?@Alessandro我添加了一些代码谢谢。我没有意识到锁的作用范围比当前的功能更广。