我想将许多用户(学生)作为编辑器添加到函数refreshSheet()中的电子表格中,5分钟后,我想在另一个函数onePeriod()中删除它们。如果我在同一个函数中添加和删除用户,但在两个不同的函数中不工作,代码就可以正常工作。
请注意,我有2-5个电子表格的永久编辑器,我不想删除。只有那些学生需要删除我在refreshSheet()函数中添加的内容。
我的密码是:
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());
}
} 发布于 2020-12-08 13:26:35
修改1:
代码中的问题是,您还没有在students函数中定义onePeriod:
function onePeriod(){
for (var i=0; i<students.length; i++) {
if (students[i][0] !== '') ss.removeEditor(students[i][0].toString());
}
} 由于students在另一个函数中有作用域,所以它不能在onePeriod或任何其他函数中使用。您可以像我在下面的解决方案中一样,在onePeriod中再次定义学生,或者将其定义为全局变量,以便可以在refreshSheet和onePeriod中使用。
修改2:
我有2-5个电子表格的永久编辑器,我不想删除。
然后定义一个不想删除的学生数组,并将他们从if条件中排除出来:
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分钟后执行,而不是暂停代码:
ScriptApp.newTrigger("onePeriod")
.timeBased()
.after(5 * 60 * 1000) // create trigger to execute onePeriod after 5 minutes
.create(); 我还添加了一个代码来删除与此函数相关的所有触发器,因此在创建新触发器之前清除前面的触发器。
解决方案:
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()即可。

https://stackoverflow.com/questions/65199055
复制相似问题