繁体   English   中英

我是否正确使用了 Google Apps 脚本锁定服务?

[英]Am I using the Google Apps Script Lock Service correctly?

我在一个脚本中有 3 个 Apps 脚本函数。 该脚本部署为公共访问 Web 应用程序。

每个函数都从它自己的谷歌表中读取。 每个函数都不会向工作表写入任何内容。

我已将 Apps 脚本“LockService”应用于每个函数,以防止多个用户同时通过 webapp 访问电子表格。 实际上是让每个用户等到前一个用户的脚本读完为止。 他们可以阅读 3 张纸。

我发现这有时会在应用程序更新之前为用户造成 4 或 5 秒的延迟 - 这非常令人反感。

我的问题是我应该 - a) 打扰 LockService,因为我只是在读取电子表格数据,也许 LockService 的主要目的是防止并发读写之间的冲突

或者

b)我实现它是否正确,因为同时读取数据也可能导致冲突,比如获取范围值等。

谢谢

编辑:如果选项 'a' 那么我想知道 LockService 的目的是什么? 当您使用多个“google.script.run”时,这可能是一个原因(就像我在其他脚本中的其他地方一样)。 通过不同的函数一个接一个地访问同一个电子表格,然后 - 由于这些是异步运行的 - 如果两个请求都试图获取数据,则可能会产生冲突。

真的只是在沉思......

如果您所做的只是读取数据,则不需要使用LockService 因此,选项(a)。

无需保护 Apps Script 或 Google Sheets 的并发性,即使是来自同一用户的写入操作。 您从 Apps Script 执行的每个并行访问都完全独立运行,它是您的应用程序的一个新实例,不与其他人共享任何内容,甚至可能完全运行在不同的服务器上。 Google Sheets 处理并发性很好,并发协作是 G Suite 应用程序的重点。

那么,什么时候需要LockService呢?

当您的应用程序逻辑需要这样时。 例如,为了保护自己免于弄乱自己的数据。 假设您想计算您的点击次数并将该数字保存在工作表上,例如Sheet1!B2 所以你的代码看起来像:

function countClicks() {
  var r = SpreadsheetApp.getActive().getSheetByName('Sheet1').getRange('B2');
  var clicks = r.getValue();
  clicks = clicks + 1;
  r.setValue(clicks);
}

如果这个函数同时运行,你不会破坏你的记忆或让 Google Sheets 崩溃,所有会发生的是你可能会覆盖你自己,就好像你有多个用户试图在同一个单元格中输入:最后一个赢了。

但是你的逻辑会被打破,即多次并发点击可能会被算作一次。 这就是LockService进来的时候,以保护您的逻辑:

function countClicks() {
  var r = SpreadsheetApp.getActive().getSheetByName('Sheet1').getRange('B2');
  var lock = LockService.getDocumentLock();
  lock.waitLock(10000); //throws exception if fails to acquire lock
  //you could try-catch it, but that's irrelevant in this example
  r.setValue(r.getValue()+1);
  SpreadsheetApp.flush(); //forces the script to actually send the values to Sheets
  lock.releaseLock();
}

希望这可以澄清它。

顺便说一下,这只是一个非常蹩脚的例子。 这不是您计算点击次数的方式,因为正如您所指出的,锁定会显着增加系统延迟。 因此,您应该寻找替代方案,可能按用户拆分数据或使用appendRow等原子操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM