GAS - 范围细胞保护

时间:2015-01-01 20:08:09

标签: google-apps-script google-sheets

我注意到这里有很多关于电子表格中单元格保护的问题。 但似乎没有可行的解决方案。

例如,列' A'只能通过person1@email.com和列' B'进行编辑。只能由person2@email.com编辑。

自2013年以来谷歌网站上似乎有一个问题跟踪器......但谷歌还没有为它提供API。

有没有人有解决方法?

以下代码仅适用于整个页面保护..

sheet.setSheetProtection(permissions);

1 个答案:

答案 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");

};