【问题标题】:addEditor and removeEditor on certain conditions for google sheetaddEditor 和 removeEditor 在谷歌表的某些条件下
【发布时间】:2019-06-07 14:50:46
【问题描述】:

我从 [this question] (Automatic Lock/Protect Rows/cells in Google Sheets at a specific time in other Cells) 中了解到如何在特定条件下锁定特定单元格,而 Jess 的回答非常好。

我只是想知道是否可以添加更多代码以在特定条件下解锁单元格。例如:如果用户做了事情1,锁定单元格B1,如果用户做事情2,解锁单元格B1以供将来编辑。

这里是我根据 Jess 的回答修改的代码,阻塞 (removeEditor) 工作正常,但我添加的用于解除阻塞单元格的“else if”条件不起作用,并且单元格在此条件下没有解除阻塞。

function onEdit(e) { 

 var ss1=SpreadsheetApp.getActiveSpreadsheet();

 var sheet1=ss1.getSheetByName("Sheet Name");  

 var active = sheet1.getActiveCell();

 var nextnum = sheet1.getRange(active.getRow(),8).getValue();

 var shouldbeblocking= sheet1.getRange(active.getRow()-1,7)

 var them = Session.getActiveUser();

 var theiremails = them.getEmail();


// to unlock the cell, NOT WORKING

   if (nextnum == 22) {
 
 shouldbeblocking.protect().addEditor(theiremails);
 
 shouldbeblocking.setNote("unLocked") ;
  }

 // to lock the cell (codes working fine)

  else if (nextnum == 1) {

 shouldbeblocking.protect().removeEditor("xxx@xxx.com") ;
 shouldbeblocking.setNote("Locked") ;
  }



}

根据@ross 的建议,我将Logger.log 添加到我的代码中(在 if 语句中),下面是执行脚本的屏幕截图,看起来代码运行通过 if 语句,奇怪的是“解锁" setNote 有效,因为我可以看到单元格上的“解锁”注释,但该单元格仍然被阻止:

【问题讨论】:

  • 尼克,你确定 1) nextnum 曾经达到 22 的值; 2)getActiveUser().getEmail()结果与removeEditor()中的邮件相同?
  • 嗨奥列格,感谢您的回复! [1] 是的!在谷歌表上,我设置了一些 if 语句将 nextnum 的值更改为 22。 [2] 是的!目前我只将我的谷歌表格分享给另一个人的 gmail 帐户。并且 getActiveUser 的电子邮件与我用于 removeEditor 的 xxx@xxx.com 相同。有了这些,你认为我的代码有逻辑问题吗?谢谢!!
  • 在您的 if 语句中添加一个 Logger.log,您认为该语句可以确保它确实进入了代码的那部分。您还可以显示您的执行记录(转到view > execution transcript)以查看此内容,然后将内容添加到问题中。
  • 尼克,我希望至少有一个答案是“否”)请按照@ross 所说的去做,以确保脚本执行实际到达if 语句(顺便说一句,关于[2] - 确定或者你调用了类似theiremails==='xxx@xxx.com' 的东西,它返回了true?)
  • @ross,嘿,罗斯,感谢您的帮助!我将 logger.log + 执行记录添加到内容中,似乎代码进入了 if 语句,我确实注意到单元格上出现了“unlocked”的“setNote”,奇怪的是代码运行了 setNote 部分if 语句,但不在其他 addEditor 上,

标签: google-apps-script google-sheets triggers


【解决方案1】:

因此,总而言之,protect() 方法文档中有一条很容易被忽略的注释,即“如果范围已经受到保护,则此方法会创建一个与现有范围重叠的新受保护范围 ",这意味着每次您的onEdit(e) 触发器触发时,都会创建至少一个新的保护层,而不是被覆盖。

您应该改为通过getProtections() 方法访问为Spreadsheet 创建的Protection 实例,并从生成的Array 中对元素调用addEditor()removeEditor() 方法(以便能够区分@ 987654333@ 实例,利用getRange()getEditors() 方法(至少Logger.log()console.log() 他们来跟踪)。

您可能希望在添加/删除过程之前检查用户是否可以编辑受保护的Range - 在这种情况下,请在获取的Protection 上使用canEdit() 方法。

有用的链接

  1. canEdit(e)reference;
  2. remove()reference;
  3. getProtections()reference(保护必须被type过滤);

【讨论】:

  • 嗨奥列格,非常感谢!由于我对应用程序脚本相当陌生,我仍在寻找如何使用 getProtections 来查找保护并根据我的条件进行更改,一旦我弄清楚了,我会回来选择你的答案!欣赏它!
  • 尼克,太棒了!我还没有用更详细的信息和文档参考来更新答案:) 此更改应该可以解决您遇到的问题(确保您事先从工作表中删除所有保护措施,因为它们可能有很多)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-17
  • 1970-01-01
相关资源
最近更新 更多