我已经尝试了几次,但只能获得一条记录进行更新。希望有人可以说明我做错了什么,假设这是可能的。
我有一份员工列表(列表A),在该列表中我有一个字段可以在他们离开时进行标记。
第二个列表(列表B)是活动列表。我需要能够过滤此列表,以排除所有离开或不再有效的人。我在此列表中添加了等效的是/否字段。
我要做的是更新列表B中的非活动字段,用于列表A中该字段已更改的员工的每条记录。
My Lists before and after look like this
My Basic Workflow Loop looks like this
列表A =当前列表
列表B =请假
我可以打破上面的所有选择,如果这有助于某人帮助我。
由于
答案 0 :(得分:1)
这可以通过REST API和工作流的组合来完成。作为Sharepoint的完全noobie,这花了我一段时间来弄明白,但希望这个一步一步的工作流程示例将帮助其他人。
首先,我主要使用这两个博客来提出我的解决方案:
Wonder Laura - Loop through multiple Sharepoint items
Kemanth Kumar - Loop Through SharePoint Custom List Items
最终工作流程
第1步:在Sharepoint中创建两个列表。在我的例子中,列表A是调用StaffList,它是所有工作人员的列表,列表B称为LeaveRequests。
查看日志:
您会注意到我已在整个脚本中写入日志历史记录。要查看这些日志,请转到列表A页面,单击要更改的工作人员,工作流程图标将在顶部的功能区中亮起。单击它,将列出已为该特定工作人员运行或正在运行的所有工作流程。
API结果
我们将对API进行调用,有时可能会因为看不到API返回而烦人。请参阅本文末尾,了解如何查看API结果,轻松查看电子邮件。
第2步:打开Sharepoint设计器,点击"工作流"在左侧面板和"列出工作流程"应该在顶部功能区中弹出。点击"列出工作流程"并选择您创建的列表A(StaffList)。这将是用户手动更新的列表,并将运行工作流程。在弹出的框中键入名称和描述,平台类型需要是Sharepoint 2013 Workflow。
您需要自动运行此工作流程,因此请保存工作流程,然后单击顶部功能区中的工作流程设置,并在“开始选项”下,选择要在项目更改时自动启动的工作流程。
第3步:使用网络服务器时间显示开始时间。
从功能区创建一个舞台,并将其命名为“开始时间”。
在“操作”功能区中,单击“设置工作流变量”。单击工作流变量并创建一个名为StartUrl的新字符串变量。在字符串构建器中将值设置为您的Sharepoint或网站地址。
从操作功能区中选择“构建词典”。点击“这个”,弹出一个方框。在那里创建两个项目,一个名为“Accept”,另一个名为“Content-Type”,两个类型字符串,一个值为application / json; odata = verbose。然后输出到名为requestHeaders的新字典变量。
现在,您将从操作功能区调用HTTP Web服务。单击“this”并在“URL”框中输入第一个“变量”。请勿通过单击“添加”或“更改查找”来键入变量,因为它不起作用。将弹出一个框,从Date源选择Workflow Variables和Parameters,从Source from Source选择StartUrl。使用方法GET单击确定。将响应内容设置为名为responseContent的字典变量,将响应标头设置为名为responseHeaders的字典变量,将响应状态代码设置为字符串变量responseCode。然后单击右下拉箭头编辑调用属性,然后单击属性。将弹出一个框,将请求标头设置为变量requestHeaders。
现在,您需要通过使用“从字典中获取项目”操作功能从调用中获取响应。项目路径应设置为Date /(0),字典应为responseHeaders(通常这将是responseContent,但服务器的日期位于Headers中)。输出到String变量名为StartDate。有关详细信息,请转到此有用的链接。请注意,这是在GMT时间内完成的。如果有人想要将其转换为更易读的日期格式,请告诉我。
现在您可以记录开始日期。从操作功能区中选择记录到历史记录,然后单击消息并键入Started:现在您必须输入变量。请勿通过单击“添加”或“更改查找”来键入变量,因为它不起作用。将弹出一个框,从日期源中选择“工作流变量和参数”,从“源”字段中选择“变量StartDate”。
步骤4:创建一个阶段,该阶段将获取需要从LeaveRequests列表(列表B)更新的记录列表。通过在“开始时间段”的“过渡到舞台”区域中插入“转到舞台”动作,将“开始时间”阶段指向此新阶段。
我已将用户用作两个列表之间的公共字段。目的是使用yes或no更新名为StaffListInactive的列。这些值实际上取自列表A中的字段。
让我们从获取正在更改的列表A中的工作人员的ID开始。设置一个名为StaffListID的Integer类型的工作流变量。使用当前列表的数据源查找值,在我的情况下,源的字段将是员工姓名,并返回字段作为用户ID(作为整数)。字段将是员工姓名,值将是当前项目的查找,员工姓名并作为用户ID号返回。
现在设置另一个工作流变量类型字符串,它将是一个名为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的字典变量。
第5步:现在我们计算从API中提取的结果数量,并通过循环运行它们,这将更新每条记录。
创建另一个Stage Cclled Update Inactive Status。
添加“从字典计数项目”操作并将字典设置为列表变量并输出一个名为ItemCount的新整数变量。
设置一个名为index的整数变量,其值为0。
从循环功能区插入带有条件的循环。更新值,使它们读取变量index小于变量ItemCount。
在循环中,您可以通过添加日志操作并将其称为循环编号:变量索引来记录正在运行的循环。
现在下一部分没有必要包含但我觉得最好检查一下,正在更新的用户实际上是您想要更新的用户。 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。
对于If语句中的第二个值,从列表中选择Workflow Lookup for User,然后单击Add,当弹出框时,数据源将是Workflow Variables,参数和来自source的字段将为Variable EmployeeID。
现在我们需要通过从List A(StaffList)获取值并在List B(LeaveRequests)中设置它来更新记录。
从操作功能区添加“更新列表项”并单击此列表,然后从“列表”下拉列表中选择“列表B(LeaveRequests)”。单击添加按钮并将“设置此字段”添加到要更改的列(我的是StaffListInactive),然后单击查找“To this value”。当弹出的日期源是当前列表时,来自源的字段为非活动(这是您要更新的字段是列表A),字段是非活动的,值是查找当前项目并且不活动。
完成后,您需要更新“更新列表项”窗口中的字段和值。将字段设置为ID,值是工作流变量和EmployeeID的查找。
记录记录已更新。
现在我们需要在索引变量中添加1并设置它。它位于if语句之外但仍在循环中。
添加“执行计算”操作并将其设置为变量索引加1.将此输出为数字变量IndexPlusOne。
现在将变量索引设置为变量IndexPlusOne。
第6步:记录完成的时间。
这与开始时间阶段相同。因此,复制开始时间阶段并将其粘贴到工作流程的底部,并记住确保所有阶段都已链接。根据需要更新详细信息。
总之,当您更新列表A的详细信息时,列表B现在将根据已更改的工作人员更新所选字段以匹配列表A中的选定字段。
API结果续...
对于很多人来说,这可能是旧的,但对于错误测试非常有用。
在您的任何Web服务调用之后添加“发送到电子邮件操作”。在“收件人”字段中选择您的电子邮件并为其指定主题。在电子邮件的正文中添加responseHeaders和responseContent变量。每次工作流程运行时,都会通过电子邮件发送给您。电子邮件比工作流日志中的记录更新速度快,因此我可以更快地进行故障排除。