Google脚本如何获取getActiveUser()的GivenName()

时间:2013-02-22 04:03:22

标签: google-apps-script

域中的每个用户都会启动我们为休假权利运行的简单脚本,但我们希望欢迎消息为“Hi First Name”,但是脚本似乎无法从getActiveUser()获取getGivenName()对于标准用户。

有办法吗?

5 个答案:

答案 0 :(得分:5)

正如评论和Documentation中所述,只有域管理员才能访问UserManager服务。

这是另一种选择。域用户可能拥有自己的联系人,那么尽最大努力尝试找到自己的联系人呢?

/**
 * Get current user's name, by accessing their contacts.
 *
 * @returns {String} First name (GivenName) if available,
 *                   else FullName, or login ID (userName)
 *                   if record not found in contacts.
 */
function getOwnName(){
  var email = Session.getEffectiveUser().getEmail();
  var self = ContactsApp.getContact(email);

  // If user has themselves in their contacts, return their name
  if (self) {
    // Prefer given name, if that's available
    var name = self.getGivenName();
    // But we will settle for the full name
    if (!name) name = self.getFullName();
    return name;
  }
  // If they don't have themselves in Contacts, return the bald userName.
  else {
    var userName = Session.getEffectiveUser().getUsername();
    return userName;
  }
}

答案 1 :(得分:2)

您可以获取用户名,但首先必须使用配置API创建域用户。您可以通过登录管理员帐户启用API,然后选择域设置和用户设置选项卡以选中启用Provisioning API的复选框。详细了解here

然后您可以使用

   user = user.getgivenName()

答案 2 :(得分:2)

由于UserManager服务仅供域管理员使用,因此您可以以管理员身份发布服务,该服务为用户的“给定名称”提供服务,并使用UrlFetchApp从用户运行的脚本中调用该服务。

用户名服务

有关此基础信息,请参阅Content Service Documentation

该服务接受一个参数userName,该参数用于以管理员身份执行查找

将以下代码粘贴到脚本中,然后将deploy the script粘贴到Web服务中。这必须由域管理员完成,因为服务访问UserManager服务,但该域中的所有用户都必须可以访问该脚本。 (由于我不是我域中的管理员,我无法访问UserManager,所以我已经包含了一个用户可调用的域行进行测试,调用我在first answer中描述的getOwnName()函数。)

在访问已发布的服务之前,请记得从调试器调用doGet()以完成授权。

/**
 * When invoked as a Web Service running as Domain Administrator, 
 * returns the GivenName of the requested user.
 * 
 * @param {String} userName= Should be set to Session.getEffectiveUser().getUsername().
 */
function doGet(request) {
  //return ContentService.createTextOutput(getOwnName()); // for testing by non-admin user

  var userName = request.parameters.userName;
  var givenName = UserManager.getUser(userName).getGivenName();

  return ContentService.createTextOutput(givenName);
}

使用UrlFetch

调用服务

有关如何使用上一节中所述服务的说明,请参阅Using External APIs。我将展示如何从其他脚本访问该服务,但请记住,您也可以从域中的网页执行此操作。

我们将使用UrlFetchApp.fetch()来获取我们的服务,将用户的名字作为字符串返回。

该服务是为了接受一个参数userName而编写的,我们将其附加到网址userName=<string>

构建网址后,我们fetch(),然后从响应中检索名称。虽然此示例仅返回名称,但您可以选择更改服务以返回完整的“Hello User”字符串。

function testService() {
  var domain = "my-google-domain.com";
  var scriptId = "Script ID of service";
  var url = "https://script.google.com/a/macros/"+domain+"/s/"+scriptId+"/exec?"
     + "userName="+Session.getEffectiveUser().getUsername();
  var response = UrlFetchApp.fetch(url);
  var myName = response.getContentText();
  debugger;  // pause in debugger
}

答案 3 :(得分:2)

在Apps脚本中,我能够使用关于REST API获取此信息:https://developers.google.com/drive/v2/reference/about/get

var aboutData = Drive.About.get();
var userEmail = aboutData["user"]["emailAddress"];
var userDisplayName = aboutData["user"]["displayName"];

答案 4 :(得分:0)

在gmail帐户上获取显示名称的另一种可能的方法是在GmailApp中查找草稿电子邮件,并获取“发件人”标头,该标头可能具有全名。某些草稿可能设置为在gmail中没有显示名称,在这种情况下,“发件人”标头将仅是电子邮件地址,但通常“发件人”标头的格式为: Firstname Lastname <email@domain.com>

此代码应该使您从第一个gmail草稿中获取上面的字符串:(请注意,如果没有草稿,这可能会引发异常,因此请先进行检查。)

GmailApp.getDrafts()[0].getMessage().getHeader("From")

参考:https://developers.google.com/apps-script/reference/gmail/gmail-message#getHeader(String)

参考:https://www.ietf.org/rfc/rfc2822.txt