截至目前,Google Spreadsheets似乎不允许锁定单元格区域,而是必须在整个纸张的基础上进行锁定。我想与另一个用户共享一张表,让他们在Sheet 1上输入数据。为了防止篡改,我希望在Sheet 2(由我锁定)上复制的数据带有在Sheet 1上进行的最后一次更改的时间戳。我一直在使用这个onEdit()函数,但是当我编辑Sheet 1时它没有给出更新的时间,但是只有当我编辑Sheet 2时才这样。我只是没弄明白我做错了什么。
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 :(得分:0)
您不能使用脚本来防止其他用户被篡改,因为 他可以去工具&gt;脚本编辑器并编辑你的脚本 变为空闲,然后编辑Sheet1,然后恢复您的脚本。 有关此问题,请参阅the issue tracker。您无法保护脚本 来自与您共享电子表格至少一个工作表的其他用户编辑。
另一方面,将脚本放在一边,你总能看到 由谁和何时编辑的历史:文件&gt;查看修订历史。
答案 1 :(得分:0)
我看到了几个问题。首先,您尝试在范围对象上使用.getSheetByName()
,但该方法仅受电子表格对象支持。您可以在某个范围内运行.getSheet()
并返回该范围所在的工作表。其次,格式化:GAS需要标准的Javascript,这意味着您的if
和for
函数需要{ {1}}。这应该适用于你想要的东西:
{}
只需将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
}
}
和row
替换为您要将时间放入的行和列。它采用编辑范围并将其复制到工作表2上的相同位置,因此仅当工作表1是要编辑的唯一工作表时才有效。否则你最终会得到重叠的数据。您还可以将时间戳设置为范围,这意味着将其位置设置为col
。这将使其在编辑范围的右侧5列。