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

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

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

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

 


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

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

1
2
3
4
5
6
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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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 августа.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#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 = "<view><query><where><gt><fieldref name="Modified"><value includetimevalue="TRUE" type="DateTime">2020-07-31T14:48:24Z</value></fieldref></gt></where></query></view>"
 
            $addItems = $List.GetItems($camlQuery)
                     
 
            $camlQuery = [Microsoft.SharePoint.Client.CamlQuery]::new(); 
            $camlQuery.ViewXml =  "<view><query><where><gt><fieldref name="Created"><value includetimevalue="TRUE" type="DateTime">2020-07-31T14:48:24Z</value></fieldref></gt></where></query></view>"
 
            $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.