如何自动从查看模式切换到编辑模式,反之亦然
How to automatically switch from view mode to edit mode and vice-versa
我有几个 sheet 作为我的 Google 传播sheet 的主题,其中出勤是从 android 应用程序记录的。当我select查看模式到编辑模式时,可以记录考勤。
默认情况下,我想将其保持在查看模式,这样学生就不能在我作为 sheet 所有者或 class 教师(编辑)指定的时间之外提交出勤.
请注意我的 sheet 用户是:
- 我作为所有者和编辑
- 课程教师作为编辑(几个 sheets 意味着有几个科目)
- 同学们
所有人(所有者、编辑和学生)都在使用大学域特定邮件访问 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
函数;
这样,学生将被添加为编辑,以记录他们的出勤率,然后删除。
备注
用于studentsToViewers
的nearMinute(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 并为您的用例选择最合适的选项。
参考
我有几个 sheet 作为我的 Google 传播sheet 的主题,其中出勤是从 android 应用程序记录的。当我select查看模式到编辑模式时,可以记录考勤。
默认情况下,我想将其保持在查看模式,这样学生就不能在我作为 sheet 所有者或 class 教师(编辑)指定的时间之外提交出勤.
请注意我的 sheet 用户是:
- 我作为所有者和编辑
- 课程教师作为编辑(几个 sheets 意味着有几个科目)
- 同学们
所有人(所有者、编辑和学生)都在使用大学域特定邮件访问 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
函数;
这样,学生将被添加为编辑,以记录他们的出勤率,然后删除。
备注
用于studentsToViewers
的nearMinute(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 并为您的用例选择最合适的选项。