使用SharePoint Designer循环更新另一个列表中的字段时更新列表中的字段

时间:2016-09-07 04:03:58

标签: loops sharepoint-2013 sharepoint-designer sharepoint-workflow

我已经尝试了几次,但只能获得一条记录进行更新。希望有人可以说明我做错了什么,假设这是可能的。

我有一份员工列表(列表A),在该列表中我有一个字段可以在他们离开时进行标记。

第二个列表(列表B)是活动列表。我需要能够过滤此列表,以排除所有离开或不再有效的人。我在此列表中添加了等效的是/否字段。

我要做的是更新列表B中的非活动字段,用于列表A中该字段已更改的员工的每条记录。

My Lists before and after look like this

My Basic Workflow Loop looks like this

列表A =当前列表

列表B =请假

我可以打破上面的所有选择,如果这有助于某人帮助我。

由于

1 个答案:

答案 0 :(得分:1)

这可以通过REST API和工作流的组合来完成。作为Sharepoint的完全noobie,这花了我一段时间来弄明白,但希望这个一步一步的工作流程示例将帮助其他人。

首先,我主要使用这两个博客来提出我的解决方案:

Wonder Laura - Loop through multiple Sharepoint items

Kemanth Kumar - Loop Through SharePoint Custom List Items

最终工作流程

enter image description here

第1步:在Sharepoint中创建两个列表。在我的例子中,列表A是调用StaffList,它是所有工作人员的列表,列表B称为LeaveRequests。

查看日志:

您会注意到我已在整个脚本中写入日志历史记录。要查看这些日志,请转到列表A页面,单击要更改的工作人员,工作流程图标将在顶部的功能区中亮起。单击它,将列出已为该特定工作人员运行或正在运行的所有工作流程。

API结果

我们将对API进行调用,有时可能会因为看不到API返回而烦人。请参阅本文末尾,了解如何查看API结果,轻松查看电子邮件。

第2步:打开Sharepoint设计器,点击"工作流"在左侧面板和"列出工作流程"应该在顶部功能区中弹出。点击"列出工作流程"并选择您创建的列表A(StaffList)。这将是用户手动更新的列表,并将运行工作流程。在弹出的框中键入名称和描述,平台类型需要是Sharepoint 2013 Workflow。

enter image description here

enter image description here

您需要自动运行此工作流程,因此请保存工作流程,然后单击顶部功能区中的工作流程设置,并在“开始选项”下,选择要在项目更改时自动启动的工作流程。

enter image description here

第3步:使用网络服务器时间显示开始时间。

enter image description here

从功能区创建一个舞台,并将其命名为“开始时间”。

在“操作”功能区中,单击“设置工作流变量”。单击工作流变量并创建一个名为StartUrl的新字符串变量。在字符串构建器中将值设置为您的Sharepoint或网站地址。

enter image description here

从操作功能区中选择“构建词典”。点击“这个”,弹出一个方框。在那里创建两个项目,一个名为“Accept”,另一个名为“Content-Type”,两个类型字符串,一个值为application / json; odata = verbose。然后输出到名为requestHeaders的新字典变量。

enter image description here enter image description here

现在,您将从操作功能区调用HTTP Web服务。单击“this”并在“URL”框中输入第一个“变量”。请勿通过单击“添加”或“更改查找”来键入变量,因为它不起作用。将弹出一个框,从Date源选择Workflow Variables和Parameters,从Source from Source选择StartUrl。使用方法GET单击确定。将响应内容设置为名为responseContent的字典变量,将响应标头设置为名为responseHeaders的字典变量,将响应状态代码设置为字符串变量responseCode。然后单击右下拉箭头编辑调用属性,然后单击属性。将弹出一个框,将请求标头设置为变量requestHeaders。

enter image description here enter image description here

现在,您需要通过使用“从字典中获取项目”操作功能从调用中获取响应。项目路径应设置为Date /(0),字典应为responseHeaders(通常这将是responseContent,但服务器的日期位于Headers中)。输出到String变量名为StartDate。有关详细信息,请转到此有用的链接。请注意,这是在GMT时间内完成的。如果有人想要将其转换为更易读的日期格式,请告诉我。

现在您可以记录开始日期。从操作功能区中选择记录到历史记录,然后单击消息并键入Started:现在您必须输入变量。请勿通过单击“添加”或“更改查找”来键入变量,因为它不起作用。将弹出一个框,从日期源中选择“工作流变量和参数”,从“源”字段中选择“变量StartDate”。

enter image description here

步骤4:创建一个阶段,该阶段将获取需要从LeaveRequests列表(列表B)更新的记录列表。通过在“开始时间段”的“过渡到舞台”区域中插入“转到舞台”动作,将“开始时间”阶段指向此新阶段。

我已将用户用作两个列表之间的公共字段。目的是使用yes或no更新名为StaffListInactive的列。这些值实际上取自列表A中的字段。

让我们从获取正在更改的列表A中的工作人员的ID开始。设置一个名为StaffListID的Integer类型的工作流变量。使用当前列表的数据源查找值,在我的情况下,源的字段将是员工姓名,并返回字段作为用户ID(作为整数)。字段将是员工姓名,值将是当前项目的查找,员工姓名并作为用户ID号返回。

enter image description here

现在设置另一个工作流变量类型字符串,它将是一个名为RestUrl的REST API。这个URL中发生了很多魔法,包括获取列表GUID,从要返回的列表中选择字段,仅过滤我们需要的结果并增加返回的结果数。 Sharepoint的默认值为100条记录。

用于从列表中获取项目的此URL的格式如下所示:BASE sharepoint站点:

http://yoursharepointid.sharepoint.com/_api/web/lists/getbyid(guid“yourlistguid”)/项目

有关其他查询/过滤器的链接:

http://yoursharepointid.sharepoint.com/_api/web/lists/getbyid(guid'yourlistguid')/ Items?$ select = ColumnName,Column2Name& $ filter = ColumnName eq'content'& $ top = 9999

要获取GUID,请在Sharepoint designer 2013中单击左侧面板中的“列表和库”,选择列表B(LeaveRequests)。然后,您将看到列表ID。将其插入“和”之间的GUID区域。

如果您的列名称有空格,则需要插入 x0020 来代替空格。所以我看起来像这个Employee_x0020_Name。另外需要注意的一点是,为了获得Employee ID,您需要在Column Name的末尾包含Id:Employee_x0020_NameId。对于过滤,此列需要为Employee_x0020_Name / Id。

所以最后我的网址看起来像这样:

HTTP://****.sharepoint.com/_api/web/lists/getbyid(GUID '***********************' )/ Items?$ select = ID,StaffListInactive,Employee_x0020_NameId& $ filter = Employee_x0020_Name / Id eq'[%Variable:StaffListID%]'& $ top = 9999

请记住在插入变量时进行查找。

现在您需要构建一个与上面步骤3中相同的字典。您可以复制操作,然后重新分配新变量(尽管从此工作流程中不是必需的)。您需要更改的唯一变量是上面创建的对RestUrl的Web服务调用中的URL变量。如果您复制构建字典操作,则需要再次向其添加Accept和Content-Type项。

对于“从字典中获取项目”操作,您的路径将是d / results,您的字典现在将是responseContent并将其输出到名为List的字典变量。

enter image description here

第5步:现在我们计算从API中提取的结果数量,并通过循环运行它们,这将更新每条记录。

创建另一个Stage Cclled Update Inactive Status。

添加“从字典计数项目”操作并将字典设置为列表变量并输出一个名为ItemCount的新整数变量。

设置一个名为index的整数变量,其值为0。

enter image description here

从循环功能区插入带有条件的循环。更新值,使它们读取变量index小于变量ItemCount。

enter image description here

在循环中,您可以通过添加日志操作并将其称为循环编号:变量索引来记录正在运行的循环。

enter image description here

现在下一部分没有必要包含但我觉得最好检查一下,正在更新的用户实际上是您想要更新的用户。 IE,我们比较两个列表中用户的ID。

从字典操作添加获取项目,路径为d / results([%Variable:index%])/ Employee_x0020_NameId。记得对变量进行查找。字典将是responseContent,输出变量我们将调用EmployeeID类型integer。

现在我们从Condition功能区添加一个“If any value equalals value”,并将第一个值设置为以下值:Data Source is Current list,source from field is Employee Name,Field是employee name,value是lookup of数据源是Current Item,Source from source是Employee Name并返回User Id Number。

enter image description here

对于If语句中的第二个值,从列表中选择Workflow Lookup for User,然后单击Add,当弹出框时,数据源将是Workflow Variables,参数和来自source的字段将为Variable EmployeeID。

enter image description here

现在我们需要通过从List A(StaffList)获取值并在List B(LeaveRequests)中设置它来更新记录。

从操作功能区添加“更新列表项”并单击此列表,然后从“列表”下拉列表中选择“列表B(LeaveRequests)”。单击添加按钮并将“设置此字段”添加到要更改的列(我的是StaffListInactive),然后单击查找“To this value”。当弹出的日期源是当前列表时,来自源的字段为非活动(这是您要更新的字段是列表A),字段是非活动的,值是查找当前项目并且不活动。

enter image description here

完成后,您需要更新“更新列表项”窗口中的字段和值。将字段设置为ID,值是工作流变量和EmployeeID的查找。

enter image description here

记录记录已更新。

现在我们需要在索引变量中添加1并设置它。它位于if语句之外但仍在循环中。

添加“执行计算”操作并将其设置为变量索引加1.将此输出为数字变量IndexPlusOne。

现在将变量索引设置为变量IndexPlusOne。

第6步:记录完成的时间。

这与开始时间阶段相同。因此,复制开始时间阶段并将其粘贴到工作流程的底部,并记住确保所有阶段都已链接。根据需要更新详细信息。

enter image description here

总之,当您更新列表A的详细信息时,列表B现在将根据已更改的工作人员更新所选字段以匹配列表A中的选定字段。

API结果续...

对于很多人来说,这可能是旧的,但对于错误测试非常有用。

在您的任何Web服务调用之后添加“发送到电子邮件操作”。在“收件人”字段中选择您的电子邮件并为其指定主题。在电子邮件的正文中添加responseHeaders和responseContent变量。每次工作流程运行时,都会通过电子邮件发送给您。电子邮件比工作流日志中的记录更新速度快,因此我可以更快地进行故障排除。 enter image description here