AppleScript CSV numbering table generator

Found a pretty big bug involving leading zeroes that I just had the chance to encounter which caused the script to silently die when run from the AppleScript menuextra, yet run (incorrectly) from Script Editor. Should be good.
[UPDATE] Changed to manually enter number up, prompt for total number of finished pieces instead of ending number, and prompts to reverse order the numbers in case you have a rip that won’t do it on output (multi copies using “VDP” for me).
An AppleScript to generate a numbering table in comma separated value format. Works great with InDesign's data merge function.

The script will now prompt for leading zeroes. Hopefully the dialog instructions are clear enough. The default is to pad the start number to match the end number.

This started as a simple 1-up script for numbering tickets using a laser printer. This version will handle up to a 5-up layout (labeled piece1, piece2, etc.), but can be easily modified to do more by adding to the “columns_list”.

For usage of InDesign's data merge functions, search for "data merge" in InDesign's help.


on my_trim(text_to_trim)
  set the character_count to the number of characters of the text_to_trim
  set the new_text to (characters 1 thru (the character_count - 1) of the text_to_trim) as string
  return new_text
end my_trim

set columns_n to text returned of (display dialog "How many up will pieces be printed?" default answer "1" with title "N-up")
set columns_text to ""
if columns_n is not false then
  repeat with n from 1 to columns_n
    set columns_text to columns_text & "n" & n & ","
  end repeat
  set columns_text to my_trim(columns_text)
end if

on zero_pad(the_input, the_zeroes)
  set the_input to the_input as string
  set n to count of characters in the_input
  if n < the_zeroes then
    repeat until n = the_zeroes
      set the_input to "0" & the_input
      set n to n + 1
    end repeat
  end if
  return the_input
end zero_pad

on my_sort(the_list, the_columns, the_zeroes)
  set return_this to ""
  set the_columns to the_columns as integer
  set row_jump to (round ((count of the_list) / the_columns) rounding up) as integer
  set row_jump_n to row_jump
  if item 1 of the_list is greater than last item of the_list then
    set row_jump_n to 0 - row_jump
  end if
  repeat with i from 1 to row_jump
    set first_cell to item i of the_list as integer
    set this_row to "" as text
    if the_zeroes is not "0" then
      repeat with c from 1 to the_columns
        set this_row to this_row & zero_pad(first_cell, the_zeroes) & "," as text
        set first_cell to first_cell + row_jump_n
      end repeat
      repeat with c from 1 to the_columns
        set this_row to this_row & first_cell & "," as text
        set first_cell to first_cell + row_jump_n
      end repeat
    end if
    set return_this to return_this & my_trim(this_row) & return
  end repeat
  return return_this
end my_sort

set my_start to text returned of (display dialog "Enter the starting number" default answer "1")
if my_start is not "" then
  set my_end to my_start + (text returned of (display dialog "How many to number (finished pieces)?" & return & return & ¬
    "Note: There will be at least 1 number over to save as future starting reference." default answer "10"))
  set the_zeroes to text returned of (display dialog "Leading zeroes. Enter count you need leading the end number " & ¬
    "(start number will be padded to match)." & return & return & ¬
    "'Fill' = pad to match end number. 001-100" & return & ¬
    "'0' = no leading zeros. 1-100" & return & ¬
    "'1' = 0001-0100" default answer "Fill")
  if the_zeroes is in {"Fill", "fill"} then
    set the_zeroes to (count of characters of (my_end as text))
  else if the_zeroes is "0" then
    set the_zeroes to "0"
    set the_zeroes to (count of characters of (my_end as text)) + the_zeroes
  end if
  set num_list to {}
  repeat with i from my_start to my_end
    set end of num_list to i
  end repeat
  --  log num_list
  set file_name to "numbering_table.csv"
  if button returned of (display dialog "Varible Data Printing (VDP) may not allow for record reversal. Choosing \"Reverse\" will reverse the order of the numbers." & return & return & "NOTE: Due to rounding there may be erroneous numbers on last sheet when reversed. Check your CSV file to be sure they are acceptable (not too many)." buttons {"Cancel", "Reverse", "Forward"} default button "Forward" with title "Sort Order") is "Reverse" then
    --    log "Reversing the numbers."
    set num_list to reverse of num_list
    --    log num_list
    set file_name to "numbering_table_reverse.csv"
  end if
  set num_list to my_sort(num_list, columns_n, the_zeroes)
  set columns_text to columns_text & return & num_list as text
  tell application "Finder"
    set the_file to choose file name with prompt "Save as" default name file_name
    --    (*
    set newFile to (open for access the_file with write permission)
    set eof newFile to 0
    write columns_text to newFile
    close access newFile
    --    do shell script "echo " & quoted form of columns_text & " > " & quoted form of POSIX path of the_file
  end tell
end if

Leave a Reply

Your email address will not be published. Required fields are marked *