除具有onEdit()触发器的Google App脚本所有者外,其他编辑者的数据保护问题

时间:2020-08-09 15:25:38

标签: google-apps-script google-sheets

我有一个包含6个编辑器的google电子表格,包括我作为所有者。当除工作表所有者以外的任何编辑者在下拉菜单中选择某个值时,与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);     
 
}

1 个答案:

答案 0 :(得分:0)

documentation中为可安装的触发器所指定:

即使另一个具有编辑访问权限的用户打开了电子表格,可安装版本仍在创建触发器的用户的授权下运行。

现在,removeEditor()的文献记录说:

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

换句话说:

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

解决方案:

  • 使用event object 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);      
}