如何通过编程语言从Salesforce下载Content Documents并按账户归类?
解决方案:批量下载Salesforce Account关联的Content Documents并按账户分类
方法一:Python + Salesforce REST API(推荐)
这种方法灵活可控,能自动完成文件夹创建和文件下载,适合有基础编程能力的用户。
步骤:
- 安装依赖包
pip install simple-salesforce python-dotenv requests
- 编写脚本(保存为
sf_doc_downloader.py)
from simple_salesforce import Salesforce import os import requests from dotenv import load_dotenv from datetime import datetime # 加载环境变量(建议把Salesforce凭证存在.env文件里,避免硬编码) load_dotenv() # 连接Salesforce sf = Salesforce( username=os.getenv('SF_USERNAME'), password=os.getenv('SF_PASSWORD'), security_token=os.getenv('SF_SECURITY_TOKEN') ) # 查询所有关联Account的ContentDocument数据 query = """ SELECT Account.Name, ContentDocument.Title, ContentDocument.LatestPublishedVersionId FROM ContentDocumentLink WHERE LinkedEntity.Type = 'Account' """ # 获取所有查询结果(自动处理分页) all_records = sf.query_all(query)['records'] # 遍历处理每个文件 for record in all_records: # 提取账户名称并处理非法字符(避免创建文件夹失败) raw_acc_name = record['Account']['Name'] safe_acc_name = raw_acc_name.translate(str.maketrans({'/':'_', '\\':'_', ':':'_', '*':'_', '?':'_', '"':'_', '<':'_', '>':'_', '|':'_'})) # 提取文件信息 doc_title = record['ContentDocument']['Title'] version_id = record['ContentDocument']['LatestPublishedVersionId'] # 创建账户专属文件夹 acc_folder = os.path.join('Salesforce_Account_Files', safe_acc_name) os.makedirs(acc_folder, exist_ok=True) # 获取文件下载链接和扩展名 version_data = sf.query(f"SELECT ContentUrl, FileExtension FROM ContentVersion WHERE Id = '{version_id}'")['records'][0] download_url = version_data['ContentUrl'] file_ext = version_data['FileExtension'] # 处理重复文件名(如果存在同名文件,添加时间戳) file_path = os.path.join(acc_folder, f"{doc_title}.{file_ext}") if os.path.exists(file_path): timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") file_path = os.path.join(acc_folder, f"{doc_title}_{timestamp}.{file_ext}") # 流式下载文件(带上Salesforce会话凭证,适配大文件) headers = {'Authorization': f'Bearer {sf.session_id}'} response = requests.get(download_url, headers=headers, stream=True) with open(file_path, 'wb') as f: for chunk in response.iter_content(chunk_size=1024*1024): f.write(chunk) print(f"已完成:{file_path}")
- 创建
.env文件,填入你的Salesforce凭证:
SF_USERNAME=你的Salesforce用户名 SF_PASSWORD=你的Salesforce密码 SF_SECURITY_TOKEN=你的Salesforce安全令牌
- 运行脚本:
python sf_doc_downloader.py
方法二:Apex + 本地脚本(适合有Salesforce开发权限的用户)
如果无法使用外部脚本,可以先通过Apex导出关联数据,再用本地脚本处理下载。
步骤:
- 在Salesforce中创建Apex类
public class AccountContentExporter { public static List<ContentExportWrapper> getLinkedContent() { List<ContentExportWrapper> result = new List<ContentExportWrapper>(); // 查询关联关系 List<ContentDocumentLink> linkList = [ SELECT Account.Name, ContentDocument.Title, ContentDocument.LatestPublishedVersionId FROM ContentDocumentLink WHERE LinkedEntity.Type = 'Account' ]; // 批量查询版本信息 Set<Id> versionIds = new Set<Id>(); for(ContentDocumentLink link : linkList) { versionIds.add(link.ContentDocument.LatestPublishedVersionId); } Map<Id, ContentVersion> versionMap = new Map<Id, ContentVersion>([ SELECT Id, ContentUrl, FileExtension FROM ContentVersion WHERE Id IN :versionIds ]); // 封装数据 for(ContentDocumentLink link : linkList) { ContentVersion cv = versionMap.get(link.ContentDocument.LatestPublishedVersionId); result.add(new ContentExportWrapper( link.Account.Name, link.ContentDocument.Title, cv.ContentUrl, cv.FileExtension )); } return result; } public class ContentExportWrapper { public String AccountName {get; set;} public String DocumentTitle {get; set;} public String DownloadUrl {get; set;} public String FileExtension {get; set;} public ContentExportWrapper(String accName, String docTitle, String url, String ext) { AccountName = accName; DocumentTitle = docTitle; DownloadUrl = url; FileExtension = ext; } } }
- 通过Execute Anonymous执行Apex,将结果导出为CSV(可通过自定义Visualforce页面或第三方工具实现导出)
- 用Python脚本读取CSV并完成下载(逻辑参考方法一,仅需修改数据来源为CSV文件)
方法三:Salesforce报表 + 手动整理(适合无编程基础的用户)
如果不想写代码,可以通过报表导出链接,再手动分类:
- 在
ContentDocument对象上创建自定义公式字段:HYPERLINK("/sfc/servlet.shepherd/version/download/" & LatestPublishedVersionId, "下载链接") - 创建报表,包含
Account名称、ContentDocument标题、自定义下载链接字段 - 导出报表为CSV,手动复制下载链接批量下载,再按账户名称整理到对应文件夹
注意事项:
- 确保拥有
ContentDocument、ContentDocumentLink、ContentVersion对象的读取权限,以及文件下载权限 - 大文件建议用方法一的流式下载,避免超时
- 处理文件名/账户名中的特殊字符,防止创建文件夹或文件失败
内容的提问来源于stack exchange,提问作者user3279174
相关产品推荐
相关产品推荐

