Использование циклов SharePoint Designer для обновления поля в списке при обновлении поля в другом списке

У меня было несколько попыток сделать это, но я могу обновить только одну запись. Надеюсь, кто-то может пролить свет на то, что я делаю неправильно, если предположить, что это возможно.

У меня есть список сотрудников (список A), в этом списке у меня есть поле для отметки, когда они уходят.

Второй список (список B) представляет собой список действий. Мне нужно иметь возможность фильтровать этот список, чтобы исключить всех, кто ушел или больше не активен. Я добавил в этот список эквивалентное поле Да/Нет.

Что я пытаюсь сделать, так это обновить поле «Неактивное» в списке B для каждой записи для сотрудника в списке A, в котором это поле изменилось.

Мои списки до и после выглядят так

Основной цикл моего рабочего процесса выглядит следующим образом

Список A = Текущий список

Список B = оставить запросы

Я могу разбить все вышеперечисленные варианты, если это поможет кому-то помочь мне в этом.

Спасибо


person 14Data    schedule 07.09.2016    source источник


Ответы (1)


Это можно сделать с помощью комбинации REST API и рабочего процесса. Будучи полным новичком в Sharepoint, мне потребовалось некоторое время, чтобы понять это, но, надеюсь, этот пошаговый пример рабочего процесса поможет кому-то еще.

Во-первых, я в основном использовал эти два блога, чтобы найти свое решение:

Wonder Laura — просмотр нескольких элементов Sharepoint

Кемант Кумар — Циклический просмотр элементов пользовательского списка SharePoint


Окончательный рабочий процесс

введите здесь описание изображения


Шаг 1. Создайте два списка в Sharepoint. В моем случае список A называется StaffList, который представляет собой список всех сотрудников, а список B называется LeaveRequests.

Просмотр журналов:

Вы заметите, что я писал в историю журнала на протяжении всего скрипта. Чтобы увидеть, как эти журналы переходят на страницу «Список А», щелкните сотрудника, которого вы хотите изменить, и значок рабочего процесса загорится на ленте вверху. Нажмите на нее, и все ваши рабочие процессы, которые выполнялись или выполняются для этого конкретного сотрудника, будут перечислены.

Результаты API

Мы будем вызывать API и иногда можем раздражать, не видя, что возвращает API. См. конец этого поста, чтобы узнать, как легко просматривать результаты API для просмотра электронной почты.

Шаг 2. Откройте конструктор Sharepoint, нажмите «Рабочие процессы» на левой панели, и на верхней ленте должно появиться всплывающее окно «Список рабочих процессов». Нажмите «List Workflow» и выберите список A (StaffList), который вы создали. Это будет список, который будет вручную обновляться пользователем и запускать рабочий процесс. Введите имя и описание в появившемся окне. Тип платформы должен быть рабочим процессом Sharepoint 2013.

введите здесь описание изображения

введите здесь описание изображения

Вам нужно будет запустить этот рабочий процесс автоматически, поэтому сохраните рабочий процесс, затем нажмите «Настройки рабочего процесса» на верхней ленте и в разделе «Параметры запуска» выберите рабочий процесс для автоматического запуска при изменении элемента.

введите здесь описание изображения

Шаг 3. Отображение времени начала с использованием времени веб-сервера.

введите здесь описание изображения

Создайте этап на ленте и назовите его Время начала.

На ленте действий щелкните Задать переменную рабочего процесса. Нажмите на переменную рабочего процесса и создайте новую строковую переменную с именем StartUrl. Установите значение на свой адрес Sharepoint или веб-сайта в построителе строк.

введите здесь описание изображения

Выберите Build Dictionary на ленте действий. Нажмите «это», и появится всплывающее окно. Создайте там два элемента, один с именем «Accept», а другой «Content-Type», и оба типа String будут иметь значение application/json;odata=verbose. Затем выведите в новую переменную словаря с именем requestHeaders.

введите здесь описание изображения введите здесь описание изображения

Теперь вы будете вызывать веб-службу HTTP с ленты действий. Нажмите «это» и введите первую переменную в поле URL. НЕ вводите переменную, так как она не будет работать при поиске, нажав «Добавить» или «Изменить поиск». Появится окно, выберите «Переменные и параметры рабочего процесса» из источника «Дата» и переменную StartUrl из «Поле из источника». Используйте метод GET, нажмите Ok. Установите содержимое ответа в переменную словаря с именем responseContent, заголовки ответа в переменную словаря с именем responseHeaders и код состояния ответа в строковую переменную responseCode. Затем отредактируйте свойства вызова, щелкнув стрелку раскрывающегося списка вправо и выбрав свойства. Появится окно, установите заголовки запроса в переменную requestHeaders.

введите здесь описание изображения введите здесь описание изображения

Теперь вам нужно будет получить ответ от вызова, используя «Получить элемент из словаря» на ленте действий. Путь к элементу должен быть установлен на Date/(0), а словарь должен быть responseHeaders (обычно это будет responseContent, но дата сервера находится в заголовках). Вывод в переменную String с именем StartDate. Подробнее об этом можно узнать по этой полезной ссылке. Обратите внимание, что это происходит по времени по Гринвичу. Если у кого-то есть идеи по преобразованию этого в более читаемый формат даты, дайте мне знать.

Теперь вы можете зарегистрировать дату начала. Выберите «Журнал в историю» на ленте действий, щелкните сообщение и введите «Начало»: теперь вам нужно будет ввести переменную. НЕ вводите переменную, так как она не будет работать при поиске, нажав «Добавить» или «Изменить поиск». Появится окно, выберите «Переменные и параметры рабочего процесса» из источника «Дата» и переменную «Дата начала» из «Поле из источника».

введите здесь описание изображения

Шаг 4. Создайте этап, который получит список записей, которые необходимо обновить, из списка LeaveRequests (список B). Укажите этап «Время начала» на этот новый этап, вставив действие «перейти к этапу» в области «Переход к этапу» на этапе «Время начала».

Я использовал пользователя как общее поле между обоими списками. Цель состоит в том, чтобы обновить столбец StaffListInactive либо да, либо нет. Эти значения на самом деле берутся из поля в списке A.

Давайте начнем с получения идентификатора сотрудника в списке А, который изменяется. Задайте переменную рабочего процесса типа Integer с именем StaffListID. Выполните поиск значения с источником данных текущего списка, поле из источника в моем случае будет именем сотрудника и полем возврата как идентификатор пользователя (как целое число). Поле будет именем сотрудника, значением будет поиск текущего элемента, имя сотрудника и возвращенный как идентификатор пользователя.

введите здесь описание изображения

Теперь установите другую строку типа переменной рабочего процесса, которая будет представлять собой REST API с именем RestUrl. В этом 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 2013 нажмите «Списки и библиотеки» на левой панели, выберите «Список B (LeaveRequests)». Затем вы увидите идентификатор списка. Вставьте это в область GUID между «и».

Если в имени вашего столбца есть пробел, вам нужно будет вставить x0020 вместо пробела. Итак, мой выглядит так: Employee_x0020_Name. Также следует отметить, что для получения идентификатора сотрудника вам необходимо указать идентификатор в конце имени столбца: Employee_x0020_NameId. Для фильтрации этот столбец должен быть Employee_x0020_Name/Id.

Итак, наконец, мой URL-адрес выглядит так:

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 выше. Вы можете скопировать действия, а затем переназначить новые переменные (хотя в этом рабочем процессе это не обязательно). Единственная переменная, которую вам нужно будет изменить, — это переменная URL в вызове веб-службы RestUrl, которая была создана выше. Если вы скопируете действие словаря сборки, вам нужно будет снова добавить в него элементы Accept и Content-Type.

Для действия «получить элемент из словаря» ваш путь для этого будет d/results, а ваш словарь теперь будет responseContent и выводить его в переменную словаря с именем List.

введите здесь описание изображения

Шаг 5. Теперь мы подсчитываем количество результатов, полученных из API, и пропускаем их через цикл, который обновляет каждую запись.

Создайте еще один этап Cclled Update Inactive Status.

Добавьте действие «Подсчет элементов из словаря» и установите для словаря значение «Переменная списка» и выведите новую целочисленную переменную с именем ItemCount.

Установите целочисленную переменную с именем index со значением 0.

введите здесь описание изображения

Из ленты петли вставьте петлю с условием. Обновите значения, чтобы они считывали индекс переменной меньше, чем переменная ItemCount.

введите здесь описание изображения

В цикле вы можете указать, какой цикл выполняется, добавив действие «Журнал» и назвав его «Номер цикла: индекс переменной».

введите здесь описание изображения

Теперь нет необходимости включать эту следующую часть, но я чувствую, что хорошо иметь эту проверку, чтобы увидеть, что обновляемый пользователь на самом деле является пользователем, которого вы хотите обновить. IE, мы сравниваем идентификаторы пользователей в обоих списках.

Добавьте действие «Получить элемент из словаря» с путем d/results([%Variable:index%])/Employee_x0020_NameId. Не забудьте выполнить поиск по переменной. Словарь будет responseContent, а выходную переменную мы назовем целым числом типа EmployeeID.

Теперь мы добавляем «Если какое-либо значение равно значению» на ленте «Условие» и устанавливаем первое значение следующим образом: «Источник данных» — «Текущий список», поле из источника — «Имя сотрудника», «Поле» — это имя сотрудника, а значение — поиск источника данных. Текущий элемент, поле из источника — это имя сотрудника и возвращаемый идентификатор пользователя.

введите здесь описание изображения

Для второго значения в операторе If выберите «Поиск рабочего процесса для пользователя» из списка, затем нажмите «Добавить», и когда появится всплывающее окно, источником данных будут «Переменные и параметры рабочего процесса», а полем из источника будет «Переменная EmployeeID».

введите здесь описание изображения

Теперь нам нужно обновить запись, получив значение из списка A (StaffList) и установив его в списке B (LeaveRequests).

Добавьте «Обновить элемент списка» на ленте действий, щелкните этот список и выберите «Список B (LeaveRequests)» в раскрывающемся списке «Список». Нажмите кнопку «Добавить» и «Установите это поле» для столбца, который вы хотите изменить (у меня это StaffListInactive), и нажмите на поиск «Для этого значения». Когда появляется всплывающее окно, источником даты является текущий список, поле из источника — неактивно (это поле, которое вы обновляете, — это список A), поле — неактивно, а значение — поиск текущего элемента и неактивно.

введите здесь описание изображения

После этого вам нужно будет обновить поле и значения в окне «Обновить элемент списка». Установите для поля значение ID, а значение представляет собой поиск переменной рабочего процесса и EmployeeID.

введите здесь описание изображения

Журнал, что запись была обновлена.

Теперь нам нужно добавить 1 к переменной index и установить ее. Это находится вне оператора if, но все еще внутри цикла.

Добавьте действие «Выполнить расчет» и установите для него значение «Индекс переменной плюс 1». Выведите это в числовую переменную IndexPlusOne.

Теперь установите Variable index в переменную IndexPlusOne.

Шаг 6. Запишите время завершения.

Это идентично этапу времени начала. Поэтому скопируйте этап времени начала и вставьте его внизу рабочего процесса и не забудьте убедиться, что все ваши этапы связаны. Обновите детали по своему усмотрению.

введите здесь описание изображения

В заключение, когда вы обновляете данные в списке A, список B теперь будет обновлять выбранное поле, чтобы оно соответствовало выбранному полю в списке A, в зависимости от сотрудника, который был изменен.

Продолжение результатов API…

Это может быть старой шляпой для многих людей, но оказалось очень полезным для тестирования ошибок.

После любого вызова веб-службы добавьте действие «Отправить по электронной почте». Выберите свой адрес электронной почты в поле «Кому» и укажите тему. В теле письма добавьте переменные responseHeaders и responseContent. Каждый раз, когда ваш рабочий процесс запускается, вы будете получать электронное письмо. Электронная почта приходит быстрее, чем обновляются записи в журнале рабочего процесса, поэтому я быстрее устраняю неполадки. введите здесь описание изображения

person Wes    schedule 07.09.2016
comment
Отличный исчерпывающий ответ. Спасибо, Уэс. - person 14Data; 07.09.2016