GAS - 远程电池保护
GAS - Ranged Cells Protection
我注意到这里有很多关于电子表格中单元格保护的问题。
但似乎没有可行的解决方案。
例如,列'A'只能由person1@email.com编辑,列'B'只能由person2@email.com编辑。
自 2013 年以来 google 站点上似乎有一个问题跟踪器...但是 Google 还没有为它提出 API。
有人有解决方法吗?
以下代码仅适用于整个页面保护..
sheet.setSheetProtection(permissions);
使用 onEdit()
功能检查正在编辑 Sheet 的用户,然后检查正在编辑的列。有一个用户名对象,以及他们可以编辑哪些列。如果不允许用户编辑,则撤消更改。
只有在知道最后一个单元格值是什么的情况下,才能撤消更改。 Apps 脚本中没有撤消方法,也没有其他内置方法可以使用 Apps 脚本获取旧值。但是有一种方法可以配置数据来实现撤消编辑的方法。
有一个中心 sheet,所有公式都引用其他 sheet。换句话说,人们查看的数据是另一个 sheet 中存储数据的副本。根据谁可以编辑什么,把数据分成sheets。编辑单元格时,代码会将数据写入正确的 sheet。
基本上,您将拥有 sheets,它们是存储数据的数据库。那些 sheet 甚至可以隐藏,当然它们会受到保护。
查看和编辑将在与官方数据存储 sheet 分开的 sheet 中完成。
因此,人们正在查看和编辑的 sheet 是 "User Interface";这是 "App" 的 "Front End"。作为官方数据存储的 sheet 是 "Back End".
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");
};
我注意到这里有很多关于电子表格中单元格保护的问题。 但似乎没有可行的解决方案。
例如,列'A'只能由person1@email.com编辑,列'B'只能由person2@email.com编辑。
自 2013 年以来 google 站点上似乎有一个问题跟踪器...但是 Google 还没有为它提出 API。
有人有解决方法吗?
以下代码仅适用于整个页面保护..
sheet.setSheetProtection(permissions);
使用 onEdit()
功能检查正在编辑 Sheet 的用户,然后检查正在编辑的列。有一个用户名对象,以及他们可以编辑哪些列。如果不允许用户编辑,则撤消更改。
只有在知道最后一个单元格值是什么的情况下,才能撤消更改。 Apps 脚本中没有撤消方法,也没有其他内置方法可以使用 Apps 脚本获取旧值。但是有一种方法可以配置数据来实现撤消编辑的方法。
有一个中心 sheet,所有公式都引用其他 sheet。换句话说,人们查看的数据是另一个 sheet 中存储数据的副本。根据谁可以编辑什么,把数据分成sheets。编辑单元格时,代码会将数据写入正确的 sheet。
基本上,您将拥有 sheets,它们是存储数据的数据库。那些 sheet 甚至可以隐藏,当然它们会受到保护。
查看和编辑将在与官方数据存储 sheet 分开的 sheet 中完成。
因此,人们正在查看和编辑的 sheet 是 "User Interface";这是 "App" 的 "Front End"。作为官方数据存储的 sheet 是 "Back End".
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");
};