域上的每个用户都会启动一个我们为休假权利运行的简单脚本,但我们希望欢迎消息是“Hi First Name”,但是该脚本似乎无法从 getActiveUser() 获取 getGivenName() 作为标准用户。
有办法吗?
域上的每个用户都会启动一个我们为休假权利运行的简单脚本,但我们希望欢迎消息是“Hi First Name”,但是该脚本似乎无法从 getActiveUser() 获取 getGivenName() 作为标准用户。
有办法吗?
如评论和文档中所述,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;
}
}
在 Apps Script 中,我能够使用 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"];
您可以获取用户名,但首先您必须使用配置 api 创建域用户。您可以通过登录到您的管理员帐户来启用 API,然后选择域设置和用户设置选项卡以选中启用供应 API 的复选框。在此处阅读有关它的更多信息
然后你可以使用
user = user.getgivenName()
由于 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);
}
有关如何使用上一节中编写的服务的说明,请参阅使用外部 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
}
获取 gmail 帐户显示名称的另一种潜在方法是在 GmailApp 中查找草稿电子邮件,并获取可能具有全名的 From 标头。某些草稿可能在 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)