使用SharePoint Designer循环来更新列表中的字段,当另一个列表中的字段更新时
我已经尝试过几次,但只能获取一条记录来更新。希望有人能够澄清我做错了什么,假设这是可能的。使用SharePoint Designer循环来更新列表中的字段,当另一个列表中的字段更新时
我有一个员工列表(列表A),在该列表中我有一个字段,当他们离开时标志。
第二个列表(列表B)是一系列活动。我需要能够过滤此列表以排除所有已离开或不再活动的人员。我已经为此列表添加了一个等效的“是/否”字段。
我试图做的是更新列表B中的无效字段在表A的员工每个记录,该领域发生了变化。
My Lists before and after look like this
My Basic Workflow Loop looks like this
列表A =当前列表
列表B =请假条
我能打破所有日。上面的选择,如果这可以帮助别人来帮助我。
谢谢
这可以通过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。
查看日志:
你会发现,我已经写入日志历史整个脚本。要查看这些日志,请转到List A页面,单击您将要更改的工作人员,并在顶部功能区中点亮工作流程图标。点击它,所有已经运行或正在运行的工作流程都会列出。
API结果
我们将会把呼叫通过对API,有时看不到什么API返回,可恼人的。查看这篇文章的结尾,了解如何查看API结果,轻松查看电子邮件。
第2步:打开Sharepoint设计器,点击左侧面板中的“工作流程”,弹出顶部功能区中的“列表工作流程”。点击“List Workflow”并选择您创建的List A(StaffList)。这将是由用户手动更新的列表,并将运行该工作流程。在弹出的框中输入名称和说明,平台类型需要为Sharepoint 2013 Workflow。
你需要做这个工作流程自动运行,因此节省了工作流,然后点击工作流设置在顶部功能区,并在启动选项下,选择工作流程时自动启动项目已更改。
第3步:使用网络服务器的时间显示开始时间。
创建从色带并将其命名为开始时间的阶段。
从操作功能区单击设置工作流程变量。点击工作流变量并创建一个名为StartUrl的新字符串变量。在字符串构建器中将值设置为您的Sharepoint或网站地址。
从动作色带构建字典。点击“这个”,一个盒子将弹出。在那里创建两个项目,一个名为“接受”,另一个“Content-Type”,并且两个字符串都是application/json; odata = verbose。然后输出到一个名为requestHeaders的新字典变量。
现在你会打电话给从行动丝带一个HTTP Web服务。点击“this”并在URL框中输入第一个变量。不要输入变量,因为它不起作用通过单击添加或更改查找来执行查找。将弹出一个框,从日期源中选择工作流变量和参数,从源中的字段中选择变量StartUrl。使用方法GET单击确定。将响应内容设置为名为responseContent的字典变量,将响应标题映射到名为responseHeaders的字典变量,并将响应状态代码映射到字符串变量responseCode。然后点击右下拉箭头编辑通话属性,然后点击属性。将弹出一个框,将请求标头设置为变量requestHeaders。
现在你需要通过使用获得从字典从丝带行动项目获得来自呼叫的响应。项目路径应该设置为Date /(0),字典应该是responseHeaders(通常这将是responseContent,但服务器的日期位于Headers中)。输出到名为StartDate的字符串变量。有关这方面的更多详细信息,请转到这个有用的链接。请注意,这是通过格林威治标准时间。如果任何人有转换到这个更可读的日期格式的想法,让我知道。
现在您可以记录开始日期。从操作功能区中选择记录到历史记录,然后单击消息并键入开始:现在您必须输入变量。不要输入变量,因为它不起作用通过单击添加或更改查找来执行查找。将弹出一个框,从日期源中选择工作流变量和参数,从源中的字段中选择变量StartDate。
第4步:创建一个阶段,将让那些需要从LeaveRequests表(表二)更新的记录列表。在Start Time阶段的Transition阶段区域中插入“go to stage”动作,将Start Time阶段指向这个新阶段。
我已经将用户用作两个列表之间的公共字段。目标是更新一个名为StaffListInactive的列,可以是或不是。这些值实际上取自列表A中的字段。
让我们从获取正在更改的列表A中的职员ID开始。设置一个名为StaffListID的Integer类型的工作流程变量。使用当前列表的数据源进行查找,在我的案例中来自源的字段将作为用户名(作为整数)的员工姓名和返回字段。字段将是员工姓名,值将是查找当前项目,员工姓名并作为用户ID号码返回。
现在设置另一个工作流程的变量类型字符串这将是一个REST API调用RestUrl。在这个URL中发生了很多魔术,包括获取列表GUID,从列表中选择要返回的字段,仅筛选我们需要的结果并增加返回结果的数量。 Sharepoint的默认值是100条记录。
此URL从列表中获取项目的格式是你的基地SharePoint站点如下:
http://yoursharepointid.sharepoint.com/_api/web/lists/getbyid(guid“yourlistguid”)/项目
对于其他查询/过滤器的链接:
http://yoursharepointid.sharepoint.com/_api/web/lists/getbyid(guid 'yourlistguid')/项目?$选择=的ColumnName,Column2Name & $过滤=的ColumnName EQ '内容' & $顶部= 9999
要在Sharepoint设计器2013中获取GUID,请在左侧面板中单击“列表和库”,选择列表B(LeaveRequests)。您将看到列表ID。将其插入'和'之间的GUID区域。
如果您的列名有空格,您需要插入x0020来代替空格。所以我看起来像这个Employee_x0020_Name。另外需要注意的是,为了获得员工ID,您需要在列名称末尾包含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项目添加到它。
对于来自Dictionary action的get Item,您的路径将是d/results,您的字典现在将成为responseContent并将其输出到名为List的字典变量。
第5步:现在我们计算结果的数量从API提取,并通过循环将更新每条记录运行它们。
创建另一个阶段Cclled更新未激活状态。
添加“从字典中计数项”操作并将字典设置为List Variable并输出一个名为ItemCount的新整数变量。
设置与值0
从环带的整数变量被称为索引插入带有条件的循环。更新这些值以便它们读取变量索引小于变量ItemCount。
在环路循环是通过将Log动作,把它回路编号运行,您可以登录:变量索引。
现在,这下一部分是没有必要的,包括但我觉得这是好事,有这个检查,看看用户更新实际上是要更新的用户。 IE,我们比较两个列表中用户的ID。
添加从词典action中获取项目,路径为d/results([%Variable:index%])/ Employee_x0020_NameId。记住要对变量进行查找。字典将是responseContent和输出变量,我们将调用EmployeeID类型的整数。
现在我们从条件功能区添加一个“如果任何值等于值”,并将第一个值设置为以下值:数据源是当前列表,来自源的字段是员工姓名,字段是员工姓名,值是查找数据源是当前项目,来自源的字段是员工姓名并返回用户ID号码。
对于IF语句中选择工作流查找用户从列表中,然后单击添加并在对话框弹出时的数据来源将是工作流变量和参数和字段从源将是可变的第二个值员工ID。
现在,我们需要通过由A组(StaffList)所获得的价值,并在列表B(LeaveRequests)将其设置为更新记录。
从操作功能区中添加“更新列表项”并单击此列表并从列表下拉列表中选择列表B(LeaveRequests)。单击添加按钮并将“设置此字段”添加到要更改的列(我的是StaffListInactive),然后单击查找“To this value”。当弹出的日期源是当前列表时,来自源的字段是非活动的(这是您要更新的字段是列表A),字段处于非活动状态,值是对当前项目的查找且处于非活动状态。
一旦做到这一点,你将需要更新“更新列表项目”窗口中的字段和值。将字段设置为ID,该值是查找工作流变量和EmployeeID。
日志中记录已被更新。
现在我们需要给索引变量加1并设置它。这位于if语句之外,但仍在循环中。
添加“执行计算”操作并将其设置为变量索引加1.将此值输出到数字变量IndexPlusOne。
现在设置变量IndexPlusOne的变量索引。
第6步:记录完成时间。
这与开始时间阶段相同。因此,请复制开始时间阶段并将其粘贴到工作流程的底部,并记住确保所有阶段都已关联。按照您认为合适的方式更新细节。
在当你更新列表A细节的结论,列表B现在更新所选字段根据已经改变了工作人员的名单A所选字段相匹配。
API的结果续...
这可能是旧帽子了很多人,但排在非常有用的错误检测。
在您的任何Web服务调用之后添加“发送到电子邮件”操作。在to领域选择你的电子邮件并给它一个主题。在电子邮件的正文中添加responseHeaders和responseContent变量。每当您的工作流程运行时,您都会收到电子邮件。电子邮件的发送速度比工作流日志中记录的更新速度快,因此我的故障排除速度更快。
非常全面的答案。谢谢Wes。 – 14Data