Tuesday, February 23, 2021

SharePoint Gallery View - Make images of people bigger

The gallery view in SharePoint is great, especially when used to show people.  For example, I've created a New Hire list that is populated by a Powershell script that pulls in any new hires nightly.  But the images for the people are tiny:

But it's SO CLOSE to what we're looking for!

So with a couple of quick edits, you can increase the size of those images.

  • From your Views, select "Format the current view":

And then select on Card Designer, then Advanced Mode


Copy the JSON and paste it into an editor.  Do a search for:

"src": "=getUserImage([$personIterator.email], 'S')"

And replace the 'S' with an 'L' to bring back the bigger image.

Next, find the following block:

"forEach": "personIterator in [$NewHire]",
                    "elmType": "a",
                    "attributes": {
                      "class": "=if(loopIndex('personIterator') >= 5, 'sp-card-userContainer', 'sp-card-userContainer sp-card-keyboard-focusable')"
                    "style": {
                      "display": "=if(loopIndex('personIterator') >= 5, 'none', '')"

Add a width and height property to the style section to the size that you'd like the image to be:

"forEach": "personIterator in [$NewHire]",
                    "elmType": "a",
                    "attributes": {
                      "class": "=if(loopIndex('personIterator') >= 5, 'sp-card-userContainer', 'sp-card-userContainer sp-card-keyboard-focusable')"
                    "style": {
                      "display": "=if(loopIndex('personIterator') >= 5, 'none', '')",
      "width": "100px",
      "height": "100px"

Pasted this JSON back in, save the view and you should be all set!

Monday, February 1, 2021

Teams: Tasks by Planner - We couldn't save your tab settings

If you're an owner of a team and you try to add the Tasks by Planner tab and get the "We couldn't save your tab settings. Please try again.":

Just make yourself a member temporarily and then you'll be able to create the tab.

Wednesday, September 30, 2020

Copy all views from one SharePoint list to another via Powershell

 Here's a PnP Powershell script that copies all views from one SharePoint list to another list:

# Url to the site
$siteUrl = "https://vivity.sharepoint.com"

# The list where we want to copy all of the views
$listWithViewsToCopy = "Banana"

# The list name to copy the views to
$listToCopyTo = "Pineapple"

Write-Host "Connecting to PnP..."
Connect-PnPOnline -Url $siteUrl -Credential (Get-credential)

# Get all the views and properties for the list
$viewsToCopy = Get-PnPView -List $listWithViewsToCopy -Includes "ViewQuery","ViewType","ViewData","ViewJoins","ViewProjectedFields","RowLimit","Paged"

# Loop through each view and create it in the new list
foreach ($view in $viewsToCopy)
   Write-Host "Adding View: "$view.Title
   # Loop through all fields and create an array

   $fields = [System.Collections.ArrayList]::new()

   foreach ($field in $view.ViewFields)

   # Add the new view
   Add-PnPView -List $listToCopyTo -Title $view.Title -Fields $fields -Query $view.ViewQuery -ViewType $view.ViewType -RowLimit $view.RowLimit

Thursday, June 11, 2020

Grant access to an item or folder: Add a SharePoint Group

In Power Automate, if trying to grant access to an item or a folder, and you try to use a SharePoint Group, it won't resolve and you'll get an error that the field is required.

But if you just Initialize a variable and assign it the name of the SharePoint Group:

And then use that variable instead:

You no longer get an error, and the group will get added with the access level specified when you run the flow!

Monday, June 8, 2020

Get-PnPListItem in a list with greater than 5000 items

If you need to grab all the items from a list with greater than 5000 items in SharePoint Online, you might get the following error:

The attempted operation is prohibited because it exceeds the list view threshold enforced by the administrator

To get around that, add a query with the scope of RecursiveAll to your query like so:

Connect-PnpOnline -Url 'https://vivity.sharepoint.com/sites/sitename' -Credentials (Get-Credential)
$query = "<View Scope='RecursiveAll'><RowLimit>5000</RowLimit></View>"
$items = Get-PnPListItem -List 'My List' -Query $query

Thursday, October 3, 2019

Display all the sites a user can access

I've heard many people ask for a place to view all the sites they have access to.  Using the content search web part you can accomplish this and have a page that by using search, which returns unique results for each user based on their permissions, each user gets a unique list of the sites they can access that looks something like this:

The following steps describe how to create this:

Upload the template files and css
First, download the the code from the following in github:  https://github.com/sregan1/SharePoint-Office365/tree/master/Sites%20Directory

Open up SharePoint Designer and select on All Files in the left hand navigation.  Then go to /_catalogs/masterpage/Display Templates/Content Web Parts.  Copy Control_Sites_Directory.html and Item_Sites_Directory.html here.  Edit the url in these files (where it says "vivity.sharepoint.com") to your url.

Go to Site Assets, and create a Styles folder (if not there already), and copy SitesDirectory.css there.

Select the templates
First, add a content search web part to your page and edit it.  In the dropdowns, select the newly added Sites Directory for the Control and Item Sites Directory for the item.

Setup the web part query
edit it, hit the Change Query button, Switch to Advanced Mode and paste in the following "contentclass:STS_Site" into the Query text box

You might want to remove some sites/paths from the query as needed by using the Property filter (e.g. -Path:https://vivity.sharepoint.com/sites/sitenottoshow).  If you want to add subsites as well, make the query text (contentclass:STS_Site OR contentclass:STS_Web).

And that should be it!

NOTE:  If some sites aren't showing, just kickoff a re-index of the site in Site Settings  -> Search and offline availability...

The paging functionality was referenced from Sean McDonough's blog here:  https://sharepointinterface.com/category/sharepoint-2007/development/

Tuesday, June 5, 2018

Task Approval by Email Replies

This post details how to setup a script to process emails, and setup your workflows to send emails that can be processed by the script, so that end users can ultimately just reply to an email and it will get processed and close the task.


We'll setup a script as a scheduled task, that will check a designated inbox for emails to process.  It will scan the body of those emails for keywords to approve or reject.

We'll then take a workflow task process, and update the email to have an approve and a reject mailto link, which will open up an email, which when a user sends, will get processed and will update and close the task.

Step 1:  Setup Email Inbox

The first step is to create an email inbox that we'll use for all processing.  In this inbox, create three folders:
  • Email Approvals
  • Email Approvals Processed
  • Email Approvals Not Processed
Create an inbox rule that will move the item to the Email Approvals folder if the subject begins with "REPLY:"

This Email Approvals folder will be the folder our script will check to process any emails that arrive there.

Step 2:  Setup the script

Download the script from github, and change the necessary variables to local paths on your machine.  Set it up on the server that it will be running on.

Step 3:  Create Encrypted Credentials 

The script assumes there are two users, one that has the required permissions to update the task in SharePoint ($UserSharePoint), and one user for the mailbox where the emails are being sent to ($UserEmail).  Create encrypted files for each by following the instructions here, and make sure to match the name and path of the file to the $CredsFileSharePoint and $CredsFileEmail in the script.

Step 4:  Create a Scheduled Task

Setup a scheduled task to run the script, and under Actions set the following:

Program/script:  C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Add Arguments:  "F:\Scripts\EmailApprovals\Process-Email-Approvals.ps1"
Start in:  F:\Scripts\EmailApprovals\

Step 5:  Create a Workflow Task Process

Next create a workflow with a task process.  For the email option, use the following as a template:

Email to user (sent from workflow)

Subject:  ACTION REQUIRED:  PO 98451 Change Request
Body:  A new PO Change Request has been submitted and requires your approval:

Title: Requesting a new phone 
PO Number: 98451
PO Owner: Jane Doe 
Original Amount: $699.00 
New Amount: $799.00 
Description: ​Upgraded the model

Please either approve or reject the request below:

Approve         Reject

PO:  https://vivity.sharepoint.com/Finance/Lists/POChangeForm/DispForm.aspx?ID=117

Mailto Link Sample

In each email from the workflow, we have a mailto link for approving and rejecting, which should resemble the following.

email.approvals@vivityconsulting.com?subject=REPLY:%20PO%20Change%20Request&body=I%20approve%20the%20following%20PO%20Change%20Request.%0D%0A%0D%0ATitle:%20Requesting%20a%20new%20phone%0D%0APO%20Number:%2098451%0D%0APO%20Owner:Jane%20Doe%0D%0AOriginal%20Amount:%20$699.00%0D%0ANew%20Amount:%20$799.00%0D%0ADescription:%20%E2%80%8BUpgraded the model%0D%0A%0D%0A______________________________%0D%0A%0D%0AFor%20Processing%0D%0A%0D%0Aurl=https://vivity.sharepoint.com/Finance/Lists/POChangeTasks/DispForm.aspx?ID=117

Mailto Response Email

Note that the script keys off of certain words, so if “approve”, “acknowledge” or “yes” is in the body, it will be approved, if “reject” is in the body text, it will be rejected.

Subject: REPLY: PO Change Request
Body:  I approve the following PO Change Request.

Title: Requesting a new phone 
PO Number: 98451
PO Owner: Jane Doe 
Original Amount: $699.00 
New Amount: $799.00 
Description: ​Upgraded the model
For Processing


The following should be in place for the process to work properly:
  • The link should be to a Tasks lists (as the script is updating task columns)
  • The body of the email received must contain either (case insensitive):
    ·       Approve
    ·       Acknowledge
    ·       Yes
    ·       Reject
  • The body must also contain a "url=" with a link to the task item in the format, which is typically included at the end of the email.
  • All processing is written out to a log to review any potential issues.  A new file is created each time the process is run, and this folder can be regularly cleaned up.