Confluence user macro exclude pages with certain labels
Asked by Erik Ekengren:

Hi!

I am in need of a simple solution to audit and keep relevant information in a Confluence Space. My thought is to have at least one Space admin that are responsible for keeping the information up to date. For this I have created a page that only the space admins can see, and on that page is a user macro that I have found searching far and wide on the web. This user macro presents all pages in a space that haven?t been updated for X days, and by doing this it is easy to go in and have a look at all the pages that needs an update. They are then able to just do an update on the page to keep the the information up to date.

However I have noticed that I would very much would like to exclude some pages in this report. For example all the meeting notes (that could be handy to still keep but doesn?t need an update) would be very good to exclude from the user macro. So I was thinking that maybe we could update this user macro to exclude pages with a specific label, the problem is that I am not a developer so my knowledge around this is very limited.

Therefore I would very much appreciate if someone would be able to help me with this task. I think this would benefit a lot of other Confluence admins as well that have similar requests from management etc.

This is the user macro I have and would like to be able to exclude pages with certain labels:

*** ** * ** ***

## Macro title: Old Pages  
## Macro has a body: Y or N (N)  
## Body processing: Selected body processing option  
## Output: Selected output option  
##  
## Developed by: Andrew Frayling  
## Date created: 05/02/2012  
## Installed by: \&lt;your name\&gt;

## Macro to display pages that have not been updated for x days  
## [@Param](/t5/user/viewprofilepage/user-id/1345631) numdays:title=Number of Days\|type=int\|desc=Enter number of days to compare\|required=true\|multiple=false\|default=180

#set ( $allPagesInSpace = $pageManager.getPages($space, true) )

## default value handler, set default to 180 days  
#set ( $numdays = $paramnumdays )  
#if(!$numdays)  
#set ( $numdays = "180" )  
#else  
#set ( $numdays = $paramnumdays )  
#end

## cast the number of days to an Integer  
#set ( $Integer = 0 )  
#set ( $intnumdays = $Integer.parseInt($numdays) )

## negative sign the number of days  
#set ( $negativeDays = (-1 \* $intnumdays) )

## get a calendar object so we can calculate the  
## date we wish to compare with the page modification date  
## e.g. $compareDate.add(6, -7) for pages modified over a week ago  
#set ( $compareDate = $action.dateFormatter.getCalendar() )  
$compareDate.setTime($content.getCurrentDate())  
$compareDate.add(6, $negativeDays)

\<p\>Pages last updated before \<strong\>$action.dateFormatter.format($compareDate.getTime())\</strong\>\</p\>

\<table\>  
\<tr\>  
\<th\>Page\</th\>\<th\>Created\</th\>\<th\>Created By\</th\>\<th\>Last Updated\</th\>\<th\>Last Updated By\</th\>  
\</tr\>

## loop through all the pages in the current space  
#foreach($page in $allPagesInSpace)

## get a calendar object and for each page in space set it to last modification date  
#set ($pagedate = $action.dateFormatter.getCalendar())  
$pagedate.setTime($page.getLastModificationDate())

## only display pages last modified before the compare date  
#if ($pagedate.before($compareDate))  
\<tr\>  
\<td\>#contentLink2($page true false)\</td\>  
\<td\>$action.dateFormatter.format($page.getCreationDate())\</td\>  
\<td\>#usernameLink($page.creatorName)\</td\>  
\<td\>$action.dateFormatter.format($page.getLastModificationDate())\</td\>  
\<td\>#usernameLink($page.lastModifierName)\</td\>  
\</tr\>  
#end  
#end  
## end looping through pages in the current space

\</table\>


Answers:
author: Nic Brough -Adaptavist-
body: I think this chunk of code should get you most of the way there:

`#foreach ( $label in $content.getLabels() )`  
` ``#``if` `( ( $label == "Penguin" ) )`  
` Penguins are here!`  
` ``#end`  
` ``#end`

comments: author: Erik Ekengren
body: Thank you f?r trying to help me Nic but I am not able to figure out how to have 2 separate IF statements in the same Macro. I barely have basic understanding of how this code and are not able to do this at all. I found another macro where I am able to do the other way around (to exclude pages with specific labels) but then I will not be able to sort out the pages that haven?t been modified in a while.

Is it possible to do 2 different IF statements in the same macro?

This is the other macro:  

*** ** * ** ***

## [@Param](/t5/user/viewprofilepage/user-id/1345631) ExcludeLabels:title=Labels to exclude\|type=string\|desc=Enter labels to be excluded, separate multiple labels with comma. This excludes pages with the label that you enter\|default=archived  
## [@Param](/t5/user/viewprofilepage/user-id/1345631) numdays:title=Number of Days\|type=int\|desc=Enter number of days to compare\|required=true\|multiple=false\|default=180

#set ( $excludedLabelsString = $paramExcludeLabels + "," )  
#set ( $excludedLabelsString = $excludedLabelsString.replace(" ","") )  
#set ( $compareDate = $action.dateFormatter.getCalendar() )  
#set ( $allPagesInSpace = $pageManager.getPages($space, true) )

## default value handler, set default to 180 days  
#set ( $numdays = $paramnumdays )  
#if(!$numdays)  
#set ( $numdays = "180" )  
#else  
#set ( $numdays = $paramnumdays )  
#end

## cast the number of days to an Integer  
#set ( $Integer = 0 )  
#set ( $intnumdays = $Integer.parseInt($numdays) )

## negative sign the number of days  
#set ( $negativeDays = (-1 \* $intnumdays) )

## get a calendar object so we can calculate the  
## date we wish to compare with the page modification date  
## e.g. $compareDate.add(6, -7) for pages modified over a week ago  
#set ( $compareDate = $action.dateFormatter.getCalendar() )  
$compareDate.setTime($content.getCurrentDate())  
$compareDate.add(6, $negativeDays)

\<p\>Pages last updated before \<strong\>$action.dateFormatter.format($compareDate.getTime())\</strong\>\</p\>

\<table\>  
\<tr\>  
\<th\>Page\</th\>\<th\>Created\</th\>\<th\>Created By\</th\>\<th\>Last Updated\</th\>\<th\>Last Updated By\</th\>  
\</tr\>  
#foreach ( $page in $allPagesInSpace )

## get a calendar object and for each page in space set it to last modification date  
#set ($pagedate = $action.dateFormatter.getCalendar())  
$pagedate.setTime($page.getLastModificationDate())

#set ( $notContainsExcludedLabel = true )  
**## THIS DO NOT WORK** if ($pagedate.before($compareDate))  
#if ( $excludedLabelsString != ",")  
#foreach ( $labelling in $page.getLabellings() )  
#set ( $label = $labelling.getLabel() + "," )  
#if ( $excludedLabelsString.contains($label) )  
#set ( $notContainsExcludedLabel = false )  
#end  
#end  
#end  
#if ( $notContainsExcludedLabel )  
\<tr\>  
\<td\>#contentLink2($page true false)\</td\>  
\<td\>$action.dateFormatter.format($page.getCreationDate())\</td\>  
\<td\>#usernameLink($page.creatorName)\</td\>  
\<td\>$action.dateFormatter.format($page.getLastModificationDate())\</td\>  
\<td\>#usernameLink($page.lastModifierName)\</td\>  
\</tr\>  
#set ($pageDate = $action.dateFormatter.getCalendar())  
#if ( $pageDate.before($compareDate) )  
#else  
#end  
#end  
#end


author: Nic Brough -Adaptavist-
body: Yes, you can do many if statements, or even nest them.

For example:  
`#foreach ( $label in $content.getLabels() )`  
` ``#``if` `( ( $label == "Penguin" ) )`  
` Penguins are here!`  
` #if ($temperature == "warm") `  
` Galapagos Penguins!`  
` #else`  
` Emporer Penguins!`  
` #end`  
` ``#end`` `  
` #``if` `( ( $label == "Gorilla" ) )`  
` Smoke me a Gorilla, I'll be back for Breakfast`  
` ``#end`  
`#end`

The way to think of these macros is very "procedural", the interpreter really does read them one line at a time, top to bottom. So if you can get the code into the right place inside your #if statements, it should work fine.


author: Erik Ekengren
body: Thank you Nic! I will try this and hopefully I will be able to come up with the solution.

BR/

Erik


author: Erik Ekengren
body: Got it to work after some (many) failures. This is the end result and will present all pages that hasn?t been updated before X days and also filter out labels that you specify in the macro:

*** ** * ** ***

## Macro title: Audit outdated pages  
## Macro has a body: Y or N (N)  
## Body processing: Selected body processing option  
## Output: Selected output option  
##  
## Developed by: Erik Ekengren  
## Date created: 06/09/2021  
## Installed by: Your name

## Macro to display pages that have not been updated for x days  
## [@Param](/t5/user/viewprofilepage/user-id/1345631) numdays:title=Number of Days\|type=int\|desc=Enter number of days to compare\|required=true\|multiple=false\|default=180  
## [@Param](/t5/user/viewprofilepage/user-id/1345631) ExcludeLabels:title=Labels to exclude\|type=string\|desc=Enter labels to be excluded, separate multiple labels with comma. This excludes pages with the label that you enter\|default=archived

#set ( $allPagesInSpace = $pageManager.getPages($space, true) )

#set ( $excludedLabelsString = $paramExcludeLabels + "," )  
#set ( $excludedLabelsString = $excludedLabelsString.replace(" ","") )  
#set ( $descendantPages = $pageManager.getDescendents($content) )  
#set ( $compareDate = $action.dateFormatter.getCalendar() )

## default value handler, set default to 180 days  
#set ( $numdays = $paramnumdays )  
#if(!$numdays)  
#set ( $numdays = "180" )  
#else  
#set ( $numdays = $paramnumdays )  
#end

## cast the number of days to an Integer  
#set ( $Integer = 0 )  
#set ( $intnumdays = $Integer.parseInt($numdays) )

## negative sign the number of days  
#set ( $negativeDays = (-1 \* $intnumdays) )

## get a calendar object so we can calculate the  
## date we wish to compare with the page modification date  
## e.g. $compareDate.add(6, -7) for pages modified over a week ago  
#set ( $compareDate = $action.dateFormatter.getCalendar() )  
$compareDate.setTime($content.getCurrentDate())  
$compareDate.add(6, $negativeDays)

\<p\>Pages last updated before \<strong\>$action.dateFormatter.format($compareDate.getTime())\</strong\>\</p\>

\<table\>  
\<tr\>  
\<th\>Page\</th\>\<th\>Created\</th\>\<th\>Created By\</th\>\<th\>Last Updated\</th\>\<th\>Last Updated By\</th\>  
\</tr\>

## loop through all the pages in the current space  
#foreach($page in $allPagesInSpace)

## find pages with the label/s  
#set ( $notContainsExcludedLabel = true )  
#if ( $excludedLabelsString != ",")  
#foreach ( $labelling in $page.getLabellings() )  
#set ( $label = $labelling.getLabel() + "," )  
#if ( $excludedLabelsString.contains($label) )  
#set ( $notContainsExcludedLabel = false )  
#end  
#end  
#end

## get a calendar object and for each page in space set it to last modification date  
#set ($pagedate = $action.dateFormatter.getCalendar())  
$pagedate.setTime($page.getLastModificationDate())

## only display pages last modified before the compare date  
#if ($pagedate.before($compareDate))  
#if ( $notContainsExcludedLabel )  
\<tr\>  
\<td\>#contentLink2($page true false)\</td\>  
\<td\>$action.dateFormatter.format($page.getCreationDate())\</td\>  
\<td\>#usernameLink($page.creatorName)\</td\>  
\<td\>$action.dateFormatter.format($page.getLastModificationDate())\</td\>  
\<td\>#usernameLink($page.lastModifierName)\</td\>  
\</tr\>  
#end  
#end  
#end  
## end looping through pages in the current space

\</table\>


Tags: confluence-server

server