Solution: Survey app missing in SharePoint

Once in a while, you’ll want to use the survey web part for one reason or another. There are awesome tools like Yammer polls, Microsoft Forms, etc. but sometimes the only tool suitable for a specific use case is still the out-of-the-box SharePoint survey app.

If you search for it when adding a new app and get “We didn’t find a match here, but check out…” don’t fret. It’s tied to a site feature that apparently isn’t activate on your site. This applies to both on-prem and online/O365 environments.

To get the survey app as an option on your site, you’ll need to be a site owner who can activate the Team Collaboration Lists site feature (settings wheel > Site settings > Manage site features).

Once you activate it, your site will now be able to add these apps:

  • Document library
  • Custom list
  • Tasks
  • Picture library
  • Issue tracking
  • Survey
  • Discussion board
  • …and much more

Here’s a quick GIF demonstrating activation of the required feature:

Click to enlarge

Solution: PerformancePoint Dashboard Designer “Cannot download the application…missing required files”

I’m late to the game trying out PerformancePoint Services, a has-been dashboard and KPI service for SharePoint server that still exists in production for many on-prem farms running 2013/2016/2019. I’d venture to guess most would prefer the more modern and flexible Power BI (either Report Server or the online service via O365) to PerformancePoint Services but, alas, change takes time.

So, anyway, when I tried to open Dashboard Designer on a PerformancePoint list for the first time, I received the following error.

Cannot Start Application

Cannot download the application. The application is missing required files. Contact application vendor for assistance.

I had tried to open Dashboard Designer using Chrome and CrEdge (Chromium Edge) without luck. The downloaded designer.application file just gave me the issue seen above.

In the end I found, as with most dated tools and functions in the SharePoint world, some things only work in Internet Explorer (IE). This particular button, however, worked in both IE and Edge!

So copy your list’s URL, move over to Edge or IE, and try to launch it again from there. This worked well for me. Good luck!

Nate’s 2019 in Review

Reflection, to me, is an important part of my growth. It can be difficult to move forward without acknowledging and appreciating how far we’ve come. In this post, I’ll share a bit of what 2019 brought to my career journey, preparing me for 2020.

Update: Goals from 2018

In last year’s reflection post, I made the following goals:

10/19/2019SharePoint Saturday Kansas City“You’re the one, OneNote! How to be more productive with OneNote”
9/21/2019SharePoint Saturday Pittsburgh“Rise of the Advocates: Building and leading governance and champions groups”
9/21/2019SharePoint Saturday Pittsburgh“OneDrive 101: Welcome to OneDrive for Business”
8/23/2019SharePoint Fest Seattle“You’re the one, OneNote!”
8/22/2019SharePoint Fest Seattle“SharePoint Wizardry for Content Management, Archiving, & Retention”
8/21/2019SharePoint Fest Seattle“Building the Intranet of the Future: Using SharePoint to Empower Collaboration”
8/3/2019SharePoint Saturday Omaha“SharePoint Wizardry for Content Management, Archiving, & Retention”
8/3/2019SharePoint Saturday OmahaKeynote: “Rise of the Advocates: Building and leading governance and champions groups”
4/18/2019Baltimore SharePoint User Group“SharePoint Wizardry for Content Management, Archiving, & Retention”
3/17/2019MVP Global SummitAttendee
3/14/2019North American Collaboration Summit“SharePoint Wizardry for Content Management, Archiving, & Retention”
2/11/2019Kansas City Office 365 User Group“You’re the one, OneNote! How to be more productive with OneNote”
1/19/2019SharePoint Saturday, St. Louis“Building the Intranet of the Future: Using SharePoint to Empower Collaboration”
1/14/2019Kansas City Office 365 User Group“The ABCs of SharePoint: 26 ways SharePoint can enhance your digital workplace”

I met my goals, but the best part of all of it was meeting so many of you in the community. I’m motivated by everyone’s energy and curiosity and can’t wait to see what we collectively achieve in 2020.

Reflections on 2019

  • I now have three books, two published in 2019
  • I still lead LSPUG, and am grateful Greg Swart accepted my invitation to join me as co-Director
  • After speaking with MVP community leaders, transformation to the nomination and award process re-interested me in the program, and I was awarded MVP for Office Apps and Services in February
  • I passed four exams and earned two new certifications
    1. Passed MS-300 + MS-301 = M365 Teamwork Admin Associate
    2. That certification, plus MS-100 + MS-101 = M365 Enterprise Admin Expert
  • Spoke at:
    • TWO national conferences (North American Collaboration Summit and SharePoint Fest Seattle)
    • FOUR SharePoint Saturdays (St. Louis, Omaha, Pittsburgh, and Kansas City)
    • TWO user groups other than my own
  • Gave my first keynote for any event, at SPS Omaha
  • Attended my first MVP Summit
  • Appeared on two podcasts
  • Left LMH Health, and the healthcare industry, to take on new challenges in the corporate realm at DH Pace

Goals for 2020

Honestly, I don’t know what’s next and I don’t have a clear vision of where I want to be. But here are a few things I am interested in pursuing along the way to wherever I’m headed:

  • Gaining another certification
  • Learning more SQL, Azure, and AI
  • More blogging and speaking on the Power Platform
  • Writing fiction (what??)

Thank you

I am grateful to University of Kansas Libraries and LMH Health for helping me gain valuable experience and knowledge over the last several years. Within your walls I made amazing connections and friends who inspire me regularly. And without your support, I wouldn’t have achieved much of what’s shared in this post.

Thank you to my colleagues at DH Pace for making me feel welcome and valued as a new member of the team. I’m excited to see what we achieve this year.

Thank you to all of the SharePoint Saturday, national conference, and user group organizing committees who welcomed me to their respective stages this year. Meeting your enthusiastic attendees is always a highlight of my year.

Thank you to Tara Saylor, Suzanne Hunt, Nikkia Carter, Jonathan Weaver, April Dunnam, Stacy Deere-Strole, Sharon Weaver, Matthew J. Bailey, Melissa Hubbard, Shadeed Eleazer, Akdas Asif, and Mohamed Ubaid for sharing your time and expertise with the Lawrence SharePoint User Group.

Thank you to my Twitter and LinkedIn connections. I enjoy learning from you and getting to know you.

And, as always, thank you to the attendees, the readers, and listeners – you’re a continuous source of inspiration and joy. I wish each of you growth, happiness, and love this year and I hope you’ll say hello if our paths cross in 2020.

Top 10 posts of 2019 on NateChamberlain.com

In keeping with a tradition I started last year, I’m sharing the top 10 posts of 2019. Blogging is one of my favorite ways to share with the community (and, admittedly, document things I might forget otherwise). It’s been a pleasure and privilege to have this platform – thank you for reading.

The following includes the ‘Top 10’ most popular posts by views published in 2019:

Microsoft Surface Pro 4 “plugged in, not charging”
Alas, I reached a day where I thought I was done with my Surface. It powered on when plugged in
Read more.
Open a SharePoint Library in Windows Explorer and save it to Quick Access
If you can’t sync a library, or prefer not to, you can pin the web location of a SharePoint form, media,
Read more.
“Unable to connect” error when accessing SQL database in Power BI Desktop
When attempting to access a SQL server/database in Power BI, you might get the following error message: Unable to connect
Read more.
Add a new OneNote notebook to a SharePoint site
If your SharePoint site doesn’t currently have a notebook (most likely stored by default in “Site Assets”), you can add
Read more.
MS-100 & MS-101 Exam Study Guides
Update 10/14/2019: My MS-101 exam guide is now available for pre-order. Also, the courses previously listed below are no longer
Read more.
Flow now supports multiple condition controls for advanced if/then scenarios within a single step
Say goodbye to nested if/then statements in Flow taking up fourteen monitor widths. Flow now supports nested if/then statements all
Read more.
Add a print button to SharePoint list items
One of my more popular requests is an easier way to print list items (either to PDF or paper). Using
Read more.
Power BI refresh error “could not load file or assembly…provided impersonation level is invalid”
Short version Run Power BI Desktop as administrator before opening the report. Explanation/Scenario Recently, when opening a report from Power
Read more.
Export SharePoint group membership names and email addresses to Excel
Before we start, if you’re just wanting to email all members of the group you can “select all” then choose
Read more.
Add or subtract hours from date/time values in Power BI using M formula in Power Query Editor
Previously, I shared how to transform date/time values in Power BI using DAX. But I’m working on building more using
Read more.

Interested in more? Check out the archives for all previous posts:

And if my blog has been useful to you this past year, join the mailing list for weekly updates when there’s new content and consider donating to help defray the cost of keeping the site up.

Support our Community

$110 of $1,108 raised

Help support this site, the Lawrence SharePoint User Group, and community content and events.

Item Annual Cost
Domains + WP hosting + plugins  $                   568
LSPUG Swag  $                   300
LSPUG Food  $                   240
Teams for LSPUG Streaming/Recording  $                   0
TOTAL  $               1108
$
Personal Info

Donation Total: $5.00

Add a shortcut to a SharePoint document stored in a different document library (classic)

Note: Does not apply to SharePoint Online/O365 modern experiences. Only applies to classic experiences and SharePoint Server/on-prem.

In modern experiences, SharePoint allows convenient addition of links to documents stored outside the current library. However, on-prem and classic experiences are a bit different. Basically, we have to permit the “link to document” content type in the library first.

Allow shortcuts to documents

1. Go to Library > Library Settings

2. Choose Advanced settings

3. Set Allow management of content types to Yes.

4. Click OK to save changes.

5. Under Content Types choose Add from existing site content types

6. Select Link to a Document and Add >.

Click to enlarge

7. Click OK.

Test the new option

Now, back in your document library, your New button will have the Link to a Document option available.

Once selected, you’ll enter a name for the shortcut (can be different from the document’s actual name) and its URL.

Voila! Insta-link to documents stored elsewhere.

Add a shortcut to a SharePoint document stored in a different document library (modern)

Note: Applies to SharePoint Online/O365 and modern experiences only.

In SharePoint Server/on-prem, we have to manage content types and allow links to documents before we can link to documents outside the current document library. But in SharePoint Online/O365, there’s a Link option on the New menu that does all the work for us, and without even needing to adjust the library’s content type settings.

Modern experience in SharePoint Online/O365

In a modern-view document library, simply use New > Link.

Then paste a URL to the file, or select it from recent files which, yes, will include files modified even outside the current library.

This will add a link/shortcut within your document library to the document stored/managed elsewhere.

Click to enlarge

Classic experience

Check out my post on how to accomplish something similar in classic and on-prem experiences.

Solution: SharePoint document library links/shortcuts to other documents go to a blank .aspx page

Today I ran across an issue where someone had created links within a classic document library that redirected users to documents stored in a different library. This is easy to do, but for some reason those links were now leading users to blank .aspx pages instead of the intended document.

Note that users weren’t taken to an “invalid” or “can’t be found” error page, but a completely blank page with a URL ending in .aspx. If you’re being redirected to anything other than a blank page the following solution probably won’t apply to you.

I figured out that, somehow, the library in question no longer had the “Link to a document” content type included. You normally can’t delete a content type that is in use, but with the right permissions and perhaps a migration tool or script, anything is possible. Without the content type on the library, the links that once worked under that content type now could not.

Important: The links are not necessarily broken – do not delete them. Once the content type is added again, they should work unless the original URLs have actually changed.

To re-add the link/shortcut content type to the library, follow these directions (same as if you were adding it for the first time):

1. Go to Library > Library Settings

Click to enlarge

2. Choose Advanced settings

3. Set Allow management of content types to Yes.

4. Click OK to save changes.

5. Under Content Types choose Add from existing site content types

6. Select Link to a Document and Add >.

Click to enlarge

7. Click OK.

Now check your links, and they should work!

Send a weekly email of upcoming events with “Add to calendar” .ics download links using Power Automate (Flow)

Let’s create a Flow in Power Automate that accomplishes the following:

  • Sends an email every Monday morning
  • Includes a table of upcoming training opportunities from a SharePoint calendar
  • Table has a column with “Add to calendar” download links

1. Create a new flow of type Scheduled – from blank

2. Name the flow and set the schedule to whatever frequency and times are appropriate for your needs.

Click to enlarge

3. Choose your site and list name. In my case, my calendar isn’t listed so I’ll type its name, Events, after select Enter custom value.

Click to enlarge

4. To filter to just the events coming up in the next week, we’re going to expand “Show advanced options” and enter filter criteria.

5. If you, like me, are going to filter based on “Start Time” you’ll need to know its internal name which is EventDate. For our filter, we can only use internal field names. To get started, copy and paste the following filter query into your Filter query box:

EventDate gt '' and EventDate lt ''

6. Now click between each set of apostrophe ( ‘) marks and change the dynamic content panel to Expression as seen below.

  • First expression: utcNow()
  • Second expression: addDays(utcNow(),8)
Click to enlarge

7. Now add a Create HTML table step. Use the dynamic content panel to set “From” to value from the Get items step (1). Then Show advanced options (2) and set Columns to Custom (3).

Click to enlarge

8. Under Header, type each column header you want in your table in the order you want it to appear horizontally. For Event I’ve mapped its Value to the “Title” field on my SharePoint calendar by selecting Title from dynamic content. You may also wish to add columns like Location and Category. Get your headers in the order you like, but leave Date and Save/Add to Calendar blank for now.

Click to enlarge

9. Once you’ve gotten all but Date and Save mapped to a SharePoint calendar field, it’s time to use Expression (on the dynamic content panel) to set up the remaining two. You can copy and paste Date’s formula as long as you’re using Start Time (EventDate) for the date. Save, however, you’ll need to update with your own site collection’s URL (where the calendar lives) and replace the GUID with your own calendar’s GUID. Follow steps 1-2 in this post to get your calendar’s GUID.

  • Date: formatDateTime(item()?[‘EventDate’],’ddd MMM d’)
Click to enlarge
  • Save: concat(‘<a href=”https://YourSiteURL/_vti_bin/owssvr.dll?CS=109&Cmd=Display&List=%7B1EA8795A%2D3B0D%2D43D7%2DA48E%2DB3CCD4BFE950%7D&CacheControl=1&ID=’,item()?[‘ID’],’&Using=event.ics”>Add to my calendar</a>’)
Click to enlarge

10. Now add a Compose step. This will make sure our links are clickable in the email (helps decode the HTML so that it parses and renders correctly). We’ll populate this, again, by using an Expression.

(replace(replace(replace(replace(body('Create_HTML_table'),'&lt;','<'),'&gt;','>'),'&amp;','&'),'<table>','<table border="3" bgcolor="ffffff">'),'"','"')
Cilck to enlarge

11. Lastly, add a Send an email step. I preferred using the html markup option and added an image to my header. You can use either the default rich text or html editor. To insert your table, make sure you insert Outputs (from dynamic content > Compose step).

Click to enlarge

That’s it! In 11 steps, you’ve scheduled a weekly digest that will email recipients a table of clickable “Add to calendar” links for upcoming opportunities.

To test your flow, rather than wait for the start of your schedule, use “Test.”

To elevate this concept to the next level, you can adjust your HTML filter to only get a certain category and send multiple emails to subscribers of different categories (say, only PowerApps subscribers getting PowerApps courses). You could also create multiple HTML tables and show “SharePoint courses” in one table, “OneNote courses” in the next and so on.

Creating iCal (.ics) calendar item links with a workflow (Power Automate or SharePoint Designer)

When working with calendars, a big request I hear is to make it more like Outlook or to make it easy to add an event to your calendar, at least. In SharePoint online, this is easy! The Events web part on modern pages includes an Add to my calendar button on events by default.

Click to enlarge

However, when working with classic pages or SharePoint Server/on-prem, it’s not so easy. There are two ways we might utilize Power Automate or SharePoint Designer to help us out:

  • We could create a hyperlink column if we want something on-page/in-item, then populate it using a workflow.
    • Usage idea: A landing page for upcoming training opportunities displayed in list (not calendar) format with a column designated for “Add to my calendar” links
  • If it doesn’t need to be clickable on the item or page within SharePoint, we could just build the URL within the workflow and include it in an email message.
    • Usage idea: A Flow that runs weekly to “Get items” coming up that week and sends a list out with clickable links for adding items of interest to recipients’ calendars

URL structure

No matter the tool, Power Automate or SharePoint Designer, the most important part to know is how to build the URL. That won’t change from one tool to the other.

1. Go the the list settings for the calendar hosting the events

Click to enlarge

2. Copy the list GUID from the URL in the browser. This includes everything in the address bar after “List=”. This should begin with %7B and end with %7D. This is your calendar’s GUID in hyperlink-friendly formatting.

ical4
Click to enlarge

3. Update the following URL template with your site’s path, and paste in the list/calendar GUID you copied from step 2 where GUID is. Leave the [ID] as it is for now.

https://Site or Subsite path/_vti_bin/owssvr.dll?CS=109&Cmd=Display&List=GUID&CacheControl=1&ID=[ID]&Using=event.ics 

Your almost-finished result should resemble this:

https://natechamberlain.sharepoint.com/_vti_bin/owssvr.dll?CS=109&Cmd=Display&List=%7B1EC8795A-3B1D-43D7-A49E-B1CCD4BFF950%7D&CacheControl=1&ID=[ID]&Using=event.ics 

Now we have everything we need to finish the process by using whichever workflow platform you prefer or have access to.

Create iCal (.ics) links using Power Automate

No matter where you’re using the URL in your flow, we’ll create it as an expression so we can use the concat() function.

If you just want to update a field, or create a variable, with the URL, it’s as simple as:

1. Paste the URL part you have from the previous section of this post

2. Delete [ID]

3. With your cursor still where [ID] was, use the dynamic content panel to search for and insert ID in its place.

If you want to populate an actual hyperlink format column with a label/description that’s prettier than the full URL, however, you’ll need to do a bit more work so that you can have both URL and description. Follow the steps in this post on updating hyperlink or picture format columns using Power Automate.

If not updating a field or creating a variable that pieces the URL together, you can create expressions (via Dynamic content panel) to concatenate the different parts of the URL. For example, if I’m creating an HTML table, for Value I’d use the dynamic content panel > Expression and enter a formula like:

concat('<a href="https://natechamberlain.sharepoint.com/_vti_bin/owssvr.dll?CS=109&Cmd=Display&List=%7B1EA8795A%2D3B0D%2D43D7%2DA48E%2DB3CCD4BFE950%7D&CacheControl=1&ID=',item()?['ID'],'&Using=event.ics">Add to my calendar</a>')

In this specific example, I’m creating the table after a “Get items” step. The formula above is what I’m using for the value of the “Save” (Add to Calendar) column.

Check out this post for full instructions on sending weekly emails of upcoming events with easy “Add to calendar” links using Flow.

Create iCal (.ics) links using SharePoint Designer

In SharePoint Designer, we can set a hyperlink field to our iCal link to make it easy to add an event to your calendar. This could be placed as a main column in a list view, or just on item display forms like this:

Let’s set the hyperlink field via workflow:

1. Create a variable (set workflow variable) and use the string builder

2. Paste your almost-finished URL from earlier in this post. Replace [ID] with a lookup to the current item’s ID

3. If setting a field (skip if just using the link elsewhere) add , Add to Calendar (or whatever link text you want) to the end of the string. It just has to be a comma, a space, and the text.

Click to enlarge

4. Set the hyperlink field (iCal in my example above) to your new variable.

If you’re not setting a field in your list, maybe you’re emailing new events to people and want an easy link in the email body itself. In that case, just skip step three above and your variable will just be the URL, ready to be used in email actions.

Click to enlarge

Why can’t we just use calculated columns?

Once upon a time, I blogged about creating Automatic iCal hyperlinks using a calculated column. This almost works. It creates the hyperlinks for all existing items at the time of the calculated column’s creation. But then if you add a new item or modify an existing item, the [ID] field drops out the hyperlink which, of course, breaks the link.

The appeal of calculated columns is that it won’t create another version of an item when the link is generated and it doesn’t require Power Automate or SharePoint Designer to work. Unfortunately, if the link doesn’t work after item edit or creation, then the point is lost anyway. So let’s pretend that method doesn’t exist except for one-time uses or lists that will never change again.

Update a hyperlink or picture column in SharePoint using Microsoft Power Automate (Flow)

Setting a hyperlink column’s value using Power Automate is a bit different than setting other column types’ values. In SharePoint, a hyperlink column has two components – address and description. If you update this column type using Power Automate’s “Update item” action, your address and description are both set to the same value.

In SharePoint Designer workflows, we could do this easily with the usual “Set field” action:

But in Power Automate, we only get one field which maps to the URL/address part of the hyperlink field, and is duplicated as the description as well in SharePoint.

And if you’re thinking it could work with a comma, as some other field types might, it won’t. You’ll get “Enter a valid uri.”

To get this to work so we can set both address AND description as separate values, we have to use an HTTP request action instead of (or in addition to) the Update item action. This isn’t as complicated as it may sound. Here are the steps:

1. Add the Send an HTTP request to SharePoint action

2. Choose or enter your site for Site Address

3. Set Method to POST

4. Set the Uri to the following, changing List Name to your list’s name, and replacing [ID] with the ID field from dynamic content

_api/web/lists/GetByTitle('List Name')/items([ID])

5. The easiest way to set your headers is to copy and paste this text into the “Text mode” option as demonstrated in the GIF that follows.

{
   "Content-Type": "application/json;odata=verbose",
   "X-HTTP-Method": "MERGE",
   "IF-MATCH": "*"
 }
Click to enlarge

6. Lastly, in Body, you can copy and paste this as well, but:

  • replace List_x0020_Name with your own list’s name. _x0020_ should replace any spaces in your list name.
  • replace Hyperlink with the name of the hyperlink column’s name
  • replace Google with the label/description/clickable text you want for the hyperlink
  • replace http://www.google.com with the URL/address part of the hyperlink
{'__metadata': {'type':'SP.Data.List_x0020_NameListItem'},'Hyperlink':
 {'Description': 'Google',
 'Url': 'http://www.google.com'}
 }

Your final result should resemble this:

Click to enlarge

Test that out. When it’s working and you’re ready to take it to the next level, you can replace the static url (like Google’s in my example) with dynamic content. For example, you could create convenient one-click links to an item’s version history:

Click to enlarge
Click to enlarge