2017-04-11 104 views
0

我有Google电子表格说“A”充当存储库。其他用户可以阅读其内容。我希望允许其他用户通过不同的电子表格运行脚本来修改“A”的内容,但我希望它能够一个接一个地发生,以便所有用户的更改都不会丢失,并记录在&之间。允许单个用户一次编辑Google电子表格

我试着在当前编辑器发布工作表时将第一个单元格的值设置为当前编辑器的用户名为“A”的附加工作表,它将第一个单元格的值设置为空白。以便队列中的其他用户可以检查其是否可用于编辑。他们可以通过将第一个单元格设置为用户名来开始编辑它。问题是在等待编辑器末尾的等待脚本无法捕获第一个单元格值的更改。所以即使当前编辑器发布“A”,其他人也无法开始编辑。

请帮忙。

示例: SS - “A” 它的数据存储库包含数据w.r.t.每个用户。

SS - “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(""); 

}; 
+0

您是否考虑使用[Properties classe](https://developers.google.com/apps-script/guides/properties)而不是将名称放在可修改的单元格上?你可以在这个变量上添加一个条件,如果用户已经在编辑你的文件,这个变量可以阻止用户。 –

+0

但是,我可以从不同的电子表格访问电子表格的Properties类吗?我不仅希望阻止其他用户,我希望他们等待并保持轮询,以便每当表单被释放时,他们都可以开始编辑。 –

+0

你能给我们一个电子表格的例子和一些使用例子吗? –

回答

1

如果所有用户编辑使用相同的脚本在同一张纸上,您可以用锁服务为mentioned here,以防止代码

并发访问修改代码如下所示:

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. 
    }; 

This question explains如果您想知道如何使用简洁格式的锁定服务。

希望有帮助!

+0

谢谢杰克:) –

相关问题