根据特定值保护范围

时间:2019-11-01 12:28:46

标签: google-apps-script spreadsheet

我创建了电子表格来为几个人准备月份任务。 现在,我想编写脚本以自动更新保护设置。 看起来如何?

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

例如-电子邮件地址为User1的用户:email1@google.com只能编辑8:8行,并且只能编辑他和我,而没有其他人。

spreadsheet

我出错了。

function zakresychronione() {
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var ochronadanych = ss.getSheetByName('Dyspozycje')
  var p1 = ochronadanych.getRange('8:8').protect();
  var p1val = ochronadanych.getRange('E8').getValue()
      p1.remove()
      p1.addEditor(p1val)}

我试图逐步进行操作,但是需要很长时间,我认为循环会更好,但是我不知道如何使用它们。

4 个答案:

答案 0 :(得分:0)

有关问题的更多信息:

[19-11-02 02:06:23:553 PDT] Starting execution
[19-11-02 02:06:23:576 PDT] SpreadsheetApp.getActiveSpreadsheet() [0.016 seconds]
[19-11-02 02:06:23:638 PDT] SpreadsheetApp.Spreadsheet.getSheetByName([Dyspozycje]) [0.062 seconds]
[19-11-02 02:06:23:639 PDT] SpreadsheetApp.Sheet.getRange([8:8]) [0 seconds]
[19-11-02 02:06:24:306 PDT] SpreadsheetApp.Range.protect() [0.666 seconds]
[19-11-02 02:06:24:307 PDT] SpreadsheetApp.Sheet.getRange([E8]) [0 seconds]
[19-11-02 02:06:24:512 PDT] SpreadsheetApp.Range.getValue() [0.205 seconds]
[19-11-02 02:06:24:513 PDT] SpreadsheetApp.Protection.remove() [0 seconds]
[19-11-02 02:06:24:873 PDT] SpreadsheetApp.Protection.addEditor([tychy.polnoc@gmail.com]) [0.359 seconds]
[19-11-02 02:06:25:304 PDT] Execution failed: Błąd usługi: Arkusze kalkulacyjne (line 7, file "makra") [1.393 seconds total runtime]

奇怪的是,当我在脚本中手动编写该电子邮件时,一切正常。

答案 1 :(得分:0)

这里有一个循环的例子,我删除了p1.remove():

function zakresychronione() {
  var ss= SpreadsheetApp.getActive();
  var ochronadanych = ss.getSheetByName('Dyspozycje')

  var lstRow=ochronadanych.getLastRow();
  for (i=8;i<lstRow+1;i++)
  {
    var p1 = ochronadanych.getRange(i + ':' + i).protect();
    var p1val = ochronadanych.getRange('E' + i).getValue()
    p1.addEditor(p1val);
  }
}

答案 2 :(得分:0)

每次更新保护时,脚本都不需要遍历所有行。您可以创建一个onEdit触发器,以检查已编辑的行,并仅更新该特定保护。

考虑到这一点,我编写了一些执行以下操作的代码:

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

    {
  "error": {
    "root_cause": [
      {
        "type": "illegal_argument_exception",
        "reason": "Mapper for [indexedTimeStamp] conflicts with existing mapping in other types:\n[mapper [indexedTimeStamp] has different [store] values, mapper [indexedTimeStamp] has different [doc_values] values, mapper [indexedTimeStamp] has different [format] values]"
      }
    ],
    "type": "illegal_argument_exception",
    "reason": "Mapper for [indexedTimeStamp] conflicts with existing mapping in other types:\n[mapper [indexedTimeStamp] has different [store] values, mapper [indexedTimeStamp] has different [doc_values] values, mapper [indexedTimeStamp] has different [format] values]"
  },
  "status": 400
}

此外,因为起初没有设置保护,所以运行一次以为每行设置它们(在第一次之后,将不再需要运行;由于onEdit触发器,保护将自动更新):< / p>

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

我希望这会有所帮助。

答案 3 :(得分:0)

是的,非常感谢。因为有了你,我才知道循环。 Iamblichus我使用了您的脚本,它们很棒,并帮助我创建了想要的脚本。 。但是只有一个问题,每次我编辑电子邮件时,脚本都会与实际用户一起创建下一个受保护的范围。当我在空白单元格中添加新电子邮件时,它创建了两个受保护的范围-一个只允许我编辑范围,另一个允许我和该电子邮件编辑范围。我试图了解原因,但我不知道。我决定修改所有脚本,现在很棒 我使用它来删除保护并创建新保护,并创建了状态栏,该状态栏显示了需要创建多少保护范围,例如4 / 35、5 / 35等。 我不会经常更新保护,所以可以。 谢谢大家,尤其是Iamblichus。

最好的问候 塞巴斯蒂安