Backup Current File

Here is another AppleScript version of a prior vba script. This one creates a back of the current workbook. It copies the last saved version of the current workbook to a Backup subdirectory below the directory in which that file was saved. It adds a counter (ie, .001) before the .xls(x) extension.

-- Save a backup of the current file
-- Copyright under GPL by Mark Grimes
-- Saving with '\scs' in the filename creates Shortcut: Crtl+Shift+S

tell application "Microsoft Excel"
  set macPath to get full name of (get properties of active workbook)
  set curPath to my posix_path(macPath)
  set cmdStatus to do shell script ¬
    "perl -MFile::Copy -MFile::Basename -MFile::Spec -e' " & ¬
    "$f=qq{" & curPath & "}; " & ¬
    "$d = File::Spec->catdir(dirname($f),q{Backup});" & ¬
    "mkdir $d unless -d $d;" & ¬
    "$b = File::Spec->catfile($d,basename($f)); " & ¬
    "$i=1;" & ¬
    "do {$s = sprintf( qq{%03d}, $i++); $b=~s/(?:.\\d{3})?.(xlsx?)$/.$s.$1/; }" & ¬
    "  while( -e $b );" & ¬
    "copy $f, $b or die qq{Error copying $f to $b: $!};" & ¬
    "print qq{Backed up last saved version to: $b};" & ¬
    " ' "
  display dialog cmdStatus
end tell

-- From: http://www.macosxhints.com/article.php?story=20011030193449870
-- Thanks!
on posix_path(mac_path)
  set mac_path to (mac_path as text)
  set root to (offset of ":" in mac_path)
  set rootdisk to (characters 1 thru (root - 1) of mac_path)
  tell application "Finder"
    if (disk (rootdisk as string) is the startup disk) then
      set unixpath to "/" & (characters (root + 1) thru end of mac_path)
    else
      set unixpath to "/Volumes:" & mac_path
    end if
  end tell
  set chars to every character of unixpath
  repeat with i from 2 to length of chars
    if item i of chars as text is equal to "/" then
      set item i of chars to ":"
    else if item i of chars as text is equal to ":" then
      set item i of chars to "/"
    else if item i of chars as text is equal to "'" then
      set item i of chars to "\\'"
    else if item i of chars as text is equal to "\"" then
      set item i of chars to "\\" & "\""
    else if item i of chars as text is equal to "*" then
      set item i of chars to "\\*"
    else if item i of chars as text is equal to "?" then
      set item i of chars to "\\?"
    else if item i of chars as text is equal to " " then
      set item i of chars to "\\ "
    else if item i of chars as text is equal to "\\" then
      set item i of chars to "\\\\"
    end if
  end repeat
  return every item of chars as string
end posix_path

Published

March 01, 2010 12:09PM

License

The contents of this blog are licensed under the Creative Commons “Attribution-Noncommercial-Share Alike 3.0″ license.