我创建了电子表格来为几个人准备月份任务。 现在,我想编写脚本以自动更新保护设置。 看起来如何?
我在A列中列出了人员列表,在E列中列出了他们的电子邮件。我想创建一个脚本来自动更新保护,从而仅允许编辑特定人员所在的行。
例如-电子邮件地址为User1的用户:email1@google.com只能编辑8:8行,并且只能编辑他和我,而没有其他人。
我出错了。
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)}
我试图逐步进行操作,但是需要很长时间,我认为循环会更好,但是我不知道如何使用它们。
答案 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。
最好的问候 塞巴斯蒂安