【问题标题】:Script to delete a user account from G Suite Admin SDK从 G Suite Admin SDK 中删除用户帐户的脚本
【发布时间】:2018-04-05 03:50:09
【问题描述】:

我正在编写一个脚本,该脚本从电子表格中获取数据,并根据电子表格中输入的每个条目,获取基本上是电子邮件地址的数据,并从域中删除用户的帐户。

//** Delete the users on submitting the "Submit" button

function onFormSubmit(e) {
  //Logger.log(e);
  //Run this function passing on event "e" when the form is submitted.
  //Object e has form parameters sourced from the sheet attached to the form
  deleteUsers(e);
}

//Logs all the info from the spreadsheet and deletes the user
function deleteUsers() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues();
  for (var i = 0; i < data.length; i++) {
    Logger.log('managerEmail: ' + data[i][0]);
    Logger.log('email: ' + data[i][1]);
    Logger.log('trasferToEmail: ' + data[i][3]);

    var managerEmail = data[i][0];
    var email = data[i][1];
    var trasferToEmail = data[i][3];

    var request = {
   'url': 'https://www.googleapis.com/admin/directory/v1/users/' + email,
   'method' : 'DELETE'
    };
  }

但我仍然无法删除帐户。我实际上尝试根据此文档https://developers.google.com/admin-sdk/directory/v1/reference/users/delete 实现它,但不知道如何使用它。有任何想法吗?对不起,如果这是一个愚蠢的问题!我是 Google 脚本的新手。

【问题讨论】:

    标签: javascript google-apps-script google-workspace


    【解决方案1】:

    您将e 发送到deleteUsers(),但该函数不接收任何参数。当onFormSubmit() 已提供电子表格数据时,无需访问电子表格数据——请查看event object documentation 以供参考。

    function deleteUser(e) { 
      var data = e.namedValues;
      var managerEmail = data["Manager Email"][0]; //You'll need to adjust the field names to match with your form data
      var email = data["Email"][0];
      var transferToEmail = data["Transfer to Email"][0];
      var response = AdminDirectory.Users.remove(email);
    }
    

    为确保您的触发器设置正确,请先将表单回复保存到您的电子表格中。然后编辑 > 当前项目的触发器并复制这些设置:

    要使AdminDirectory 工作,您需要enable advanced services。 (在脚本编辑器中,转到资源 > 高级 Google 服务并“打开”Admin Directory API。然后单击模式底部的链接以在 API 控制台中启用 Admin SDK。)

    如果我对表单收集的数据有误,并且您确实需要从电子表格中提取数据(假设表单未连接到工作表),那么您需要 create a trigger提交到该表格。运行这个函数来安装触发器。

    function installFormTrigger() {
      var form = FormApp.openById("FORM_ID");
      ScriptApp.newTrigger("deleteUsers")
      .forForm(form)
      .onFormSubmit()
      .create();
    }
    

    然后你原来的deleteUsers() 函数将几乎像你拥有它一样工作,但添加了AdminDirectory

    function deleteUsers() {
      var sheet = SpreadsheetApp.getActive().getSheetByName("SheetName"); //HIGHLY recommend using this instead
      var data = sheet.getDataRange().getValues();
      for (var i = 0; i < data.length; i++) {
        var managerEmail = data[i][0];
        var email = data[i][1];
        var trasferToEmail = data[i][3];
        var response = AdminDirectory.Users.remove(email);
      }
    }
    

    请注意,在您的 for 循环中,您可能会遇到无效电子邮件或 AdminDirectory 可能会出现错误,因此我建议您实现 try...catchlogging

    【讨论】:

    • 感谢@Diego 的精彩回答,电子表格实际上包含从表单获得的响应以及电子表格所连接的响应。另外,如果我想简单地暂停帐户,有什么办法吗?我试过AdminDirectory.Users.update({'suspended':true}, email),但这没有帮助。
    • 当用户使用电子邮件 ID 提交 google 表单(用于离职)时,我实际上是在尝试删除用户帐户,它必须简单地暂停或删除该帐户。
    • 我不完全确定,但查看aliases 的示例代码,试试{suspended: true}{suspended: 'true'}。在别名示例中,我看到它们没有用引号括住属性名称。
    • 谢谢,但即使我在电子表格ibb.co/kUGXcH 中有数据,它显示Resource Not Found: userKey 的代码var response = AdminDirectory.Users.update({suspended:'true'},email); ibb.co/fAcxcH,我也创建了一个具有电子邮件ID 的虚拟帐户在 G Suite 中,但它仍然显示错误,有什么帮助吗?
    • 先尝试getting the user,然后在返回的对象中查找他们的用户密钥。
    【解决方案2】:

    最好使用AdminDirectory.Users.remove(email);,而不是像您那样向 API 发出请求。

    如果您想记录响应var request = AdminDirectory.Users.remove(data[i][1]);,请将其保存在变量中

    激活管理目录;

    1. 转到资源 -> 高级 Google 服务

    2. 启用管理目录,然后单击指向 Google API 控制台的链接。

    3. 单击启用 API 和服务
    4. 搜索管理 SDK
    5. 点击 Admin SDK,然后点击“启用”

    【讨论】:

    • 当我在代码中尝试它显示ReferenceError: "AdminDirectory" is not defined. 错误。 AdminDirectory 不是内置类吗?
    • 如果您打算将此表单分发给您的域成员以允许他们使用它来删除用户,我会建议不要这样做,或者至少我不会在FormSubmit 上这样做。
    • 感谢@james-donnellan 的回答,如果我想简单地暂停帐户,有什么办法吗?我试过 AdminDirectory.Users.update({'suspended':true}, email) 但这没有帮助。
    • 当用户使用电子邮件 ID 提交 google 表单(用于离职)时,我实际上是在尝试删除用户帐户,它必须简单地暂停或删除该帐户。
    • AdminDirectory.Users.update({'suspended':true}, email) 对我来说很好,尝试记录并查看响应。 Logger.log(AdminDirectory.Users.update({'suspended':true}, email)
    猜你喜欢
    • 2022-06-12
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-04
    • 2018-11-30
    • 2020-11-30
    相关资源
    最近更新 更多