通过 Appmaker 在 JSON 中添加空格和 LR

Added spaces and LRs in JSON via Appmaker

我正在使用 AppMaker 创建一个新的 employee/user 配置工作流程。我正在创建一个新的 G Suite 用户,我的 JSON 中的 spaces 有一个非常奇怪的问题。它导致错误:GoogleJsonResponseException:API 调用 directory.users.insert 失败,出现错误:

Invalid Input at provisionUser (AdminDirectory:5)

我已经解决这个问题一段时间了,似乎在 AppMaker 和 AdminDirectory 调用之间的某个地方,一些额外的 spaces 和硬 returns 被插入到我的用户数据中。下面我要展示:

  1. 收集用户信息的客户端代码
  2. 服务器端用户创建脚本
  3. 用户的控制台输出JSON
  4. 用户 JSON 来我的电子邮件进行故障排除的输出
  5. 在 Notepad++ 中看到的电子邮件输出

客户端代码

...a bunch of data gathering from a form, then...
  var user = {
    primaryEmail: email,
    name: {
      givenName: firstName,
      familyName: lastName
    },
    addresses: [{
      type: 'work',
      formatted: address
    }],
    organizations: [{
      title: title,
      department: department,
      fullTimeEquivalent: ftpt
    }],
    phones: [{
      type: 'work',
      value: phone
    }],
    locations: [{
      buildingId: building,
      type: 'desk',
      area: 'desk'
    }],
    password: 'xxxxxxxx',
    changePasswordAtNextLogin: true,
    orgUnitPath: orgUnit,
    relations: [{
      type: 'manager',
      value: supervisor
    }],
    customSchemas: {
      sclsnj: {
        startDate: effective,
        mls: mls,
        location: location
      }
    }
  };
  google.script.run.provisionUser(user, grouparray);

服务器端代码

function provisionUser(user, grouparray) {
  user = JSON.stringify(user);
  MailApp.sendEmail('lhoffman@xxxxxxxx.org', 'New Google User', user); 
  console.log(user);
  user = AdminDirectory.Users.insert(user);
  for (var g = 0; g < grouparray.length; g++) {
    var groupEmail = grouparray[g] + '@xxxxxxxx.org';
    var member = {
      email: user,
      role: 'MEMBER'
    };
    Logger.log(groupEmail);
    AdminDirectory.Members.insert(member, groupEmail);
  }  
}

控制台输出

{"primaryEmail":"jsmith@xxxxxxxx.org","name":{"givenName":"John","familyName":"Smith"},"addresses":[{"type":"work","formatted":"Bound Brook branch\n402 E High Street, Bound Brook, NJ 08805"}],"organizations":[{"title":"Library Technician","department":"Adult Services","fullTimeEquivalent":100000}],"phones":[{"type":"work","value":"908-458-8410"}],"locations":[{"buildingId":"BBROOK","type":"desk","area":"desk"}],"password":"xxxxxxxx","changePasswordAtNextLogin":true,"orgUnitPath":"/Branches/Bound Brook branch","relations":[{"type":"manager","value":"msmith@xxxxxxxx.org"}],"customSchemas":{"sclsnj":{"startDate":"2019-05-20T04:00:00.000Z","mls":false,"location":"Bound Brook branch"}}}

电子邮件输出

{"primaryEmail":"jsmith@xxxxxxxx.org","name":{"givenName":"John","familyName":"Smith"},"addresses":[{"type":"work","formatted":"Bound  
Brook  
branch\n402 E High Street, Bound Brook, NJ  
08805"}],"organizations":[{"title":"Library Technician","department":"Adult  
Services","fullTimeEquivalent":100000}],"phones":[{"type":"work","value":"908-458-8410"}],"locations":[{"buildingId":"BBROOK","type":"desk","area":"desk"}],"password":"xxxxxxxx","changePasswordAtNextLogin":true,"orgUnitPath":"/Branches/Bound  
Brook  
branch","relations":[{"type":"manager","value":"msmith@xxxxxxxx.org"}],"customSchemas":{"sclsnj":{"startDate":"2019-05-20T04:00:00.000Z","mls":false,"location":"Bound  
Brook branch"}}}

Notepad++ 中的电子邮件输出(带控制字符)

注意:我意识到 JSON 实际上在图像中出现了两次,但您肯定可以看到额外的 space 和左进纸字符。

我已经确认我可以通过使用 Google API 资源管理器并将其复制并粘贴到目录 API 的请求正文中来为用户提供控制台输出Users.insert.

我还确认输出的电子邮件版本使用相同的方法工作。当我将该版本粘贴到 API Explorer 的请求正文中时,我收到错误警报,并且从正文字段中的颜色编码可以清楚地看出它是不正确的。即使我不将输出通过电子邮件发送给自己,我也会遇到相同的错误行为,所以我很确定发送电子邮件的行为不会把事情搞砸。

求助!!

如果你这样做会发生什么?

function provisionUser(user, grouparray) {
  var user = JSON.stringify(user);
  MailApp.sendEmail('lhoffman@xxxxxxxx.org', 'New Google User', user); 
  console.log(user);
  AdminDirectory.Users.insert(user);
  for (var g = 0; g < grouparray.length; g++) {
    var groupEmail = grouparray[g] + '@xxxxxxxx.org';
    var member = {
      email: user,
      role: 'MEMBER'
    };
    Logger.log(groupEmail);
    AdminDirectory.Members.insert(member, groupEmail);
  }  
}

无效输入是特定字段格式不正确的结果。在您的情况下,我看到您正在使用自定义架构。自定义架构中有一个格式不正确的特定字段,即 startDate。不要提供 2019-05-20T04:00:00.000Z 的值,而只需使用 2019-05-20

原因是该字段需要 完整日期 值而不是 完整日期加上小时和分钟 。正如您在 ISO-8601 date format 上看到的那样, 完整日期 格式为 YYYY-MM-DD.

参考:https://developers.google.com/admin-sdk/directory/v1/reference/schemas/insert