允许单个用户一次编辑Google电子表格

时间:2017-04-11 07:51:26

标签: google-apps-script google-sheets

我有Google电子表格说" A"充当存储库。其他用户可以阅读其内容。我想允许其他用户从不同的电子表格中运行脚本来修改" A"的内容,但我希望它逐个发生,以便记录所有用户的更改。没有丢失。

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

请帮忙。

实施例: SS - " A" 它是一个包含w.r.t数据的数据存储库。每个用户。

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

我在SS中有这个代码 - " B" 它一直在检查" Lock"中的单元格A1。在继续执行save命令之前,工作表是空的。

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

};

1 个答案:

答案 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如果您想知道如何以简洁的格式使用锁定服务。

希望有所帮助!