Google Apps脚本-更新所有网上论坛和所有网上论坛的所有会员

问题描述

我正在为学校工作,现在显然很困难。基本上每个班级都有一个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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...