问题描述
我正在为学校工作,现在显然很困难。基本上每个班级都有一个Google网上论坛(有些例外,例如,一位老师针对该班级的所有班级都有一个小组),该班级中的所有学生都装满了,因此,老师可以轻松地通过电子邮件向所有人发送电子邮件一旦。 但是,部分,小组和学生的入学人数将会并且将继续变化。因此,我正在尝试根据一些在线报告自动更新学生所属的Google网上论坛。但我不断收到某种超时错误。第一步是简单地逐个删除所有组中的所有成员,然后重新添加所有成员,但这在运行20分钟后一直超时-我实际上只是尝试运行代码以再次添加EVERYONE,然后抛出“ 36xxx行9924上的“超出了最大执行时间”。然后我尝试比较昨天的学生名册和今天的学生名册,仅添加/删除那些不同的学生(如果他们在昨天的名册中,但今天不是他们,则需要删除,如果他们在今天的名册中而不是昨天,则需要添加),但是这是有问题的,因为有时组电子邮件(或更确切地说是与某个节绑定的组)将发生更改,因此它不是根据节-组映射更改(例如,组123)将学生从不再应该属于的组中删除和124都映射到Farris.History.1@domain.edu,但现在124映射到Farris.History.2@domain.edu,但是由于昨天的花名册和今天的花名册都表明学生xyz属于124组,因此未进行任何更改。因为更新是基于名册更改而名册上没有任何更改(即使应将其映射到其他位置)。
所以,确实,我需要一种方法来自动确保所有学生都属于他们应该参加的小组,而只有他们应该参加的小组,并且它需要每天更新。我确实有一个带有部分ID->组电子邮件的映射的表和一个带有学生ID->部分ID的表。 Sheet
我尝试过的脚本内容:
function addAllMembers(){
const students = SpreadsheetApp.openById("student sheet").getSheetByName("Today").getDatarange().getValues();
const sched = SpreadsheetApp.openById("schedule sheet").getSheets()[0];
const sID = [].concat.apply([],sched.getRange(2,1,sched.getLastRow()-1).getValues());
const groups = sched.getRange(2,2,sched.getLastRow()-1).getValues();
let sEmail,ID,gEmail,r,group;
for (let i in add){
Logger.log(i);
sEmail = students[i][0]+"@domain.edu";
ID = students[i][5];
r = sID.indexOf(ID);
if(r > -1)
gEmail = groups[r][0];
try {
addGroupMember(sEmail,gEmail);
} catch(e) {
Logger.log(e);
}
}
}
^这超时了。
function getServerMembers(){
const sh = SpreadsheetApp.openById("server").getSheetByName("Server");
const grps = sh.getDatarange().getValues();
let out = [[]];
let mem;
// for (let i in grps){
for (let i = 0; i < 100; i++){
Logger.log(grps[i][1]);
if (grps[i][0] == "")
continue;
try {
out.push(GroupsApp.getGroupByEmail(grps[i][1]).getUsers());
} catch(e) {
Logger.log(i);
break;
}
// Utilities.sleep(1000);
}
Logger.log(out);
}
^这是尝试从服务器信息而不是教师表重建学生名册。它失败了,因为您显然不能多次调用GroupsApp.getGroupByEmail()。getUsers()函数。同样,当我按照错误消息的建议添加Utilities.sleep(1000)时,它仅在800个组中的55个组超时后仍然失败,或者抛出了“在.getUsers()时出现未知错误”消息。
对于这么多的背景等等,我感到很抱歉。我已经为此努力了好几天,考虑到我们大家都遇到的奇怪情况,学校真的非常需要这项工作。
解决方法
您可能达到了网上论坛请求的限制。参见Current quotas。
如果您有很多用户,最好使用Admin SDK Directory API来管理组。 Directory API: Group Members。