我注意到这里有很多关于电子表格中单元格保护的问题。 但似乎没有可行的解决方案。
例如,列' A'只能通过person1@email.com和列' B'进行编辑。只能由person2@email.com编辑。
自2013年以来谷歌网站上似乎有一个问题跟踪器......但谷歌还没有为它提供API。
有没有人有解决方法?
以下代码仅适用于整个页面保护..
sheet.setSheetProtection(permissions);
答案 0 :(得分:1)
使用onEdit()
函数检查用户正在编辑工作表,然后检查正在编辑的列。有一个用户名对象,以及他们可以编辑的列。如果不允许用户编辑,请撤消更改。
如果您有办法知道最后一个单元格值是什么,则只能撤消更改。应用程序脚本中没有撤消方法,或其他内置方式来获取Apps脚本的旧值。但是有一种方法可以配置数据以实现撤消编辑的方法。
有一张中央表格,所有公式都指向其他表格。换句话说,人们查看的数据是另一张表中存储数据的副本。根据谁可以编辑什么将数据分成表。编辑单元格时,代码会将数据写入正确的工作表。
基本上,您将拥有作为存储数据的数据库的工作表。这些床单甚至可以隐藏起来,当然它们也会受到保护。
查看和编辑将在与官方数据存储的工作表单独的工作表中完成。
因此,人们正在查看和编辑的工作表是"用户界面&#34 ;;它是"前端" " App"。作为官方数据存储的工作表是"后端"。
function onEdit(e){
Logger.log("e.value: " + e.value);
Logger.log("e.range.getRow: " + e.range.getRow());
Logger.log("e.range.getColumn: " + e.range.getColumn());
var objWhoCanEditWhat = {"user1":"[A,B]", "user2":"[A]"};
//Get this user
var thisUserIs = Session.getActiveUser().getEmail();
Logger.log('thisUserIs: ' + thisUserIs);
Logger.log('Index of @: ' + thisUserIs.indexOf("@"));
thisUserIs = thisUserIs.substring(0, thisUserIs.indexOf("@"));
Logger.log('thisUserIs: ' + thisUserIs);
var whatColumnCanEdit = objWhoCanEditWhat[thisUserIs];
Logger.log('whatColumnCanEdit: ' + whatColumnCanEdit);
var editedColumn = e.range.getColumn();
var editedRow = e.range.getRow();
Logger.log('editedColumn: ' + editedColumn)
var ss = SpreadsheetApp.getActiveSpreadsheet();
//There must be a way to determine what sheet needs to be accessed, and that sheet name
//is set dynamically.
var objColumnEditedToSheetName = {"ColA":"Sheet6TY", "ColB":"SheetColumnB"};
var whatSheetToUse = objColumnEditedToSheetName[editedColumn];
if (whatColumnCanEdit != editedColumn) { //If the column this user can edit is not the same as
//the column that just was edited, then
//Undo the change with this code
//Retrieve the old official data from the data storage sheet
var sheet = ss.getSheetByName(whatSheetToUse);
} else {
//If the user is allowed to edit this column, write the data to the official data storage sheet
var sheet = ss.getSheetByName(whatSheetToUse);
};
//Always put a formula back into the cell that was just edited in order
//to show data from the back end data source
var viewSheet = ss.getSheetByName("SheetForEditingAndViewing");
//You know the row and column of the cell that was just edited, so use that to
//reference what cell to put the formula back into.
viewSheet.getRange(editedRow, editedColumn).setFormula("Sheet1!A3");
};