首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将用户作为编辑器添加到一个函数中的电子表格中,然后在另一个函数中删除它们?

如何将用户作为编辑器添加到一个函数中的电子表格中,然后在另一个函数中删除它们?
EN

Stack Overflow用户
提问于 2020-12-08 12:36:37
回答 1查看 52关注 0票数 0

我想将许多用户(学生)作为编辑器添加到函数refreshSheet()中的电子表格中,5分钟后,我想在另一个函数onePeriod()中删除它们。如果我在同一个函数中添加和删除用户,但在两个不同的函数中不工作,代码就可以正常工作。

请注意,我有2-5个电子表格的永久编辑器,我不想删除。只有那些学生需要删除我在refreshSheet()函数中添加的内容。

我的密码是:

代码语言:javascript
复制
function refreshSheet(){
  var sheet1 = spreadsheet.getSheetByName('StudentList');
  
  //Need to bring all students emails from Column of StudentList sheet to students array. 
  var data = sheet1.getLastRow();
  var students = [];
  var students = sheet1.getRange(2, 6, data).getValues();  
  
  var ssId = SpreadsheetApp.getActiveSpreadsheet().getId();
  var ss = SpreadsheetApp.openById(ssId);
  for (var i=0; i<students.length; i++){ // you are looping through rows and selecting the 1st and only column index
     if (students[i][0] !== '') ss.addEditor(students[i][0].toString()); 
  }  

  //Utilities.sleep(300000); Not the problem at all
}

// Removing all the student editors from the spreadsheet
function onePeriod(){
  for (var i=0; i<students.length; i++) {
      if (students[i][0] !== '') ss.removeEditor(students[i][0].toString());
  }
}   
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-08 13:26:35

修改1:

代码中的问题是,您还没有在students函数中定义onePeriod

代码语言:javascript
复制
function onePeriod(){
  for (var i=0; i<students.length; i++) {
      if (students[i][0] !== '') ss.removeEditor(students[i][0].toString());
  }
} 

由于students在另一个函数中有作用域,所以它不能在onePeriod或任何其他函数中使用。您可以像我在下面的解决方案中一样,在onePeriod中再次定义学生,或者将其定义为全局变量,以便可以在refreshSheetonePeriod中使用。

修改2:

我有2-5个电子表格的永久编辑器,我不想删除。

然后定义一个不想删除的学生数组,并将他们从if条件中排除出来:

代码语言:javascript
复制
function onePeriod(){
    var exclude_students = ['name1','name2','name3']; // put students you don't want to delete as editors
    var sheet1 = spreadsheet.getSheetByName('StudentList');
    var data = sheet1.getLastRow();
    var students = [];
    var students = sheet1.getRange(2, 6, data).getValues();   
  for (var i=0; i<students.length; i++) {
      if (students[i][0] !== '' && !exclude_students.includes(students[i][0])) ss.removeEditor(students[i][0].toString());
  }
} 

类似于ziganotschka`s answer的修改3

您可以创建一个计划好的触发器,用于在5分钟后执行,而不是暂停代码:

代码语言:javascript
复制
ScriptApp.newTrigger("onePeriod")
 .timeBased()
 .after(5 * 60 * 1000) // create trigger to execute onePeriod after 5 minutes
 .create();  

我还添加了一个代码来删除与此函数相关的所有触发器,因此在创建新触发器之前清除前面的触发器。

解决方案:

代码语言:javascript
复制
function refreshSheet(){
  var sheet1 = spreadsheet.getSheetByName('StudentList');
  
  //Need to bring all students emails from Column of StudentList sheet to students array. 
  var data = sheet1.getLastRow();
  var students = [];
  var students = sheet1.getRange(2, 6, data).getValues();  
  
  var ssId = SpreadsheetApp.getActiveSpreadsheet().getId();
  var ss = SpreadsheetApp.openById(ssId);
  for (var i=0; i<students.length; i++){ // you are looping through rows and selecting the 1st and only column index
     if (students[i][0] !== '') ss.addEditor(students[i][0].toString()); 
  }  
  createTrigger();
}

// Removing all the student editors from the spreadsheet except for some
function onePeriod(){
    var exclude_students = ['name1','name2','name3']; // put students you don't want to delete as editors
    var sheet1 = spreadsheet.getSheetByName('StudentList');
    var data = sheet1.getLastRow();
    var students = [];
    var students = sheet1.getRange(2, 6, data).getValues();   
  for (var i=0; i<students.length; i++) {
      if (students[i][0] !== '' && !exclude_students.includes(students[i][0])) ss.removeEditor(students[i][0].toString());
  }
} 


function createTrigger() {
  Trigger_delete();
  ScriptApp.newTrigger("onePeriod")
  .timeBased()
  .after(5 * 60 * 1000) // create trigger to execute onePeriod after 5 minutes
  .create();  
}


function Trigger_delete(){
var triggers = ScriptApp.getProjectTriggers();
for (var i = 0; i < triggers.length; i++) {
  if (triggers[i].getHandlerFunction() == "onePeriod") {
    ScriptApp.deleteTrigger(triggers[i]);
  }
} 
}

注:

只需执行函数refreshSheet()即可。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65199055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档