Category Archives: Uncategorized

How Files are Organized within Microsoft Teams/O365 Groups

If a user wants to store a file for an Office 365 Group, the could store it in in the “files” area of the Group, which is really just a library in the team site that was created for the group. Alternatively, they could store the file in the “files” area of a channel within a Team. This file will be stored in a subdirectory of the library for the Office 365 Group. If a user tries to view the files for a team that is associated with a group, they won’t be able to, as files are only associated with a channel, not the team itself. If a user views the files for a specific channel of a team that is associated with a group, they will only see files for that one channel, and will not be able to view files in other channels or files that were uploaded to the files repository for the Group. If, however, the user navigates to the normal O365 Group site and views the file repository, then they will be able to view group files, plus they will be able to see subfolders and files that were created for each channel within the Team that is associated with that Group, which makes sense, as the channels are associated with the group.

If a user would like to view a file, they could of course navigate to the appropriate repository, as described above, or they could simply click on “files” on the left nav of the Teams interface. Then, after clicking on “Microsoft Teams”, the user will be presented with a list of all files that exist across all all channels of all Teams they have access to. Helpfully, this list will also show files that are part of the Group, and not just the team’s channels. Just to clarify, if the user clicks on “OneDrive” in the Files tab, they will see the contents of their own personal OneDrive, not the OneDrive files for any of the teams or groups.

If the user clicks on “notes” within a channel of a Team, they will gain access to the OneNote notebook for that channel. More specifically, there is one single OneNote notebook for the Office 365 Group that is stored in the site assets library of the Group’s Team Site which hosts notes for the Group, including notes for each channel within the Team. Each channel of a Team will get a new tab within the notebook. If a user views the Notes section within the Team interface, they will see only the notes for the current channel. If the user clicks the “edit in onenote” button, they will be able to easily switch between tabs within onenote, and thereby view the notes from the different channels, or notes from any other tab that was created in the site notebook. If the user navigates to the Group site and clicks to view the notebook, the user will have full access to all tabs in the web interface, including the tabs for each team channel. This makes sense, as again, there’s one OneNote Notebook on a Group’s Team Site that stores notes for Group, including for all channels of the Team that is associated with that Group.

It really couldn’t be simpler. 😉

Conditional Formatting in MS Project 2010 via VBA

This is a bit tricky, as Project doesn’t give the normal hooks for getting access to cell properties, like Excel. Also, the event model for Project is accessed a bit differently.  So, a couple possibilities:

Marked Fields

VBA can set a row as marked, and the style of marked rows can be set via Gantt Chart Tools –> Text Styles –> Item to Change –> Marked Tasks

Once the formatting has been set, it’s simple enough to change a row to marked:

Dim t As Task
For Each t In ActiveProject.Tasks
If t.Cost > 10 Then
t.Marked = True
t.Marked = False
End If

Formatting Individual Cells

However, this colors the entire row, not an individual cell. To shade individual cells, there’s a function named “Font32Ex”. The difficulty with this function is that it works with the selected cell, and doesn’t take a cell reference. To select a cell, we can use “SelectTaskField”:

SelectTaskField Row:=100, Column:=”Cost”, RowRelative:=False

RowRelative is key here, in that the above will select the 100th row, regardless of where the focus was. So, we can put the above in a loop:

Dim i As Integer
For i = 1 To pj.Tasks.Count
Dim t As Task
Set t = pj.Tasks(i)
If t.Cost > 5 Then
SelectTaskField Row:=i, Column:="Cost", RowRelative:=False
Font32Ex CellColor:=62207
SelectTaskField Row:=i, Column:="Cost", RowRelative:=False
Font32Ex CellColor:=-16777216
End If

Note: the color values were obtained just by recording a macro and changing the color in the macro.

The above meets my needs, but perhaps the cell needs to be changed on edit, and not loop through all tasks. If so, check out the technet article that goes over hooking into task level events:

Sway vs PowerPoint

Many people have been asking about the purpose of Sway, and since it’s a tool to create presentations, the natural follow-up question is why is there a new tool when PowerPoint is perfectly capable of creating presentations.

PowerPoint was designed for use with a projector. Optionally, slides can be printed, but its main focus is to build presentations that will be displayed using a device with a particular size. In PowerPoint, you control exactly where elements will be displayed, the font sizes, the alignment,… .everything. And, for projectors, this is nice. But if someone tries to view a PowerPoint presentation on a phone, they’re going to have issues. Fonts that are sized well for a projector are not sized well for a small screen. Photos that look good in a horizontal layout may not appear correctly when viewed in a vertical layout.

So, this is where sway fits in. It’s a new, web based tool that allows you to create presentations that are optimized for viewing on various sizes devices. Sway does not provide a lot of options that PowerPoint users are used to, as the goal is not to define pixel by pixel exactly where things will appear, as sway takes care of positioning elements based on the size of the screen that is being used by each user.

Why didn’t they add this to PowerPoint? PowerPoint has a lot of existing capabilities like slide transitions and animations, and the ability to precisely define the slide layout that wouldn’t work well in this new environment. So instead of creating two different PowerPoint modes with radically different capabilities, they’ve built a new tool.

Rationale for Office 365 Groups

I think I finally understand Office 365 Groups. I have been thinking of them as a competitor to Team Sites, and in that role they fall short. However, it is true that a few (or more) users may need to start working on a project together, and often the process to request and configure a team site is more than they want to deal with. Right or wrong, the solution for many people in the past has been to go around IT and just use services such as Dropbox. So thinking that Groups somehow replaces Team Sites is wrong; Groups replace the 3rd party tools that people have been using instead of Team Sites. Will Groups replace some team sites? Most likely. But the team sites they will replace are the ones where structure and process really weren’t needed anyway.

I’ve seen quite a few people asking for the ability to turn off Groups for many users. I understand the concerns that those people have. But now I think I get Microsoft’s perspective. If Groups are turned off for some users, those users will still have access to products from Microsoft’s competitors.

404 for SharePoint 2013 Apps hosted in a Subdomain

This is just a minor clarification on setting up DNS for SharePoint 2013 apps that are configured via a subdomain. If you’re looking for a full walkthrough of the whole process of enabling the App Store, see here:

(And, just a reminder, MS recommends that you not use a subdomain of the domain that hosts the SharePoint site anyway, but in case you did…)

Specifically, if you can get to the store, add the app, but when you browse to the app you get a 404 page not found message, then perhaps the problem is DNS. If you have the following SharePoint server:

Then one option for setting up apps is to create a subdomain:


To set up the above in DNS, add a new Alias (CNAME) record as follows:

Alias Name: *.app

This will give a FQDN of: *

FQDN for target host:

(I’ve found a few pages that describe this process but are vague about what should be specified for the FQDN for the target host. To be clear, the target host should be the SharePoint server, specifically, the WFE).


To confirm, once you have the above set up, the following commands should all return the IP for





SQL Database Projects

In Visual Studio, you can create SQL Database Projects to handle deploying / updating databases. When deploying, it will modify the target database to match the state of the source database. Meaning: you don’t set up a script to create a table. Rather, the database project knows the schema of the table, and the deployment will determine what differences exist and alter the target table as necessary, adding fields, constraints, etc.

There are some of walkthroughs available from MS:

There is also a codeplex project with additional documentation:


Following are a couple other notes, in no particular order:


The deployment will update table schemas and objects, but not data. You can certainly add a post-deployment script to insert data, but the script should be written in such a way so that it can be run multiple times without issue.

Bill Gibson has a good post on this with sample code:


Post-Deployment Scripts

To add a post-deployment script, r-click on the project à add à Script.

To change the type or disable a script, select it in the solution explorer, and change the “BuildAction”.

Post-Deployment scripts are run after the schema changes have been made, and before the check constraints have been re-enabled.



In the publish dialog, after filling in the form appropriately, and before hitting publish, click on “create profile”. The next time you run the publish, just click “load profile” and select the file (the file name should be projectname.publish.

One of the advanced options is “Generate Smart Defaults”. For example, if an int field was added with no default value, the smart default option will set that field to zero. If that field is a foreign key, it will still be set to zero and re-enabling the check constraint will fail, so set proper field defaults.