如何自动从查看模式切换到编辑模式,反之亦然

How to automatically switch from view mode to edit mode and vice-versa

我有几个 sheet 作为我的 Google 传播sheet 的主题,其中出勤是从 android 应用程序记录的。当我select查看模式到编辑模式时,可以记录考勤。

默认情况下,我想将其保持在查看模式,这样学生就不能在我作为 sheet 所有者或 class 教师(编辑)指定的时间之外提交出勤.

请注意我的 sheet 用户是:

所有人(所有者、编辑和学生)都在使用大学域特定邮件访问 sheets。

教师在class出勤期间启用编辑模式,然后在完成后每天再次返回查看模式,这也是一项繁琐的工作。我想要的是,使用 onOpen() 功能创建一个子菜单来自动化整个过程,以便教师可以轻松完成。

代码如下:

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('Attendance Task')
    .addItem('Refresh Sheet', 'refreshSheet')
    .addToUi();
}

//Refresh Sheet for setting Editor mode to students and taking their attendance from mobile app
function refreshSheet() { 

  var spreadsheet = SpreadsheetApp.getActive();

  //StudentList is a student information sheet where in Column F all the emails of students kept.  
  var sheet = spreadsheet.getSheetByName('StudentList');

  //Need to bring all students emails from Column F of StudentList sheet to students array.  
  var students = [];

  var ssId = SpreadsheetApp.getActiveSpreadsheet().getId();
  var ss = SpreadsheetApp.openById(ssId);
  for (var i=0; i<students.length; i++){
    //Checking the students are in Editor or Viewer Mode
    if(students[0] || students[1] || students[2] in Viewer Mode){
     ss.addEditor(students[i]); 
    }  
  }

  //Now start a timer and after 10 or 20 minutes all students should be removed automatically from Editor to Viewer Mode.    
     ss.removeEditor(students[i]);

}

您可以在 Apps 脚本中创建一个基于时间的可安装触发器,它将学生的权限更改为编辑,以便他们记录出勤情况,然后再将其改回 观众.

假设学生的电子邮件地址存储在 students 数组中,下面的代码片段将能够完成您的任务:

片段


function studentsToEditors() {
  var students = [];
  var ss = SpreadsheetApp.openById("ID_OF_THE_SS");
  for (var i=0; i<students.length; i++)
    ss.addEditor(students[i]);
}

function studentsToViewers() {
  var students = [];
  var ss = SpreadsheetApp.openById("ID_OF_THE_SS");
   for (var i=0; i<students.length; i++)
     ss.removeEditor(students[i])
}

function createTriggers() {
  ScriptApp.newTrigger('studentsToEditors')
      .timeBased()
      .atHour(9)
      .create();

  ScriptApp.newTrigger('studentsToViewers')
      .timeBased()
      .atHour(9)
      .nearMinute(30)
      .create();
}

说明

以上代码由三个函数组成:

  • studentsToEditors 用于将每个学生作为编辑者添加到电子表格;

  • studentsToViewers 用于删除每个学生作为电子表格的编辑者;

  • creteTriggers 用于创建两个时间驱动触发器:

    • 一个 运行 大约为 9 并附加到 studentsToEditors 函数;

    • 一个将 运行 大约 9:30(+/- 15 分钟)并附加到 studentsToViewers 函数;

这样,学生将被添加为编辑,以记录他们的出勤率,然后删除。

备注

用于studentsToViewersnearMinute(minute)方法指定触发运行s 的分钟(正负15分钟) .


更新

方法一

如果您拥有的 GSuite 帐户允许您执行脚本的时间比 6 minutes/script execution time 长,则可以使用以下方法。

您只需在代码中添加 Utilities.sleep(300000); 三次即可监控所需的 15 分钟。

Utilities.sleep(300000);
Utilities.sleep(300000);
Utilities.sleep(300000);
for (var i=0; i<students.length; i++) {
   ss.removeEditor(students[i]);
}

方法二

如果配额不允许您使用上述方法,您可以创建一个函数,专门删除学生编辑器,然后为其附加一个基于时间的触发器。

假设您在 removeStudents() 函数中删除学生,您可以创建这样的触发器:

function createTrigger(){
   ScriptApp.newTrigger("myFunction")
      .timeBased()
      .after(900000)
      .create();
}

如果需要,您还可以删除上述触发器,具体取决于您的 needs/quotas。

此外,请记住 可以配置基于时间的触发器来满足 您的 需求,方法是查看此文档 here 并为您的用例选择最合适的选项。

参考