除了Google应用程序脚本中具有onEdit()触发器的所有者之外,其他编辑器的数据保护问题



我有一个谷歌电子表格,有6个编辑器,其中包括我作为所有者。当除图纸所有者之外的任何编辑器在下拉菜单中选择某个值时,classAttendance((附带的onEdit触发器就会开始工作。没关系。但问题是,每次数据在所有者名称上受到保护时(具有编辑访问权限(,尽管用户是不同的编辑器。它应该在特定的编辑器名称上,并且应该有编辑访问权限。如何解决它?

function classAttendance(e){ 
var spreadsheet = SpreadsheetApp.getActive();
var dashboard = spreadsheet.getSheetByName("Dashboard");
var sheetName = dashboard.getRange("A4").getValue();    

if (e.range.getA1Notation() === 'C6' && e.range.getValue() === "Start 1-Period") {  
refreshSheet();
onePeriod();    
}
if (e.range.getA1Notation() === 'C6' && e.range.getValue() === "Start 2-Period") {    
refreshSheet();
twoPeriod();
}    
}
function refreshSheet() {   
//For protecting dashboard while scripts running
var spreadsheet = SpreadsheetApp.getActive();  
var dashboard = spreadsheet.getSheetByName("Dashboard");

var rangem = dashboard.getRange("A1:K71");

var timeZone = Session.getScriptTimeZone();
var stringDate = Utilities.formatDate(new Date(), timeZone, 'dd/MM/yy HH:mm');
var me = Session.getEffectiveUser();
var description = 'Scripts running on ' + stringDate + ' by ' + me;

var protectionm = rangem.protect().setDescription(description);  
protectionm.addEditor(me);
protectionm.removeEditors(protectionm.getEditors());
if (protectionm.canDomainEdit()) {
protectionm.setDomainEdit(false);
}  

Utilities.sleep(300000);     

}

按照可安装触发器文档中的规定:

可安装版本在创建触发器的用户的授权下运行,即使其他具有编辑权限的用户打开电子表格也是如此。

现在,removeEdit((的文档aiton说:

电子表格的所有者和当前用户都不能删除。

换句话说:

  • 您的代码删除了所有编辑器,减去触发器所有者(您(和电子表格所有者(可能还有您(
  • 语句protectionm.addEditor(me);只会将您添加为编辑器(但您已经是编辑器了(
  • 此外,在removeEditos()之前使用addEditor是没有意义的——后者将删除之前添加的所有编辑器

解决方案:

  • 使用事件对象user检索活动用户
  • 在删除所有其他用户后将此用户添加为编辑器(请记住,不能将您作为电子表格所有者从编辑器中删除(

实施示例:

function classAttendance(e){
//////////MODIFICATION HERE
var user = e.user; 
var spreadsheet = SpreadsheetApp.getActive();
var dashboard = spreadsheet.getSheetByName("Dashboard");
var sheetName = dashboard.getRange("A4").getValue();    

if (e.range.getA1Notation() === 'C6' && e.range.getValue() === "Start 1-Period") {  
//////////MODIFICATION HERE
refreshSheet(user);
onePeriod();    
}
if (e.range.getA1Notation() === 'C6' && e.range.getValue() === "Start 2-Period") {  
//////////MODIFICATION HERE  
refreshSheet(user);
twoPeriod();
}    
}
//////////MODIFICATION HERE
function refreshSheet(user) {   
//For protecting dashboard while scripts running
var spreadsheet = SpreadsheetApp.getActive();  
var dashboard = spreadsheet.getSheetByName("Dashboard");

var rangem = dashboard.getRange("A1:K71");

var timeZone = Session.getScriptTimeZone();
var stringDate = Utilities.formatDate(new Date(), timeZone, 'dd/MM/yy HH:mm');
var me = Session.getEffectiveUser();
var description = 'Scripts running on ' + stringDate + ' by ' + me;

var protectionm = rangem.protect().setDescription(description);  
protectionm.removeEditors(protectionm.getEditors());
//////////MODIFICATION HERE
protectionm.addEditor(user);
if (protectionm.canDomainEdit()) {
protectionm.setDomainEdit(false);
}   
Utilities.sleep(300000);      
}

相关内容

  • 没有找到相关文章

最新更新