如何从SharePoint列表中仅获取最新添加的文件同步至Azure Blob存储?
针对你遇到的问题——每天从SharePoint当月子文件夹里同步最新文件到Azure存储,而不是所有文件,我整理了几个经过实践验证的方案,帮你优化Logic App的逻辑:
方案1:直接通过文件属性筛选(最简便)
既然你每天只新增一个文件,最直接的方式就是利用SharePoint文件的Created或Last Modified属性,在Logic App里直接筛选出最近24小时内创建的文件,步骤如下:
- 触发器:用
Recurrence触发器设置每天运行一次 - 定位当月子文件夹:
- 添加
Get folders动作,选择你的SharePoint站点和文档库 - 在Filter Query里写:
(假设你的子文件夹命名是startswith(FileLeafRef, '@{formatDateTime(utcNow(), 'yyyy-MM')}')YYYY-MM格式,比如2024-09)
- 添加
- 筛选最新文件:
- 对每个找到的子文件夹,添加
Get files (properties only)动作 - 在Filter Query里设置筛选条件,只拿昨天至今创建的文件:
Created ge '@{addDays(utcNow(), -1)}' - 如果你的SharePoint站点时区不是UTC,记得转换时区后再计算,比如中国时区:
Created ge '@{addDays(convertTimeZone(utcNow(), 'UTC', 'China Standard Time'), -1)}'
- 对每个找到的子文件夹,添加
- 同步到Azure存储:对筛选出的文件执行
Copy file动作即可
方案2:优化Blob对比逻辑(适合需要校验已同步文件的场景)
你之前尝试对比Blob列表的思路没问题,可能是逻辑细节没处理好,调整后可以更可靠:
- 获取已同步的Blob文件名:
- 添加
List blobs动作,指定Azure存储容器,用Select动作提取所有Blob的Name字段
- 添加
- 获取SharePoint当月文件夹的所有文件:用
Get files拿到当月文件夹的所有文件属性 - 过滤未同步的文件:
- 用
Filter array动作,把SharePoint文件列表作为输入,过滤条件设为:not(contains(body('Select_Blob_Names'), item()?['FileLeafRef'])) - 这样剩下的就是还没同步到Blob的新文件
- 用
- 同步并记录同步时间:可以在Azure存储里存一个
last_sync.txt文件,每次同步后写入当前时间,下次同步时用这个时间作为SharePoint文件的筛选起点,比对比所有Blobs更高效
方案3:用SharePoint变更追踪(最精准)
如果你的SharePoint文档库支持Change Tracking(大部分现代站点都支持),可以直接获取上次同步后的新增/修改文件:
- 启用变更追踪:在SharePoint文档库的设置里开启“变更追踪”功能
- 在Logic App里获取变更:
- 添加
Get changes for an item or file动作,设置Since Change Token为上次同步的令牌(可以存在Azure存储或Logic App变量里) - 这个动作会返回所有上次同步后新增、修改的文件,直接拿这些文件同步即可
- 添加
- 更新变更令牌:同步完成后,把返回的
Next Change Token保存下来,作为下次同步的起点
注意事项
- 时区一致性:确保Logic App的时间计算和SharePoint站点时区匹配,避免漏选或多选文件
- 文件名冲突:如果存在重名文件,建议在Blob路径里添加时间戳(比如
@{formatDateTime(utcNow(), 'yyyyMMddHHmmss')}_@{item()?['FileLeafRef']})避免覆盖 - 权限验证:确认Logic App使用的服务主体拥有SharePoint文档库的读取权限和Azure存储容器的写入权限
内容的提问来源于stack exchange,提问作者robin 040
相关产品推荐
相关产品推荐

