Импорт данных из Excel (из списка) в библиотеку. Заполнение мета-данных. Заполнение полей таксономии.

Долго собирался с силами, чтобы все-таки оформить эту статью.
Речь пойдет об автоматическом создании в библиотеке элементов с мета-данными, и данными из таксономии. Элементы в библиотеке должны быть определенной структуры вложенности (папка (клиент) -> подпапка (продукт)… ну, где-то так).
Клиент и продукт — это элементы определенного типа контента, с родительским типом контента Folder.
Предположим, что пустая библиотека, куда следует заносить данные, у нас уже уже есть.
Для начала имеем Excel-ный файл где-то с 25’000 строками данных.
Данные из этого файла нужно перенести в список, воспользовавшись стандартным функционалом SharePoint’a. Для этого создаем сам список, создаем колонки в списке, затем приводим пустой список в табличное представление (как показано на рисунке ниже):

и по столбцам копируем наши данные из Excel-ного файла прямо в список.

Ну, так как элементов у нас 25’000, то даже простое копирование займет у нас много времени.
После того, как все элементы скопированы, можно список вернуть к прежнему виду:

Итак, копирование завершилось. Теперь настала очередь скрипта на PowerShell‘e для переноса данных из списка в библиотеку, с созданием в библиотеке определенной структуры вложенности элементов.







Я буду описывать скрипрт по частям, чтобы по ходу делать кое-какие пояснения.

Для начала — опишем глобальные, на уровне выполнения скрипта, переменные:

           $WebURL = "http://<название сайта>"; # сайт
           $ListDisplayName = "Клиенты"; # название destination библиотеки с клиентами
           $ListWhereFrom = "Список клиентов"; # список, откуда мы заносим данные новых клиентов и продуктов
           $endCount = 1000; # количество элементов, которые нужно отработать за один запуск скрипта.
           # количество считается с 0, поэтому нужно понимать, что итоговое кол-во записей будет ($endCount+1)

Далее подгружаем нужные библиотеки (WSSAssembly)

function LoadWSSAssembly
{
    write-host "Loading WSS Assembly..."  
    [System.Reflection.Assembly]::Load("Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c") 
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Taxonomy")
    write-host "Done..."  
}

Следом идет основная функция, выполняющая как раз перенос данных.

function ListDataItems
{
    $site = new-object Microsoft.SharePoint.SPSite ( $WebURL ) 
    $Web = $site.OpenWeb() 
    
    [Microsoft.SharePoint.SPList] $List = $Web.Lists[$ListDisplayName]; 
    [Microsoft.SharePoint.SPFolder] $FolderName = $List.RootFolder;
    
    "Web is : " + $Web.Title 

    # Enter name of the List below 
    $oList = $Web.Lists[$ListWhereFrom]; # Лист (список), откуда импортируем данные в библиотеку

    "List is :" + $oList.Title + " with item count " + $oList.ItemCount 

    $collListItems = $oList.Items; 
    $count = $collListItems.Count - 1 
    
    $k=0;
    for($intIndex = $count; $intIndex -gt -1; $intIndex--, $k++) 
    { 

Далее нам нужно из нашего списка, по циклу, считать данные со столбцов каждой записи. И вот тут-то и начинаются первые сложности.
Названия столбцов у нас на русском языке, и естественно, если мы будем русские буквы пытаться скормить SharePoint‘у, то он может послать нас куда подальше. Наименования в таком случае нужно описывать по «внутреннему» имени столбца — так, как их обозначила сама система при создании.
Самый простой способ определить правильно наименование столбца в системе — выполнить сортировку по этому столбцу в списке. После того, как сортировка выполнена, смотрим на адресную строку:

В адресной строке направляемся к концу строки, и видим, что системное название колонки для сортировки передается на страницу методом «GET«, и название колонки в системе присвоенно переменной SortField (от знака =, до следующего знака &). Для колонки ФИО клиента, системное имя будет: _x0424__x0418__x041e__x0020__x04.

Итак, считываем по циклу данные из списка:


        write-host $intIndex ":" $collListItems[$intIndex].Name ":" $collListItems[$intIndex]["_x0418__x041d__x041d_"]; # ИНН

        $nameClient = $collListItems[$intIndex].Name; # он-же "cnum", поэтому колонку "cnum" не используем.

        #$cnumClient = $collListItems[$intIndex]["CNUM"]; 

        $fioClient = $collListItems[$intIndex]["_x0424__x0418__x041e__x0020__x04"]; # ФИО клиента

        $innClient = $collListItems[$intIndex]["_x0418__x041d__x041d_"]; # ИНН

        $prodName = $collListItems[$intIndex]["_x0418__x043c__x044f__x0020__x04"]; # имя продукта (название)

        $prodType = $collListItems[$intIndex]["_x0422__x0438__x043f__x0020__x04"]; # название продукта (Тип)

        $CCY_Currency = $collListItems[$intIndex]["CCY_x0020__x0432__x0430__x043b__"]; # CCY валюта

        $num_dogovor = $collListItems[$intIndex]["_x041d__x043e__x043c__x0435__x04"]; # номер договора

        $date_dogovor = $collListItems[$intIndex]["_x0414__x0430__x0442__x0430__x00"]; # Дата договора

Далее проверяем, есть ли запись с таким клиентом в нашей библиотеке (Клиенты). Если такой клиент есть, то проверяем наличие у него продукта (подпапки определенного типа контента). Если продукт есть, то переходим к следующей позиции цикла, и проверяем на наличие следующего клиента. Если продукта нет, то создаем продукт, и заполняем поля мета-данными, и также поля с мета-данными из таксономии.
Если такого клиента нет, то в библиотеке Клиенты созадем новую запись (клиента), и в новом клиенте создаем подпапку (продукт) с определенными мета-данными (также и мета-данными из таксономии (Taxonomy)).

Напоминание: Как работать с колонками, наименование которых написано русскими буквами — описано ранее.

        # проверяем, есть ли такой клиент в списке клиентов
        $flagCreateClients = 0; # если =0, то такого клиента нет, сл-но создаем его.
        foreach ($ItemSub in $FolderName.SubFolders) {
            #write-host "Folder : " $FolderName.SubFolders[$i];
            #write-host "ItemSub.Name: " $ItemSub.Name "; nameClient: " $name2Client;
            if ($ItemSub.Name -eq $nameClient) {
                $flagCreateClients = 1; # клеинт с таким именем уже есть в системе
                # Проверяем продукты у этого клиента
                $prodExistFlag = 0;
                foreach ($itemProd in $ItemSub.SubFolders) {
                    #write-host "ПРОДУКТ " $prodName " Продукт клиента " $itemProd.Name;
                    if ($itemProd.Name -eq $prodName) {
                        $prodExistFlag = 1;
                        write-host "ПРОДУКТ " $prodName " УЖЕ ЕСТЬ В КЛИЕНТЕ " $ItemSub.Name;
                    }
                }
                if ($prodExistFlag -eq 0) {
                    # Продукта у клиента нет, поэтому создаем продукт
                    #==============================================
                    # создаем элемент с типом Folder и именем $prodName
                    $newDocumentSetItem = $List.Items.Add($ItemSub.ServerRelativeUrl,[Microsoft.SharePoint.SPFileSystemObjectType]::Folder,$prodName );
                    # Определяем у нового элемента тип контента
                    $newDocumentSetItem["ContentType"] = "Продукт"; 
                    $newDocumentSetItem["Cnum"] = $nameClient; # Данное поле у продукта скрытое
                    $newDocumentSetItem["_x0418__x041d__x041d_"] = $innClient; # ИНН - тоже скрытое поле

Вот и дошла очередь до заполнения полей мета-данных данными из таксономии (Taxonomy). Самое главное здесь — не перепутать наименование таксономии в скрипте, с таксономией, которая соответствует этому полю в библиотеке. Т.к., в случае путаницы, скрипт будет выдавать ошибку, и занесение данных из таксономии не произойдет. Это, наверное, одна из распространенных ошибок при работе с таким типом мета-данных (я сам очень долго на этом месте ломал голову).

Сначала заполняем таксономию для поля с валютой.

                    # таксономия 
                    $TaxSite = Get-SPSite $Site
                    $TaxSession = Get-SPTaxonomySession -Site $TaxSite
                    $TermStore = $TaxSession.TermStores["ECM Managed Metadata Service"] #Change to your service name
                    #write-host $TermStore.Id
                    #Get the Term Set ID
                    $TermStoreGroup = $TermStore.Groups["PlasticCards"] #Change to your Terms Store name
                    $TermSet = $TermStoreGroup.TermSets["CCY Валюта"] #Change to your term set name
                    #write-host $TermSet.Id
                    # Поле с валютой в библиотеке
                    $Term_CCY = $TermSet.Terms[$CCY_Currency];
                    # $CCY_Currency - переменная, определенная ранее, при чтении позиции из списка с данными
                    $fName = "CCY_x0020__x0412__x0430__x043b__x044e__x0442__x0430_"; # CCY Валюта - колонка с данными из таксономии.
                    #TaxonomyField.SetFieldValue(item, term)
                    $Taxfield1 = $newDocumentSetItem.Fields.GetFieldByInternalName($fName);
                    $Taxfield1.SetFieldValue($newDocumentSetItem,$Term_CCY);

Обратите внимание на функцию, которая присваивает полю данные из таксономии.
TaxonomyField.SetFieldValue(item, term)
TaxonomyField — не просто название поля, в котором находятся данные из таксономии, а ссылка на этот объект, которая определяется ранее: $Taxfield1 = $newDocumentSetItem.Fields.GetFieldByInternalName($fName);.
В переменной $CCY_Currency — значение валюты — взято из списка с данными.

Теперь заполняем таксономию для поля с названием продукта (т.к. продукты в нашей задаче классифицируются на несколько видов)


                    $TermSet = $TermStoreGroup.TermSets["Название Продукта"] #Change to your term set name
                    #write-host $TermSet.Id
                    #Get the Term ID
                    $Term_PT = $TermSet.Terms[$prodType]
                    #write-host $Term_PT.Id;
                    #write-host $Term_PT.Name;
                    # Название Продукта
                    $fName_PT = "_x041d__x0430__x0437__x0432__x0430__x043d__x0438__x0435__x0020__x041f__x0440__x043e__x0434__x0443__x043a__x0442__x0430_"; # Название Продукта
                    #TaxonomyField.SetFieldValue(item, term)
                    $Taxfield2 = $newDocumentSetItem.Fields.GetFieldByInternalName($fName_PT);
                    $Taxfield2.SetFieldValue($newDocumentSetItem,$Term_PT);

                    # end of Taxonomy 

Ну, и заканчиваем заполнение данными других полей продукта.


                    $newDocumentSetItem["_x041d__x043e__x043c__x0435__x0440__x0020__x0414__x043e__x0433__x043e__x0432__x043e__x0440__x0430_"] = $num_dogovor;
#номер договора
                    $newDocumentSetItem["_x0414__x0430__x0442__x0430__x0020__x0414__x043e__x0433__x043e__x0432__x043e__x0440__x0430_"] = $date_dogovor; 
# дата договора. Формат даты - мм/дд/гггг
                    $newDocumentSetItem.SystemUpdate();
                    # Продукт создан
                    write-host "Продукт создан";
                }
            }
        }

Продукт создан для клиента, который уже был в библиотеке. Но если условие наличия клиента в библиотеке опровергнуто, то клиента нужно создать, и в клиенте создать продукт. Дальше с заполнением мета-данными как обычных полей, так и полей с таксономией, поступаем по аналогичной схеме.

Итак, создаем клиента, заполняем поля данными, создаем в клиенте продукт, заполняем данными и данными из таксономии поля в продукте.


        if ($flagCreateClients -eq 0) {
            # такого клиента еще нет, сл-но создаем клиента и заносим продукт
            #write-host $FolderName.ServerRelativeUrl;
            $FolderN = $Web.URL+"/"+$FolderName.Url;
            #write-host "Создаем новую папку - клиента: ";
            $NewFolderItem = $List.Items.Add($FolderN,[Microsoft.SharePoint.SPFileSystemObjectType]::Folder,$nameClient);
            $NewFolderItem["ContentType"] = "Клиент";
            $NewFolderItem["_x041d__x0430__x0438__x043c__x0435__x043d__x043e__x0432__x0430__x043d__x0438__x0435__x0020__x043a__x043b__x0438__x0435__x043d__x0442__x0430_"] = $fioClient;  #ФИО клиента
            $NewFolderItem["_x0418__x041d__x041d_"] = $innClient;  #ИНН
            $NewFolderItem.SystemUpdate();
            write-host "Папка клиента " $nameClient " создана.";
            #Need to get a fresh reference of the folder to ensure we can see the new one just created:
            $FolderName = $FolderName.ParentWeb.GetFolder($FolderName);
            # Закончили с созданием нового клиента.
            
            #------------------------------------
            # создаем в клиенте продукт
            #====================================
            # Путь к папке с клиентом, в которой будет продукт
            $new_item_name = $Web.URL+"/"+$NewFolderItem.Url;
            # создаем элемент продукта с именем $prodName
            $newDocumentSetItem = $List.Items.Add($new_item_name,[Microsoft.SharePoint.SPFileSystemObjectType]::Folder,$prodName );
            $newDocumentSetItem["ContentType"] = "Продукт"; 
            $newDocumentSetItem["Cnum"] = $nameClient; # В продукте - скрытое поле
            $newDocumentSetItem["_x0418__x041d__x041d_"] = $innClient; #ИНН - в продукте - также скрытое поле.
    
            # таксономия ----------------------
            $TaxSite = Get-SPSite $Site
            $TaxSession = Get-SPTaxonomySession -Site $TaxSite
            $TermStore = $TaxSession.TermStores["ECM Managed Metadata Service"] #Change to your service name
            $TermStoreGroup = $TermStore.Groups["PlasticCards"] #Change to your Terms Store name
            $TermSet = $TermStoreGroup.TermSets["CCY Валюта"] #Change to your term set name
            #write-host $TermSet.Id
            #Get the Term ID
            $Term_CCY = $TermSet.Terms[$CCY_Currency] 
            #write-host $Term_CCY.Id;
            #write-host $Term_CCY.Name;
            # Поле с валютой в библиотеке
            $fName = "CCY_x0020__x0412__x0430__x043b__x044e__x0442__x0430_"; # CCY Валюта - название поля
            #TaxonomyField.SetFieldValue(item, term);
            $Taxfield1 = $newDocumentSetItem.Fields.GetFieldByInternalName($fName);
            $Taxfield1.SetFieldValue($newDocumentSetItem,$Term_CCY);

            # Внесение данных из таксономии в поле с типом продукта 
            # (как говорилось ранее, для нашей задачи предусмотрено несколько типов продукта
            $TermSet = $TermStoreGroup.TermSets["Название Продукта"] #Change to your term set name
            #write-host $TermSet.Id
            #Get the Term ID
            $Term_PT = $TermSet.Terms[$prodType]
            #write-host $Term_PT.Id;
            #write-host $Term_PT.Name;
            # Название Продукта
            $fName_PT = "_x041d__x0430__x0437__x0432__x0430__x043d__x0438__x0435__x0020__x041f__x0440__x043e__x0434__x0443__x043a__x0442__x0430_"; # Название Продукта
            #TaxonomyField.SetFieldValue(item, term)
            $Taxfield2 = $newDocumentSetItem.Fields.GetFieldByInternalName($fName_PT);
            $Taxfield2.SetFieldValue($newDocumentSetItem,$Term_PT);

            # end of Taxonomy -------------------
            
            $newDocumentSetItem["_x041d__x043e__x043c__x0435__x0440__x0020__x0414__x043e__x0433__x043e__x0432__x043e__x0440__x0430_"] = $num_dogovor;
#номер договора
            $newDocumentSetItem["_x0414__x0430__x0442__x0430__x0020__x0414__x043e__x0433__x043e__x0432__x043e__x0440__x0430_"] = $date_dogovor; 
# дата договора. Формат даты : мм/дд/гггг
            
            $newDocumentSetItem.SystemUpdate();
            # Продукт создан
            write-host "Продукт создан";
        }

Далее удаляем из списка, только что занесенную в библитоеку запись.


        # удаляем скопированную запись из листа.
        #"Deleting : " + $intIndex 
        write-host $k "(" $intIndex ") - Deleting : " $nameClient;
        $collListItems.Delete($intIndex);

Затем следует условие разрыва цикла, если количество элементов в списке очень большое, как в нашем случае — 25’000, и подобный перенос будет выполняться ну ОЧЕНЬ долго. Для этого мы вначале определяли переменную $endCount.
Сейчас мы проверяем, если количество обработанных элементов цикла больше, чем $endCount, то обрываем цикл до следующего ручного запуска.


        if ($k -ge $endCount) {
            write-host $k;
            break;
        }
        
    }

Далее делаем ListUpdate, и освобождаем память, что в общем-то, при нынешних мощностях не так уж и критично.


    $List.Update(); # общий list update

    #dispose – освообождаем память
    $Web.Dispose();
    $Site.Dispose();
}

На этом заканчивается функция по добавлению элементов в библиотеку из списка.

Ну, и дальше — функция, которая запускает всю работу нашего скрипта:


function go
{
    loadWSSAssembly;
    ListDataItems;
 }

go;

На этом все.

|
|
|
|
|
| Ниже привожу полный листинг данного скрипта:
|
|
|
|


$WebURL = "http://<название сайта>"; # сайт
$ListDisplayName = "Клиенты"; # название destination библиотеки с клиентами
$ListWhereFrom = "Список клиентов"; # список, откуда мы заносим данные новых клиентов и продуктов
$endCount = 1000; # количество элементов, которые нужно отработать за один запуск скрипта.
# количество считается с 0, поэтому нужно понимать, что итоговое кол-во записей будет ($endCount+1)

function LoadWSSAssembly
{
    write-host "Loading WSS Assembly..."
    [System.Reflection.Assembly]::Load("Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c")
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Taxonomy")
    write-host "Done..."
}

function ListDataItems
{
    $site = new-object Microsoft.SharePoint.SPSite ( $WebURL )
    $Web = $site.OpenWeb() 

    [Microsoft.SharePoint.SPList] $List = $Web.Lists[$ListDisplayName];
    [Microsoft.SharePoint.SPFolder] $FolderName = $List.RootFolder;

    "Web is : " + $Web.Title 

    # Enter name of the List below
    $oList = $Web.Lists[$ListWhereFrom]; # Лист (список), откуда импортируем данные в библиотеку

    "List is :" + $oList.Title + " with item count " + $oList.ItemCount 

    $collListItems = $oList.Items;
    $count = $collListItems.Count - 1 

    $k=0;
    for($intIndex = $count; $intIndex -gt -1; $intIndex--, $k++)
    {

        write-host $intIndex ":" $collListItems[$intIndex].Name ":" $collListItems[$intIndex]["_x0418__x041d__x041d_"]; # ИНН

        $nameClient = $collListItems[$intIndex].Name; # он-же "cnum", поэтому колонку "cnum" не используем.

        #$cnumClient = $collListItems[$intIndex]["CNUM"]; 

        $fioClient = $collListItems[$intIndex]["_x0424__x0418__x041e__x0020__x04"]; # ФИО клиента

        $innClient = $collListItems[$intIndex]["_x0418__x041d__x041d_"]; # ИНН

        $prodName = $collListItems[$intIndex]["_x0418__x043c__x044f__x0020__x04"]; # имя продукта (название)

        $prodType = $collListItems[$intIndex]["_x0422__x0438__x043f__x0020__x04"]; # название продукта (Тип)

        $CCY_Currency = $collListItems[$intIndex]["CCY_x0020__x0432__x0430__x043b__"]; # CCY валюта

        $num_dogovor = $collListItems[$intIndex]["_x041d__x043e__x043c__x0435__x04"]; # номер договора

        $date_dogovor = $collListItems[$intIndex]["_x0414__x0430__x0442__x0430__x00"]; # Дата договора
        # проверяем, есть ли такой клиент в списке клиентов
        $flagCreateClients = 0; # если =0, то такого клиента нет, сл-но создаем его.
        foreach ($ItemSub in $FolderName.SubFolders) {
            #write-host "Folder : " $FolderName.SubFolders[$i];
            #write-host "ItemSub.Name: " $ItemSub.Name "; nameClient: " $name2Client;
            if ($ItemSub.Name -eq $nameClient) {
                $flagCreateClients = 1; # клеинт с таким именем уже есть в системе
                # Проверяем продукты у этого клиента
                $prodExistFlag = 0;
                foreach ($itemProd in $ItemSub.SubFolders) {
                    #write-host "ПРОДУКТ " $prodName " Продукт клиента " $itemProd.Name;
                    if ($itemProd.Name -eq $prodName) {
                        $prodExistFlag = 1;
                        write-host "ПРОДУКТ " $prodName " УЖЕ ЕСТЬ В КЛИЕНТЕ " $ItemSub.Name;
                    }
                }
                if ($prodExistFlag -eq 0) {
                    # Продукта у клиента нет, поэтому создаем продукт
                    #==============================================
                    # создаем элемент с типом Folder и именем $prodName
                    $newDocumentSetItem = $List.Items.Add($ItemSub.ServerRelativeUrl,[Microsoft.SharePoint.SPFileSystemObjectType]::Folder,$prodName );
                    # Определяем у нового элемента тип контента
                    $newDocumentSetItem["ContentType"] = "Продукт";
                    $newDocumentSetItem["Cnum"] = $nameClient; # Данное поле у продукта скрытое
                    $newDocumentSetItem["_x0418__x041d__x041d_"] = $innClient; # ИНН - тоже скрытое поле
                    # таксономия
                    $TaxSite = Get-SPSite $Site
                    $TaxSession = Get-SPTaxonomySession -Site $TaxSite
                    $TermStore = $TaxSession.TermStores["ECM Managed Metadata Service"] #Change to your service name
                    #write-host $TermStore.Id
                    #Get the Term Set ID
                    $TermStoreGroup = $TermStore.Groups["PlasticCards"] #Change to your Terms Store name
                    $TermSet = $TermStoreGroup.TermSets["CCY Валюта"] #Change to your term set name
                    #write-host $TermSet.Id
                    # Поле с валютой в библиотеке
                    $Term_CCY = $TermSet.Terms[$CCY_Currency];
                    # $CCY_Currency - переменная, определенная ранее, при чтении позиции из списка с данными
                    $fName = "CCY_x0020__x0412__x0430__x043b__x044e__x0442__x0430_"; # CCY Валюта - колонка с данными из таксономии.
                    #TaxonomyField.SetFieldValue(item, term)
                    $Taxfield1 = $newDocumentSetItem.Fields.GetFieldByInternalName($fName);
                    $Taxfield1.SetFieldValue($newDocumentSetItem,$Term_CCY);

                    $TermSet = $TermStoreGroup.TermSets["Название Продукта"] #Change to your term set name
                    #write-host $TermSet.Id
                    #Get the Term ID
                    $Term_PT = $TermSet.Terms[$prodType]
                    #write-host $Term_PT.Id;
                    #write-host $Term_PT.Name;
                    # Название Продукта
                    $fName_PT = "_x041d__x0430__x0437__x0432__x0430__x043d__x0438__x0435__x0020__x041f__x0440__x043e__x0434__x0443__x043a__x0442__x0430_"; # Название Продукта
                    #TaxonomyField.SetFieldValue(item, term)
                    $Taxfield2 = $newDocumentSetItem.Fields.GetFieldByInternalName($fName_PT);
                    $Taxfield2.SetFieldValue($newDocumentSetItem,$Term_PT);

                    # end of Taxonomy

                    $newDocumentSetItem["_x041d__x043e__x043c__x0435__x0440__x0020__x0414__x043e__x0433__x043e__x0432__x043e__x0440__x0430_"] = $num_dogovor;
                    #номер договора
                                        $newDocumentSetItem["_x0414__x0430__x0442__x0430__x0020__x0414__x043e__x0433__x043e__x0432__x043e__x0440__x0430_"] = $date_dogovor;
                    # дата договора. Формат даты - мм/дд/гггг
                    $newDocumentSetItem.SystemUpdate();
                    # Продукт создан
                    write-host "Продукт создан";
                }
            }
        }

        if ($flagCreateClients -eq 0) {
            # такого клиента еще нет, сл-но создаем клиента и заносим продукт
            #write-host $FolderName.ServerRelativeUrl;
            $FolderN = $Web.URL+"/"+$FolderName.Url;
            #write-host "Создаем новую папку - клиента: ";
            $NewFolderItem = $List.Items.Add($FolderN,[Microsoft.SharePoint.SPFileSystemObjectType]::Folder,$nameClient);
            $NewFolderItem["ContentType"] = "Клиент";
            $NewFolderItem["_x041d__x0430__x0438__x043c__x0435__x043d__x043e__x0432__x0430__x043d__x0438__x0435__x0020__x043a__x043b__x0438__x0435__x043d__x0442__x0430_"] = $fioClient;  #ФИО клиента
            $NewFolderItem["_x0418__x041d__x041d_"] = $innClient;  #ИНН
            $NewFolderItem.SystemUpdate();
            write-host "Папка клиента " $nameClient " создана.";
            #Need to get a fresh reference of the folder to ensure we can see the new one just created:
            $FolderName = $FolderName.ParentWeb.GetFolder($FolderName);
            # Закончили с созданием нового клиента.

            #------------------------------------
            # создаем в клиенте продукт
            #====================================
            # Путь к папке с клиентом, в которой будет продукт
            $new_item_name = $Web.URL+"/"+$NewFolderItem.Url;
            # создаем элемент продукта с именем $prodName
            $newDocumentSetItem = $List.Items.Add($new_item_name,[Microsoft.SharePoint.SPFileSystemObjectType]::Folder,$prodName );
            $newDocumentSetItem["ContentType"] = "Продукт";
            $newDocumentSetItem["Cnum"] = $nameClient; # В продукте - скрытое поле
            $newDocumentSetItem["_x0418__x041d__x041d_"] = $innClient; #ИНН - в продукте - также скрытое поле.

            # таксономия ----------------------
            $TaxSite = Get-SPSite $Site
            $TaxSession = Get-SPTaxonomySession -Site $TaxSite
            $TermStore = $TaxSession.TermStores["ECM Managed Metadata Service"] #Change to your service name
            $TermStoreGroup = $TermStore.Groups["PlasticCards"] #Change to your Terms Store name
            $TermSet = $TermStoreGroup.TermSets["CCY Валюта"] #Change to your term set name
            #write-host $TermSet.Id
            #Get the Term ID
            $Term_CCY = $TermSet.Terms[$CCY_Currency]
            #write-host $Term_CCY.Id;
            #write-host $Term_CCY.Name;
            # Поле с валютой в библиотеке
            $fName = "CCY_x0020__x0412__x0430__x043b__x044e__x0442__x0430_"; # CCY Валюта - название поля
            #TaxonomyField.SetFieldValue(item, term);
            $Taxfield1 = $newDocumentSetItem.Fields.GetFieldByInternalName($fName);
            $Taxfield1.SetFieldValue($newDocumentSetItem,$Term_CCY);

            # Внесение данных из таксономии в поле с типом продукта
            # (как говорилось ранее, для нашей задачи предусмотрено несколько типов продукта
            $TermSet = $TermStoreGroup.TermSets["Название Продукта"] #Change to your term set name
            #write-host $TermSet.Id
            #Get the Term ID
            $Term_PT = $TermSet.Terms[$prodType]
            #write-host $Term_PT.Id;
            #write-host $Term_PT.Name;
            # Название Продукта
            $fName_PT = "_x041d__x0430__x0437__x0432__x0430__x043d__x0438__x0435__x0020__x041f__x0440__x043e__x0434__x0443__x043a__x0442__x0430_"; # Название Продукта
            #TaxonomyField.SetFieldValue(item, term)
            $Taxfield2 = $newDocumentSetItem.Fields.GetFieldByInternalName($fName_PT);
            $Taxfield2.SetFieldValue($newDocumentSetItem,$Term_PT);

            # end of Taxonomy -------------------

                        $newDocumentSetItem["_x041d__x043e__x043c__x0435__x0440__x0020__x0414__x043e__x0433__x043e__x0432__x043e__x0440__x0430_"] = $num_dogovor;
            #номер договора
                        $newDocumentSetItem["_x0414__x0430__x0442__x0430__x0020__x0414__x043e__x0433__x043e__x0432__x043e__x0440__x0430_"] = $date_dogovor;
            # дата договора. Формат даты : мм/дд/гггг

            $newDocumentSetItem.SystemUpdate();
            # Продукт создан
            write-host "Продукт создан";
        }

        # удаляем скопированную запись из листа.
        #"Deleting : " + $intIndex
        write-host $k "(" $intIndex ") - Deleting : " $nameClient;
        $collListItems.Delete($intIndex);

        if ($k -ge $endCount) {
            write-host $k;
            break;
        }

    }

    $List.Update(); # общий list update

    #dispose – освообождаем память
    $Web.Dispose();
    $Site.Dispose();
}

function go
{
    loadWSSAssembly;
    ListDataItems;
 }

go;

Comments are closed.