Description
Evernote has a built-in way to hide unused tags, but here's a quick way to permanently remove unused Tags. This script scans every tag in your Evernote account, looking for tags which have no notes associated with them. If you have a large number of tags, it will take several minutes to process the list. When it finds an "empty tag", it copies the tag name to a list -- and deletes the tag for you. When the script has finished, it creates a new note in Evernote with an alphabetically-sorted list of the tags that it deleted. If you'd like to test the script first without deleting the tags, just comment out the "delete tag (name of theTag)" line. You can then review the list in Evernote to confirm that the script is working properly!The Code
(*
Veritrope.com
Evernote Empty Tag Remover
VERSION 1.2
February 9, 2016
// UPDATE NOTICES
** Follow @Veritrope on Twitter and Facebook for Update Notices! **
// SUPPORT VERITROPE!
If this AppleScript was useful to you, please take a second to show your love here:
http://veritrope.com/support
// SCRIPT INFORMATION AND UPDATE PAGE
http://veritrope.com/code/evernote-empty-tag-remover
// REQUIREMENTS
More details on the script information page.
// CHANGELOG
1.2 - ADDITIONS BY BRENDAN MURPHY (@BrendanP_Murphy) Added switch for parent tags, Dialog alert before deletion, Alert if no tags to delete
// TERMS OF USE:
This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.
To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/3.0/ or send a letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
*)
(*
======================================
// USER SWITCHES (YOU CAN CHANGE THESE!)
======================================
*)
-- SET THIS TO "OFF" IF YOU DON'T WANT TO DELETE EMPTY PARENT TAGS
property deleteParentTags_Switch : "OFF"
(*
======================================
// MAIN PROGRAM
======================================
*)
property unusedTags : {}
set unusedTags to {}
tell application "Evernote"
try
--GET LIST OF EVERNOTE TAGS
set theTags to every tag
--DETERMINE EMPTY TAGS
repeat with theTag in theTags
set theNotes to {}
--set theName to """ & name of theTag & """
set theNotes to (find notes "tag:"" & name of theTag & """)
--set theNotes to (find notes "tag:" & theName)
if theNotes is {} then
copy name of theTag to the end of unusedTags
end if
end repeat
end try
--GET LIST OF PARENT TAGS (IF SWITCH IS OFF)
--REMOVES PARENT TAGS FROM "unusedTags" LIST
if deleteParentTags_Switch is "OFF" then
set parentTags to my get_parentTags(theTags)
set deleteTags to {}
repeat with unusedTag in unusedTags
if unusedTag is in parentTags then
else
copy contents of unusedTag to the end of deleteTags
end if
end repeat
set unusedTags to deleteTags
end if
--SORT LIST OF TAGS TO BE DELETED
set sortedTags to my simple_sort(unusedTags)
set oldDelim to AppleScript's text item delimiters
set AppleScript's text item delimiters to return
set sortedList to sortedTags as text
set AppleScript's text item delimiters to oldDelim
--DELETE EMPTY TAGS
try
if unusedTags is {} then
display alert "There are no empty tags to delete" as informational ¬
buttons("OK")
else
set dialogAnswer to display alert "DELETE TAGS CONFIRMATION!!" message "Are you sure you want to delete the following tags?" & return & "You cannot undo this action." & return & return & sortedList buttons {"Yes", "Cancel"} default button "Cancel"
if button returned of dialogAnswer is "Yes" then
repeat with unusedTag in unusedTags
delete tag (unusedTag)
end repeat
set n to create note with text sortedList title "Deleted Tags"
display alert "Tags have been deleted!" as informational ¬
buttons("OK")
else
display alert "Process has been cancelled" as informational buttons {"OK"}
return
end if
end if
end try
end tell
(*
======================================
// EVERNOTE SUBROUTINES
======================================
*)
--GET LIST OF PARENT TAGS
on get_parentTags(theENtags)
local parentTags, theENtags, theENTag, this_error, sortedParents
set parentTags to {}
tell application "Evernote"
try
repeat with theENTag in theENtags
if parent of theENTag exists then
if name of parent of theENTag is in parentTags then
else
copy name of parent of theENTag to the end of parentTags
end if
end if
end repeat
on error error_message number error_number
set this_error to "Error: " & error_number & ". " & error_message as string
end try
end tell
set sortedParents to my simple_sort(parentTags)
set parentTags to sortedParents
return the parentTags
end get_parentTags
--SORT SUBROUTINE
on simple_sort(my_list)
set the index_list to {}
set the sorted_list to {}
repeat (the number of items in my_list) times
set the low_item to ""
repeat with i from 1 to (number of items in my_list)
if i is not in the index_list then
set this_item to item i of my_list as text
if the low_item is "" then
set the low_item to this_item
set the low_item_index to i
else if this_item comes before the low_item then
set the low_item to this_item
set the low_item_index to i
end if
end if
end repeat
set the end of sorted_list to the low_item
set the end of the index_list to the low_item_index
end repeat
return the sorted_list
end simple_sort
Veritrope.com
Evernote Empty Tag Remover
VERSION 1.2
February 9, 2016
// UPDATE NOTICES
** Follow @Veritrope on Twitter and Facebook for Update Notices! **
// SUPPORT VERITROPE!
If this AppleScript was useful to you, please take a second to show your love here:
http://veritrope.com/support
// SCRIPT INFORMATION AND UPDATE PAGE
http://veritrope.com/code/evernote-empty-tag-remover
// REQUIREMENTS
More details on the script information page.
// CHANGELOG
1.2 - ADDITIONS BY BRENDAN MURPHY (@BrendanP_Murphy) Added switch for parent tags, Dialog alert before deletion, Alert if no tags to delete
// TERMS OF USE:
This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.
To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/3.0/ or send a letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
*)
(*
======================================
// USER SWITCHES (YOU CAN CHANGE THESE!)
======================================
*)
-- SET THIS TO "OFF" IF YOU DON'T WANT TO DELETE EMPTY PARENT TAGS
property deleteParentTags_Switch : "OFF"
(*
======================================
// MAIN PROGRAM
======================================
*)
property unusedTags : {}
set unusedTags to {}
tell application "Evernote"
try
--GET LIST OF EVERNOTE TAGS
set theTags to every tag
--DETERMINE EMPTY TAGS
repeat with theTag in theTags
set theNotes to {}
--set theName to """ & name of theTag & """
set theNotes to (find notes "tag:"" & name of theTag & """)
--set theNotes to (find notes "tag:" & theName)
if theNotes is {} then
copy name of theTag to the end of unusedTags
end if
end repeat
end try
--GET LIST OF PARENT TAGS (IF SWITCH IS OFF)
--REMOVES PARENT TAGS FROM "unusedTags" LIST
if deleteParentTags_Switch is "OFF" then
set parentTags to my get_parentTags(theTags)
set deleteTags to {}
repeat with unusedTag in unusedTags
if unusedTag is in parentTags then
else
copy contents of unusedTag to the end of deleteTags
end if
end repeat
set unusedTags to deleteTags
end if
--SORT LIST OF TAGS TO BE DELETED
set sortedTags to my simple_sort(unusedTags)
set oldDelim to AppleScript's text item delimiters
set AppleScript's text item delimiters to return
set sortedList to sortedTags as text
set AppleScript's text item delimiters to oldDelim
--DELETE EMPTY TAGS
try
if unusedTags is {} then
display alert "There are no empty tags to delete" as informational ¬
buttons("OK")
else
set dialogAnswer to display alert "DELETE TAGS CONFIRMATION!!" message "Are you sure you want to delete the following tags?" & return & "You cannot undo this action." & return & return & sortedList buttons {"Yes", "Cancel"} default button "Cancel"
if button returned of dialogAnswer is "Yes" then
repeat with unusedTag in unusedTags
delete tag (unusedTag)
end repeat
set n to create note with text sortedList title "Deleted Tags"
display alert "Tags have been deleted!" as informational ¬
buttons("OK")
else
display alert "Process has been cancelled" as informational buttons {"OK"}
return
end if
end if
end try
end tell
(*
======================================
// EVERNOTE SUBROUTINES
======================================
*)
--GET LIST OF PARENT TAGS
on get_parentTags(theENtags)
local parentTags, theENtags, theENTag, this_error, sortedParents
set parentTags to {}
tell application "Evernote"
try
repeat with theENTag in theENtags
if parent of theENTag exists then
if name of parent of theENTag is in parentTags then
else
copy name of parent of theENTag to the end of parentTags
end if
end if
end repeat
on error error_message number error_number
set this_error to "Error: " & error_number & ". " & error_message as string
end try
end tell
set sortedParents to my simple_sort(parentTags)
set parentTags to sortedParents
return the parentTags
end get_parentTags
--SORT SUBROUTINE
on simple_sort(my_list)
set the index_list to {}
set the sorted_list to {}
repeat (the number of items in my_list) times
set the low_item to ""
repeat with i from 1 to (number of items in my_list)
if i is not in the index_list then
set this_item to item i of my_list as text
if the low_item is "" then
set the low_item to this_item
set the low_item_index to i
else if this_item comes before the low_item then
set the low_item to this_item
set the low_item_index to i
end if
end if
end repeat
set the end of sorted_list to the low_item
set the end of the index_list to the low_item_index
end repeat
return the sorted_list
end simple_sort
worked perfectly
works fine.. very useful..