Power Automate中使用HTTP操作重新审批SharePoint项为何间歇性失败?
问题
我有一个Power Automate流,触发条件是SharePoint库项被批准。流执行时会更新该项的部分属性,但这些操作会把项的「审批状态」重置为“未提交”。为解决这个问题,我尝试通过编程方式重新审批该项:
我添加了两个「向SharePoint发送HTTP请求」操作:
- 创建审批请求
- URI:
_api/SP.Approvals.CreateItemRequest - 请求体:
{ "creationInfo": { "listId": "<List Id>", "itemId": "<Item Id>", "approvers": "<Service account Id>", "title": "<带扩展名的文件名>", "details": "自动请求", "markDocAsFinal": true } }
- URI:
- 批准审批请求
- URI:
api/SP.Approvals.ApproveItemRequest - 请求体:
{ "listId": "<List Id>", "itemId": "<Item Id>", "approvalId": "@{body('Send_an_HTTP_request_to_SharePoint')?['d']['CreateItemRequest']}", "comments": "自动批准" }
- URI:
但重新审批操作间歇性生效,多数情况下流会失败,错误信息为:
Action 'Send_an_HTTP_request_to_SharePoint_-_Create_request' failed: Creating new approval request is not allowed if item is in Pending or Approved state.
即便在该步骤之前的「获取项属性」操作返回的项审批状态为“未提交”,仍会出现此问题。
补充:即使「获取项属性」显示审批状态为“未提交”,SharePoint有时仍会将该项视为处于“待处理”或“已批准”状态。
相关截图:
- 库:

- 重新审批项的流:

原因分析
核心问题是SharePoint列表项的审批状态字段与后台审批记录存在异步同步延迟:
- 更新项属性时,虽然「获取项属性」返回的
Approval Status字段被重置为“未提交”,但SharePoint后台可能仍保留着之前的审批请求记录(比如已完成的审批实例),或者状态同步存在延迟,导致后台判定该项仍处于审批相关状态。 SP.Approvals系列API会直接校验后台的审批记录状态,而非仅依赖列表项的Approval Status字段,所以即使前端字段显示“未提交”,API仍会因为后台存在未清理的审批状态而拒绝创建新请求。
修复方案
方案1:先清理旧审批记录(推荐)
在创建新审批请求前,先清理该项的所有审批记录,确保后台状态完全重置:
- 添加「向SharePoint发送HTTP请求」操作,调用接口获取该项的所有审批请求:
- URI:
_api/SP.Approvals.GetItemRequests(listId='<List Id>',itemId='<Item Id>') - 请求方法:GET
- URI:
- 遍历返回的审批请求,调用接口取消所有审批记录:
- URI:
_api/SP.Approvals.CancelItemRequest - 请求方法:POST
- 请求体:
{ "listId": "<List Id>", "itemId": "<Item Id>", "approvalId": "@{items('Apply_to_each')?['Id']}", "comments": "清理旧审批记录" }
- URI:
- 添加「延迟」操作(1-2秒),再执行原有的创建审批请求和批准操作。
方案2:避免更新操作触发审批状态重置
如果属性更新不需要触发审批流程,可尝试直接调用列表项更新API,避免修改审批相关字段:
- 使用
_api/web/lists/getbytitle('<List Title>')/items(<Item Id>)的PATCH请求更新属性,请求头添加IF-MATCH: *和X-HTTP-Method: MERGE,确保不修改_ModerationStatus、Approval Status等审批相关系统字段。 - 注意:部分系统字段即使不主动修改,更新操作也可能触发状态重置,需测试验证。
方案3:添加状态校验重试机制
在创建审批请求步骤添加重试逻辑,应对同步延迟:
- 编辑「创建审批请求」操作的设置,开启「重试」,设置重试次数(如3次)、重试间隔(如2秒)。
- 或使用「控制-直到」循环:在循环中调用
GetItemRequests接口,判断返回的请求列表是否为空,若为空则退出循环执行创建请求操作,否则延迟后重试。
内容的提问来源于stack exchange,提问作者Mamta Patil
相关产品推荐
相关产品推荐

