2012-08-02 34 views
0

截至目前,Google Spreadsheets似乎不允許鎖定單元格範圍,而是鎖定必須在整張表格的基礎上完成。我想與另一位用戶分享一張紙,並讓他們在紙張1上輸入數據。爲防止篡改,我希望紙張2上的數據(由我鎖定)以及紙張1上最後一次更改的時間戳。我一直在玩這個onEdit()函數,但是它並沒有給我更新的時間,當我編輯表1,但仍然只有當我編輯表2.我只是沒有弄清楚我做錯了什麼。基於其他工作表的onEdit時間戳

function onEdit(e) 
{ 
    var ss = e.source.getActiveSheet(); 
    var rr = e.source.getActiveRange(); 

//comment 2 lines below if you want it working on all sheets, not just on 2nd one 
    if(ss.getIndex()!= 2) 
    return; 
/// 
    var firstRow = rr.getSheetByName(Sheet2).getRow(); 
    var lastRow = rr.getSheetByName(Sheet2).getLastRow(); 

//the last modified date will appear in 12th column 
    for(var r=firstRow; r<=lastRow; r++) 
    ss.getRange(r, 12).setValue(new Date()); 
} 

有沒有另一種方法可以做到這一點?

回答

0

您不能使用腳本來防止其他用戶篡改,因爲 他可以轉至工具>腳本編輯器並編輯您的腳本,使其 變爲空閒狀態,然後編輯Sheet1,然後恢復腳本。 請參閱the issue tracker解決此問題。您無法保護腳本 不被其他用戶共享至少一個電子表格工作表的其他用戶編輯。另一方面,將腳本留在一邊,您總能看到 由何人編輯和按何時編輯的歷史記錄:文件>查看修訂歷史記錄。

0

我看到了一些問題。首先,您嘗試在範圍對象上使用.getSheetByName(),但該方法僅受電子表格對象支持。您可以在一定範圍內運行.getSheet(),並返回該範圍所在的工作表。其次,格式化:GAS需要標準的Javascript,這意味着您的iffor函數需要具有{}。這應該給你想要的東西的工作:

onEdit(e){ 
if(e.range.getSheet().getSheetName()!="Sheet2"){ 
var row1=e.range.getRow(); 
var col2=e.range.getColumn(); 
var row2=e.range.getLastRow(); 
var col2=e.range.getLastColumn(); 
var data=e.range.getValues();//the data to be copied 
var copySheet=e.source.getSheetByName("Sheet2");//sheet you want to copy to 
var copyRange=copySheet.getRange(row1,col1,row2-row1,col2-col1);// the range data will be copied to 
var time=new Date(); 
var timeRange=copySheet.getRange(row,col);//wherever you want the time signature to be. 
timeRange.setValue(time);//inserts time stamp into sheet 
copyRange.setValues(data);//copies data to the range 
} 
} 

只需更換rowcol你要放置的時間到行和列。它接受編輯的範圍並將其複製到工作表2上的相同位置,因此僅當工作表1是唯一要編輯的工作表時才起作用。否則,你會以重疊的數據結束。您還可以設置一個時間戳來調整到該範圍,這意味着將其位置設置爲如(row1,col2+5)。這將把它編輯範圍右邊的5列。