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

};