开发Salesforce与表格集成:无法获取编辑者邮箱,Session.getActiveUser().getEmail()返回空
问题解答
1. 如何获取修改记录的用户邮箱?
分两种场景处理:
- Salesforce内记录被修改:每条Salesforce记录自带
LastModifiedById字段,存储最后修改该记录的用户ID。通过这个ID关联查询User对象的Email字段即可,示例代码:Id modifiedById = targetRecord.LastModifiedById; User modifiedUser = [SELECT Email FROM User WHERE Id = :modifiedById LIMIT 1]; String editorEmail = modifiedUser?.Email; - 电子表格端修改同步到Salesforce:先从电子表格平台(如Google Sheets、Excel)的API捕获编辑者邮箱,再将该信息同步到Salesforce记录的自定义字段(比如
Editor_Email__c),之后直接从这个自定义字段取值。
2. 为何Session.getActiveUser().getEmail()会返回空字符串?
常见原因包括:
- 当前执行上下文的用户未配置邮箱:比如集成专用用户(Connected App授权用户、自动化流程用户),可能未在Salesforce中设置邮箱字段。
- 字段级权限限制:当前用户的Profile或Permission Set未被授予查看
User.Email字段的权限,即使邮箱存在也无法读取。 - 无用户上下文的执行环境:定时批处理、队列Apex、部分异步触发器场景下,
Session.getActiveUser()返回系统用户,这类用户通常无邮箱配置。 - 用户个人信息中邮箱字段为空:检查该用户的Salesforce个人设置,确认邮箱是否已填写。
3. Session.getActiveUser().getEmail()如何返回有权访问该电子表格的其他用户的邮箱?
Session.getActiveUser()仅能获取当前执行代码的上下文用户的邮箱,无法直接返回其他有权限用户的信息。要获取这类用户的邮箱,需按以下方式处理:
- Salesforce记录权限场景:根据对象共享模型,查询对应共享表(如
AccountShare、ContactShare),或通过User对象结合权限筛选,示例思路:// 查询有权访问指定Account的用户邮箱 List<User> authorizedUsers = [ SELECT Email FROM User WHERE Id IN ( SELECT UserOrGroupId FROM AccountShare WHERE AccountId = :targetAccountId AND RowCause != 'Manual' ) ]; - 电子表格平台权限场景:调用电子表格平台的API(如Google Sheets的Drive API)获取共享用户列表,再匹配Salesforce中的用户邮箱。
内容的提问来源于stack exchange,提问作者Prem Kumar
相关产品推荐
相关产品推荐

