【问题标题】:Google Apps Script - Update All Groups and All Members from All GroupsGoogle Apps 脚本 - 更新所有组和所有组中的所有成员
【发布时间】:2020-12-17 13:12:16
【问题描述】:

我正在为一所学校工作,显然现在事情很困难。基本上,每个班级都有一个 Google 群组(例如,有一些例外情况,一位教师为他们的所有班级设置了一个群组),其中包含该班级的所有学生,因此教师可以轻松地通过电子邮件向每个人发送电子邮件至一次。 但是,部门、小组和学生注册确实并且将继续发生变化。因此,我正在尝试根据一些在线报告自动更新学生所属的 Google 群组。但我不断收到某种超时错误。第一次尝试是简单地一个一个地删除所有组中的所有成员,然后重新添加所有成员,但是在运行 20 分钟后一直超时 - 我实际上只是尝试运行代码以再次添加每个人,它抛出“超过了最大执行时间”,位于 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() 上抛出“未知错误”消息。

我很抱歉有这么多背景等等。我这几天一直在研究这个问题,考虑到我们都发现自己所处的奇怪环境,学校真的非常需要这项工作。

【问题讨论】:

    标签: google-apps-script google-drive-api google-admin-sdk google-groups google-groups-api


    【解决方案1】:

    您可能会达到网上论坛请求的限制。见Current quotas

    如果您有很多用户,最好使用 Admin SDK Directory API 来管理组。 Directory API: Group Members.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多