Google apps script 保护基于特定值的范围

Google apps script 保护基于特定值的范围,google-apps-script,spreadsheet,Google Apps Script,Spreadsheet,我已经创建了电子表格来为几个人准备每月的任务。 现在我想写一个脚本来自动更新保护设置。 看起来怎么样 我在A列有人的列表,在E列有他们的电子邮件。我想创建一个脚本来自动更新保护,只允许编辑特定人所在的行 例如-User1和电子邮件:email1@google.com只能编辑第8:8行,只有他和我,没有其他人 我犯了个错误 函数zakresynchrone(){ var ss=SpreadsheetApp.getActiveSpreadsheet() var ochronadanych=ss.

我已经创建了电子表格来为几个人准备每月的任务。 现在我想写一个脚本来自动更新保护设置。 看起来怎么样

我在A列有人的列表,在E列有他们的电子邮件。我想创建一个脚本来自动更新保护,只允许编辑特定人所在的行

例如-User1和电子邮件:email1@google.com只能编辑第8:8行,只有他和我,没有其他人

我犯了个错误

函数zakresynchrone(){
var ss=SpreadsheetApp.getActiveSpreadsheet()
var ochronadanych=ss.getSheetByName('dysozycje')
var p1=ochronadanych.getRange('8:8').protect();
var p1val=ochronadanych.getRange('E8').getValue()
p1.删除()

p1.加法器(p1val)}
有关问题的更多信息:

[19-11-02 02:06:23:553 PDT]开始执行
[19-11-02 02:06:23:576 PDT]SpreadsheetApp.getActiveSpreadsheet()[0.016秒]
[19-11-02 02:06:23:638 PDT]电子表格应用程序电子表格getSheetByName([Dysozycje])[0.062秒]
[19-11-02 02:06:23:639 PDT]SpreadsheetApp.Sheet.getRange([8:8])[0秒]
[19-11-02 02:06:24:306 PDT]电子表格应用程序范围保护()[0.666秒]
[19-11-02 02:06:24:307 PDT]SpreadsheetApp.Sheet.getRange([E8])[0秒]
[19-11-02 02:06:24:512 PDT]SpreadsheetApp.Range.getValue()[0.205秒]
[19-11-02 02:06:24:513 PDT]电子表格应用程序保护。删除()[0秒]
[19-11-02 02:06:24:873 PDT]电子表格应用程序保护添加器([tychy。polnoc@gmail.com])[0.359秒]

[19-11-02 02:06:25:304 PDT]执行失败:Błd usługi:Arkusze-kalkulacyjne(第7行,文件“makra”)[1.393秒总运行时间]
这里是一个循环示例,我删除p1。删除()

函数zakresynchrone(){
var ss=SpreadsheetApp.getActive();
var ochronadanych=ss.getSheetByName('dysozycje')
var lstRow=ochronadanych.getLastRow();

对于(i=8;i),每次需要更新保护时,脚本无需在所有行中循环。您可以创建一个OneEdit触发器,用于检查编辑的行并仅更新该特定保护

考虑到这一点,我编写了以下代码:

每次编辑电子邮件(第5列,行索引大于7)时,应更新该特定行的保护。该行的唯一编辑器将是您(在代码中相应地更改您的电子邮件)和电子邮件与单元格中写入的电子邮件相匹配的人:

function onEdit(e) {
  var editedRange = e.range; // Range that was edited (info coming from event object)
  var sheetName = 'Dyspozycje';
  var sheet = e.source.getSheetByName(sheetName);
  var column = 5;
  // Getting edited cell column and row index
  var editedCol = editedRange.getColumn();
  var editedRow = editedRange.getRow();
  // Checking the edited cell corresponds to an email
  if(editedRow > 7 && editedCol == column) { 
    var numCols = sheet.getMaxColumns();
    // Row that needs protection update
    var range = sheet.getRange(editedRow, 1, 1, numCols);
    // Creating protection
    var protection = range.protect().setDescription(editedRow);
    // Getting emails from desired editors
    var me = 'your_email@domain.com'; // Change accordingly
    var email = sheet.getRange(editedRow, editedCol).getValue();
    // Remove previous editors
    protection.removeEditors(protection.getEditors());
    // Add desired editors
    protection.addEditors([me, email]);
    if (protection.canDomainEdit()) {
      protection.setDomainEdit(false);
    }
  }
}
此外,由于最初不会设置保护,请运行此命令一次,以便为每行设置保护(第一次之后,无需运行此命令;由于onEdit触发器,保护将自动更新):

函数createProtections(){
var sheet=SpreadsheetApp.getActiveSheet();
var values=sheet.getDataRange().getValues();
var-column=5;
对于(变量i=8;i

我希望这能有所帮助。

是的,非常感谢。因为你,我理解了循环。我使用了你的脚本,它们非常神奇,帮助我创建了我想要的。但只有一个问题,每次我编辑电子邮件时,脚本都与实际用户创建了下一个受保护的范围。当我在空白c中添加新电子邮件时它创建了两个受保护的范围-一个只允许我编辑范围,另一个允许我和那个电子邮件编辑范围。我试图理解为什么,但我不知道。我决定修改你的所有脚本,现在很好,如果你能提供错误,我们可以更容易地帮助你。@sebook,你的问题解决了吗?你删除了吗e保护,然后你想添加编辑器,我想这就是问题所在。很高兴你的问题解决了。另外,出于文档目的,请记住,如果你想将你的问题标记为已解决,你应该这样做。你甚至可以接受。
function onEdit(e) {
  var editedRange = e.range; // Range that was edited (info coming from event object)
  var sheetName = 'Dyspozycje';
  var sheet = e.source.getSheetByName(sheetName);
  var column = 5;
  // Getting edited cell column and row index
  var editedCol = editedRange.getColumn();
  var editedRow = editedRange.getRow();
  // Checking the edited cell corresponds to an email
  if(editedRow > 7 && editedCol == column) { 
    var numCols = sheet.getMaxColumns();
    // Row that needs protection update
    var range = sheet.getRange(editedRow, 1, 1, numCols);
    // Creating protection
    var protection = range.protect().setDescription(editedRow);
    // Getting emails from desired editors
    var me = 'your_email@domain.com'; // Change accordingly
    var email = sheet.getRange(editedRow, editedCol).getValue();
    // Remove previous editors
    protection.removeEditors(protection.getEditors());
    // Add desired editors
    protection.addEditors([me, email]);
    if (protection.canDomainEdit()) {
      protection.setDomainEdit(false);
    }
  }
}
function createProtections() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var values = sheet.getDataRange().getValues();
  var emailColumn = 5;
  for(var i = 8; i < values.length; i++) {
    var numCols = sheet.getMaxColumns();
    var range = sheet.getRange(i, 1, 1, numCols);
    var protection = range.protect().setDescription(i);
    var me = Session.getEffectiveUser().getEmail();
    var email = sheet.getRange(i, emailColumn).getValue();
    protection.removeEditors(protection.getEditors());
    protection.addEditors([me, email]);
    if (protection.canDomainEdit()) {
      protection.setDomainEdit(false);
    }   
  }
}