2017-04-11 76 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

謝謝傑克:) –

相關問題