You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过编程语言从Salesforce下载Content Documents并按账户归类?

解决方案:批量下载Salesforce Account关联的Content Documents并按账户分类

方法一:Python + Salesforce REST API(推荐)

这种方法灵活可控,能自动完成文件夹创建和文件下载,适合有基础编程能力的用户。

步骤:

  1. 安装依赖包
pip install simple-salesforce python-dotenv requests
  1. 编写脚本(保存为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}")
  1. 创建.env文件,填入你的Salesforce凭证:
SF_USERNAME=你的Salesforce用户名
SF_PASSWORD=你的Salesforce密码
SF_SECURITY_TOKEN=你的Salesforce安全令牌
  1. 运行脚本:
python sf_doc_downloader.py

方法二:Apex + 本地脚本(适合有Salesforce开发权限的用户)

如果无法使用外部脚本,可以先通过Apex导出关联数据,再用本地脚本处理下载。

步骤:

  1. 在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;
        }
    }
}
  1. 通过Execute Anonymous执行Apex,将结果导出为CSV(可通过自定义Visualforce页面或第三方工具实现导出)
  2. 用Python脚本读取CSV并完成下载(逻辑参考方法一,仅需修改数据来源为CSV文件)

方法三:Salesforce报表 + 手动整理(适合无编程基础的用户)

如果不想写代码,可以通过报表导出链接,再手动分类:

  • 在ContentDocument对象上创建自定义公式字段:HYPERLINK("/sfc/servlet.shepherd/version/download/" & LatestPublishedVersionId, "下载链接")
  • 创建报表,包含Account名称、ContentDocument标题、自定义下载链接字段
  • 导出报表为CSV,手动复制下载链接批量下载,再按账户名称整理到对应文件夹

注意事项:

  • 确保拥有ContentDocument、ContentDocumentLink、ContentVersion对象的读取权限,以及文件下载权限
  • 大文件建议用方法一的流式下载,避免超时
  • 处理文件名/账户名中的特殊字符,防止创建文件夹或文件失败

内容的提问来源于stack exchange,提问作者user3279174

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 11:40:52