Tuesday, 16 August 2016

SharePoint Online / Office 365 – opening and printing all the links to the InfoPath forms together from the result of Search Result web part.

Hi All,


In this article I will explain how to open all links to forms in  browser tabs and printing them together.

Background:
We have our search result web part and configured to show only the different different list items based on the query. For every list we have InfoPath form associated. Around 20-25 items are the result of search result web part. We have updated our display template to open every link in new tab in the same browser window.

Also customer want to take the print out of all these forms. So to take the printout they need to click each and every link from the search result. Then go to every tab and print the form.

So this is little bit tedious process. If there are 25 links shown in search result then they need to click 25 times for opening each link in new tab and then 25 more clicks to give the print command by going each and every form. This approach customer is not liking and they were asking to minimize the clicks required to print all the forms.

Customer Requirement:
Customer want to minimize the efforts required to print all the links (forms) shown in search result web part.

Our Approach/Solution:
I saw such kind of requirement first time, googled lot and lots of time put to thought how we can achieve this. So we broke this requirement in two sub requirements
1. Printing all the tabs together
2. Opening all the links in tabs

Printing all the tabs together:
After lot of googling I found one Add-on to FireFox browser which Prints all the tabs together.
Add-on name – Universal Print - https://addons.mozilla.org/en-US/firefox/addon/universal-print/ 

This is very good Add-on which provide features like 
1. Print current tab
2. Print All tabs
     3.Print selected tabs

These features are very useful and our half work is done. We have added this Add-on in FireFox browser. So after opening all the tabs we need to write click on any tabs and following options come as shown in following figure:
Fig1: Universal Print option

Only limitation to this approach is our customer need to use only FireFox browser. But since at customer side only 4-5 users who are taking print outs so its no problem to customer to use FireFox browser.

But this is the only half done. Customer still need to open 20-25 clicks to open all the links in tabs and then one more click for printing.

Opening all the links together/at a time in tabs:
But opening all the links on one click is not big job since we could have JavaScript which will open all the links in tabs. Following is the approach we used
1. Added content editor web part on Search result page
2. Write the JavaScript to open all the links from our search result web part in browser tabs

JavaScript snippet:
<script type="text/JavaScript"
function openlinks()
{
    
    var links = document.links;
    for(var i =0; i<links.length; i++) {
 //This condition is for opening only our links from the search result web part
        if(links[i].toString().indexOf('Source')>=0){
            window.open(links[i]);
        }
    }//for
}//function
</script><input type="button" onclick="openlinks();" value="OpenAllLinks"/>


Finally we manage to print all the links in two clicks :). 
 
Thanks!
 
Enjoy Reading!
 
As usual feel free for any query / suggestion / feedback.








Saturday, 13 August 2016

PowerShell script for getting the items count which are added in last 30 days in all lists across the Office 365 / SharePoint online SiteCollection.

Hi All,


Today in this article I am going to share PowerShell script. Which will loop through all the webs (sub sites) from the SharePoint Online site collection and each and every list from the web and get the items count of items which are added in last 30 days. And writing the details to .CSV file.

PowerShell Script:

Following is the PowerShell script. We have written the function Loop-AllWebs  to loop through all the sub webs till there is no sub web for any web so we are calling it recursively. Also Get-AllListsDetails for getting list items count and writing the details to .CSV file. We are writing the result in .CSV file.

<#
.SYNOPSIS
Can be used to loop through all lists available across the site collection, from all sites and their item counts which are added in last 30 days within SharePoint Online tenant. We are writting list title, relative url of list and last 30 days item count in .csv file
.EXAMPLE
PS C:\> .\Get-Last30DaysItemCountFromAllListInSiteCollection.ps1 -SiteCollectionUrl https://MySiteCollection.sharepoint.com
.EXAMPLE
PS C:\> $creds = Get-Credential
PS C:\> .\Get-Last30DaysItemCountFromAllListInSiteCollection.ps1 -SiteCollectionUrl https://contoso-admin.sharepoint.com -Credentials $creds
#> 

[CmdletBinding()]
param
(
    [Parameter(Mandatory = $true, HelpMessage="Enter the URL of the target site     collection , e.g. 'https://contoso.sharepoint.com'")]
    [String]
    $SiteCollectionUrl,
    [Parameter(Mandatory = $false, HelpMessage="Optional administration credentials to site collection.")]
    [PSCredential]
    $Credentials
)

#Looping through all the webs and all their sub webs. Calling this function recursively. 
 function Loop-AllWebs{
  Param(
        [Microsoft.SharePoint.Client.ClientContext]$Context,
        [Microsoft.SharePoint.Client.Web]$RootWeb
        )
       
        #Getting all webs
        $Webs = $RootWeb.Webs
        
        $Context.Load($Webs)
        $Context.ExecuteQuery()
        ForEach ($sWeb in $Webs)
        {
            Get-AllListsDetails -Context $Context -web $sWeb
            #Looping through all sub webs
            Loop-AllWebs -RootWeb $sWeb -Context $Context
        }
    } 


function Get-AllListsDetails{
     Param(
            [Microsoft.SharePoint.Client.ClientContext]$Context,
            [Microsoft.SharePoint.Client.Web]$web
            )
 
            $lists=$web.Lists
            $Context.Load($lists)
            $Context.ExecuteQuery()
            foreach($list in $lists)
             {
                #Getting view for getting the list URL
                $view = $list.DefaultView
 
                $spQuery = New-Object Microsoft.SharePoint.Client.CamlQuery
                #CAML Query Using a DateTime Value and and Offset of Today
                $query = '<View><Query><Where><Geq><FieldRef Name="Created" /><Value Type="DateTime"><Today OffsetDays="-30" /></Value></Geq></Where></Query></View>'
                $spQuery.ViewXml = $query
                $spListItemCol = $list.GetItems($spQuery)
 
                $Context.Load($list)
                $Context.Load($view)
                $Context.Load($spListItemCol)
                $Context.ExecuteQuery()
       
                $line = $list.Title + "," + $view.ServerRelativeUrl + "," + $spListItemCol.Count
                #Writting to CSV file
                Add-Content Result.csv $line #Give the full path where you want to store the result. Currently it will be generated at the location of this script
   } 
 }


 # Get reference to SPO 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"

 
Write-Host -ForegroundColor White "---------------------------------------------------------------------------"
Write-Host -ForegroundColor White "Get All Lists across Site Collection and last 30 days Items counts from each and every lists "
Write-Host -ForegroundColor White "---------------------------------------------------------------------------"
 
Write-Host -ForegroundColor Yellow "Site Collection URL: $SiteCollectionUrl"
Write-Host ""
Write-Host "" 

# Get credentials, if they were not provided
if($Credentials -eq $null)
{
$Credentials = Get-Credential -Message "Enter Admin Credentials"
 
[Microsoft.SharePoint.Client.ClientContext]$clientContext = New-Object Microsoft.SharePoint.Client.ClientContext($SiteCollectionUrl
 
$clientContext.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Credentials.UserName, $Credentials.Password) 
 
$web = $clientContext.Web
 
$clientContext.Load($web)
$clientContext.ExecuteQuery()
 
Loop-AllWebs -RootWeb $web -Context $clientContext

Thanks!
 
Enjoy Reading :)
 
As usual feel free to comment / suggestions / query.