【问题标题】:Auto update Google Group membership per dynamic email address list in Google Spreadsheet根据 Google 电子表格中的动态电子邮件地址列表自动更新 Google 群组成员资格
【发布时间】:2014-01-10 19:13:52
【问题描述】:

我有一个包含 6 列电子邮件地址的电子表格,这些电子邮件地址会根据用户输入和年龄自动更新。每列对应一个不同的 Google Group。

我想根据每个电子表格列中的动态值自动填充 Google 群组成员资格。例如——无论是在编辑时还是在每日计时器中——Google 脚本都会读取 A 列中的电子邮件地址列表并更新相应的 Google 组。

理想情况下,脚本会调用当前的 Google 群组成员资格,将其与 A 列中的电子邮件地址列表进行比较,从群组中删除不再出现在 A 列中的所有地址,并将所有出现的地址添加到群组中在 A 列,但目前不在组中。

这可能要求太多了。因此,或者,我可以想象脚本从组中删除所有成员,然后将 A 列中的所有电子邮件地址添加到组中。虽然这将实现相同的目标(据我所知),但我想知道是否会丢失一些历史记录或类似的副作用来例行删除所有成员。因此,我更喜欢首先描述的比较方法。

在论坛里,我可以找到这个讨论,来自 Serge insas 的回复: Add emailadress to Spreadsheet, auto add the email to a Google group

当我在脚本编辑器中运行此代码并将“testgroup@domain.com”替换为我的 Google 群组的电子邮件地址时,我收到以下错误:

服务错误: : 无效的请求 URI

参考第 10 行,即

var group = GroupsManager.getGroup('testgroup@domain.com');

克服该错误是 1 个问题。一旦我克服了这个错误,我需要学习如何将组成员身份与电子表格列表进行比较和/或删除所有并重新导入所有。

非常感谢您对这两个问题的任何帮助!


编辑 1(在 Mogsdad 确认我无法使用 GAS API 更新 Google 群组成员资格后)

好的,所以 B 计划对我来说不是一个变通方案,因为我太新手了,去那里感觉不舒服。计划 B 是编写一个脚本,将电子表格用户列表与 Google Group 用户列表进行比较,并告诉我哪些用户需要手动添加到 Google Group 用户列表中/从中删除。我已经修改了您在链接到我的帖子中提供的代码。

    function compareGroupMembers() {  
      var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Groups');
      var rows = sheet.getDataRange();
      var values = rows.getValues();
      var sheetUsers = [];
    Logger.log(values)

    // Get user list from sheet
      for (var i = 1; i < values.length; i++) {
        var row = values[i];
        sheetUsers.push(row[0]); // build array of users
      }
      Logger.log(sheetUsers)

    // Get user list from group
      var group = GroupsApp.getGroupByEmail("mygroup@googlegroups.com");
      var groupUsers = group.getUsers().join(',').split(',');
      Logger.log(groupUsers)

    // Compare user lists and define users to Add and Remove
    //*****This is where I need direction. This code is just a placeholder.*****
      var usersToAdd = sheetUsers.uniqueFrom(groupUsers);
      var usersToRemove = groupUsers.uniqueFrom(sheetUsers);
      var addErrors = 0; // Counter for exceptions

    //Then I would like usersToAdd and usersToRemove to be listed in a separate sheet
    //Because I have six groups, I'm hoping the new sheet can be organized by
    //Col A is Google Group email
    //Col B is user email
    //Col C is "add" or "delete"

    };

是否可以创建一个输出来告诉我要手动添加哪些成员(即那些在工作表列表中但不在组列表中的成员)以及要手动删除的那些成员(即那些在组列表中但不在工作表列表中)?

另外,我可以让同一个脚本为六个不同的组做同样的事情吗? (在我的工作表中,组电子邮件地址在第 1 行,成员电子邮件地址在它的正下方,对于所有 6 列)如果可能,那么我希望输出指定用户必须手动添加到哪个组或从中删除。

感谢您的帮助!

【问题讨论】:

    标签: google-apps-script google-sheets google-groups


    【解决方案1】:

    您应该能够修改来自How to add permission to Google site using spreadsheet? 的代码,分别将Site.getViewersSite.addViewer()Site.removeViewer() 替换为DomainGroup.getAllMembers()DomainGroup.addMember()DomainGroup.removeMember(),并适当调整其他细节。

    WRT 你的错误...确保你没有混淆组类型。见Domain groups versus Google groups

    【讨论】:

    • 您好 Mogsdad,感谢您提请我注意域组和 Google 组之间的区别。我正在处理 Google Groups。我在你的帖子之后做了更多的挖掘,发现了这个帖子:stackoverflow.com/questions/3757793/api-for-google-groups。 GOOGLE GROUPS 没有 API 是真的吗?这是否意味着我无法使用 GAS 在 Google 网上论坛中添加或删除用户? (我是新手,谢谢你的辅导。)
    • 哇,主要是无赖:(不过感谢您的解释。我更新了我的原始帖子,请求帮助解决一个更简单的问题(只想比较两个列表并报告唯一值以便我可以手动更改 Google 群组成员资格)。谢谢!
    • 快速提问,因为我要靠你说了算——网上的讨论似乎表明,在班级组内,函数 getUser 只返回带有 gmail.com 的电子邮件地址,而不返回任何其他人(例如 yahoo.com 或 comcast.net)。这是真的?如果是这样,您能否告诉我是否有某种解决方法可以让我检索组中的所有成员,而不管电子邮件域如何?谢谢!
    • 由于 Google Groups UI 中有一个导出按钮,因此 GAS 没有相应的功能似乎很奇怪。
    • 感谢您的帮助。这有效地扼杀了我的项目,但至少我可以停止旋转我的轮子!
    猜你喜欢
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多