如何获取getActiveUser()的GivenName()

问题描述 投票:0回答:6

域中的每个用户都会启动一个简单的脚本,我们为休假权利而运行,但我们希望欢迎消息为“Hi First Name”,但是该脚本似乎无法从

getGivenName()
获取
getActiveUser()
来获取休假权利标准用户。

有办法吗?

google-apps-script
6个回答
16
投票

如评论和文档中所述,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;
  }
}

6
投票

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

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

2
投票

您可以获得用户名,但首先您必须使用配置 API 创建域用户。您可以通过登录管理员帐户来启用 API,然后选择域设置和用户设置选项卡以选中启用配置 API 的复选框。阅读更多相关信息这里

然后您可以使用

   user = user.getgivenName()

2
投票

由于 UserManager 服务仅对域管理员可用,因此您可以以管理员身份发布服务,为用户的名字提供服务,并使用

UrlFetchApp
从用户运行的脚本中调用该服务。

用户名服务

请参阅内容服务文档了解其所依据的背景信息。

服务接受参数

userName
,它使用该参数以管理员身份执行查找。

将以下代码粘贴到脚本中,然后

将该脚本部署为 Web 服务。这必须由域管理员完成,因为该服务访问 UserManager 服务,但该脚本必须可供域中的所有用户访问。 (由于我不是域中的管理员,因此我无法访问 UserManager,因此我包含了一个域用户可调用行进行测试,调用我在第一个答案

中描述的 
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 调用服务

请参阅

使用外部API了解如何使用上一节中编写的服务的说明。我将展示如何从另一个脚本访问该服务,但请记住,您也可以从域内的网页执行此操作。

我们将使用

UrlFetchApp.fetch()

 让我们的服务以字符串形式返回用户的名字。

该服务被编写为接受一个参数

userName

,我们将其附加到 url,格式为 
userName=<string>

构建 URL 后,我们

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 }
    

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

Firstname Lastname <[email protected]>



此代码应该从第一个 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


0
投票

User 类仅提供对一种方法的访问,即 getEmail

 方法。因此,在 Apps 脚本中获取用户详细信息的最简单方法是通过对 
https://www.googleapis.com/oauth2/v2/userinfo
 端点的 API 调用。

示例:

const api = 'https://www.googleapis.com/oauth2/v2/userinfo'; const query = UrlFetchApp.fetch(api, { headers: { Authorization: 'Bearer ' + ScriptApp.getOAuthToken(), }, }); const response = JSON.parse(query.getContentText());
姓名、电子邮件、图片等用户数据将包含在 

response

 对象中。

ScriptApp.getOauthToken方法获取有效用户的令牌,因此适用于所有用户。

© www.soinside.com 2019 - 2024. All rights reserved.