пятница, 13 августа 2021 г.

Проверить наличие файла и требуемого расширения в элементе при сохранении.

В этой статье я расскажу, как можно проверить наличие вложений в элементе и расширение файла.

К примеру, у нас есть два вложения, и мы можем к ним обратиться с помощью jQuery

 


var attachments = jQuery("#idAttachmentsTable tbody" ).children();



Так же мы можем прочитать расширение файлов

			for(var i =0; i< attachments.length;i++){
                var fileName = jQuery("#attachRow" + i +" .ms-vb span").text();
                var extension =    fileName.match(/\.[0-9a-z]+$/i)[0];
                console.log(extension);

            }


Собираем все единое решение и добавляем в функцию PreSaveAction

 

function PreSaveAction()   
{ 
    var attachments = jQuery("#idAttachmentsTable tbody" ).children();
    if(attachments || attachments.length > 0){ 
        var excelFileExist = false;
        for(var i =0; i< attachments.length; i++){
            var fileName = jQuery("#attachRow" + i +" .ms-vb span").text();
            var extension =    fileName.match(/\.[0-9a-z]+$/i)[0];
            console.log(extension);
            if(extension == ".xls" || extension == ".xlsx"){
               excelFileExist = true;
            }
        }
        

        if(!excelFileExist){
            alert("вложите файл Excel");
            return false;
        }else{
            return true;
        }
    }else{
        alert("нужно вложить файлы");
        return false;
    }
}




этот код можно добавить в веб-часть редактор скриптов или редактор контента

четверг, 17 декабря 2020 г.

Кнопка на Ribbon (userCustomActions только с помощью JS)

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

Как основное решение для формы печати было React приложение, размещенное на страницу, а в представлении добавил кастомную кнопку на риббон которая отрывала новый таб с требуемой страницей и передавала ID выделенных элементов как параметр.


пятница, 6 ноября 2020 г.

Очистить значение поля выбор (Power Automate)

В рабочих процессах созданных через дизайнер можно было легко очистить поле типа выбор, но вот в Power Automate с этим возникают сложности.
Если выбрать свое значение и оставить его пустым или заполнить null, то прежнее значение остается без изменения.
Для очистки значения можно воспользоваться следующим способом, передать пустую строку как значение поля.











вторник, 6 октября 2020 г.

Получение всех рабочих процессов WorkFlow 2010 в tenant

 Я упустил новость о том, что WorkFlow 2010 будут отключены и только недавно увидел сообщение

Starting 11/1/2020 6:00:00 AM, SharePoint 2010 workflows will be retired and users will no longer have the ability to run or create 2010 Workflows. 


SharePoint Modernization Scanner  у меня так и не завелся.
возникала аналогичная ошибка https://github.com/pnp/sp-dev-modernization/issues/524 

тогда решил сам найти все активные WorkFlow. Так же выводится информация количестве всех элементов списка, так же созданных и измененых с 1 августа.


#Load SharePoint CSOM Assemblies
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"
Add-Type -Path "C:\Program Files\Common Files\microsoft shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.WorkflowServices.dll"


$UserName = "adm@company.com"
$Cred= Get-Credential $UserName


$SiteUrl = "https://contoso.sharepoint.com" #tenant

$array = @()  

function GetSubWebs($sWeb){    
            
    $Ctx.Load($sWeb)

    $WorkflowServicesManager = New-Object Microsoft.SharePoint.Client.WorkflowServices.WorkflowServicesManager($Ctx, $sWeb)
    $WorkflowSubscriptionService = $workflowServicesManager.GetWorkflowSubscriptionService()

    $allLists = $sWeb.Lists
    $Ctx.Load($allLists)
    $Ctx.ExecuteQuery()

    $webUrl = $sWeb.Url

    foreach($list in $allLists){
        $list.Title               
       
        $listTitle = $list.Title

        $List = $sWeb.Lists.GetByTitle($listTitle)
        $Ctx.Load($List)
        $WFassociation =  $List.WorkflowAssociations

        $Ctx.Load($WFassociation)
        $Ctx.ExecuteQuery() 

        $wfCount = 0
        foreach($wf in $WFassociation){
            if($wf.Enabled -eq $true){
                $wfCount++

            }
        }


        if($wfCount -gt 0){
            $wfCount

            $allItemCount = $List.ItemCount
            $camlQuery = [Microsoft.SharePoint.Client.CamlQuery]::new();  
            $camlQuery.ViewXml = "2020-07-31T14:48:24Z"

            $addItems = $List.GetItems($camlQuery)
                    

            $camlQuery = [Microsoft.SharePoint.Client.CamlQuery]::new();  
            $camlQuery.ViewXml =  "2020-07-31T14:48:24Z"

            $modyItems = $List.GetItems($camlQuery)                    

                   
            $Ctx.Load($addItems )
            $Ctx.Load($modyItems )


            $Ctx.ExecuteQuery()
                 
            $modyItemsCount = $modyItems.Count
            $addItemsCount = $addItems.Count

            $object = New-Object PSObject

            $object | Add-Member -Name 'Title' -MemberType Noteproperty -Value $listTitle
            $object | Add-Member -Name 'All Items' -MemberType Noteproperty -Value $allItemCount
            $object | Add-Member -Name 'Add Items' -MemberType Noteproperty -Value $addItemsCount 
            $object | Add-Member -Name 'Modified Items' -MemberType NoteProperty -Value  $modyItemsCount
            $object | Add-Member -Name 'WF Count' -MemberType NoteProperty -Value  $wfCount
            $object | Add-Member -Name 'URL' -MemberType NoteProperty -Value $webUrl

                     
            $Global:array += $object
        }
    }

    $webs= $sWeb.Webs
    $Ctx.Load($webs)
    $Ctx.ExecuteQuery()
    if($webs.Count -gt 0)
    {
        Write-Host $aWeb.Url  " - " $aWeb.Webs.Count
         
        foreach($aWeb in $webs)
        {
        
            $Ctx.Load($aWeb)
           
            GetSubWebs $aWeb 
        }
    }

    
}

$Ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SiteURL)
$Ctx.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Cred.Username, $Cred.Password)
     

    
$Web = $Ctx.Web
$Ctx.Load($Web)
$webs= $Web.Webs
GetSubWebs($Web)

$array | Format-Table

$array | Export-Csv -NoTypeInformation -Path  C:\Temp\lists.csv  -encoding "utf8" -Delimiter ";"
На выходе таблица и можно экспортировать в csv


вторник, 11 августа 2020 г.

Shared folder для внешних сотрудников с помощью WorkFlow (SharePoin Online)

 

Не так давно появилась задача бизнеса шарить файлы с партнерами и что бы всем партнерам приходили оповещения о изменении файла.

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

Если достум через Share link не сложный как для бизнеса так и для внешнего сотрудника, то оповещение внешних пользователей о том, что изменился файл в расшариной папке задача оказалась не совсем простая.

понедельник, 20 апреля 2020 г.

Решение проблем с Multiple lines of text с параметрами Plain text и Append Changes to Existing Text

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

как результат - на форме редактирования история не читается.

понедельник, 23 марта 2020 г.

Вывести ID элемента на форму редактирования/просмотра


Появилась задача вывести ID элемента на форму и эту задачу можно решить несколькими способами.
1. Добавить вычисляемое поле, которое будет брать данные из поля ID.
Минус – на форме редактирования не отображается.
2. Создать поле и писать в него или с помощью РП или JS.
Можно сделать другим способом. Прибегнув к jQuery и написав немного кода.



ссылка на код

вторник, 18 февраля 2020 г.

Создание сайта PWA в новой базе. (PowerShell)

В данной статье я поделюсь скриптом который:
1. Создает управляемый путь
2. Создает базу данных
3. Создает новый сайт PWA
4. Переводит в режим разрешений Project Server.