允许单个用户一次修改 Google 电子表格



我有谷歌电子表格说"A"作为存储库。其他用户可阅读其内容。我想允许其他用户从不同的电子表格运行脚本来修改"A"的内容,但我希望它一个接一个地发生,以便记录所有用户的更改而不会丢失。

我尝试通过在"A"中附加一个工作表来做到这一点,其第一个单元格值具有当前编辑器的用户名,当当前编辑器发布工作表时,它将第一个单元格的值设置为空白。以便队列中的其他用户可以检查其是否可用于编辑。他们可以通过将第一个单元格设置为用户名来开始编辑它。问题是等待编辑器端的等待脚本无法捕获第一个单元格值的变化。因此,即使当前编辑器发布"A",其他人也无法开始编辑。

请帮忙。

例: 党卫军 - "A" 它是一个数据存储库,其中包含每个用户的数据。

党卫军 - "B" 这将分发给所有用户。他们可以在其中添加他们的信息,然后按保存,以便将其添加到"A"。现在,如果两个用户一起单击保存,则一个用户的更新可能会被第二个用户覆盖。

我在 SS 中有此代码 - "B" 在继续执行保存命令之前,它会一直检查"锁定"表中的单元格A1是否为空。

function savedata(){
var s1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");  
var wb = SpreadsheetApp.openById("XYZ");
var lck = wb.getSheetByName("Lock");
var uname = getUserEmail();
//Code stucks here, even if cell A1 in "Lock" sheet is set to blank if this loop has started it keeps on looping here. Logger continues to report old value of A1 cell.
while(lck.getRange(1,1).getValue()!=""){
Logger.log(lck.getRange(1,1).getValue(), lck.getRange(1,1).getValue());
}
lck.getRange(1,1).setValue(uname);
//Save data commands
lck.getRange(1,1).setValue("");
};

如果所有用户都使用同一工作表中的相同脚本进行编辑,则可以使用此处提到的 Lock 服务来防止并发访问代码

修改代码,如下所示:

function savedata(){
var s1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");  
var wb = SpreadsheetApp.openById("XYZ");
var lck = wb.getSheetByName("Lock");
var uname = getUserEmail();
var lock = LockService.getScriptLock();
var success = lock.tryLock(10000);            // Try getting lock for 10sec 
if (!success) {
Logger.log("Currently Busy, Try again later") 
return
} else {
Logger.log(lck.getRange(1,1).getValue(), lck.getRange(1,1).getValue());
}
lck.getRange(1,1).setValue(uname);
//Save data commands
lck.getRange(1,1).setValue("");
lock.releaseLock()             //release lock so someone else can update. 
};

如果您想知道,这个问题解释了如何以简洁的格式使用锁定服务。

希望对您有所帮助!

最新更新