#!/usr/bin/ruby #Script by weheartcode.com, modify however you like. #WARNING THIS SCRIPT CAN HOSE YOUR BASECAMP ACCOUNT #Don't be stupid, try it on a test account first require 'basecamp' #Fill in these variables, PLEASE TRY ON TEST ACCOUNT FIRST basecampurl = 'YOURBASECAMPURL' #Ex. weheartcode.grouphub.com basecampuser = 'CHANGEME' basecamppass = 'CHANGEME' msprojcsvfile = 'CHANGEME' #Ex. export.csv #Connect to basecamp using the Basecamp API Ruby Wrapper session = Basecamp.new(basecampurl,basecampuser,basecamppass) #Assume we're working on the first project project = session.projects.first milestones = Array.new puts "Creating data structure..." #Read our file line by line open(msprojcsvfile){|f| f.each_line {|line| data = line.split(',') milestone = Hash.new ismile = data[2] #if we just hit a milestone, create one and add it to our Array if 'Yes' == ismile.strip #reconbobulate date for deadline #Expecting Day dd/mm/yyyy format (ex. Tues 12/25/2006) m1 = /.+\s(\d+?)\/(\d+?)\/(\d+)/.match(data[1].strip) deadline = "20" + m1[3] + "-" + m1[1] + "-" + m1[2] milestone["title"] = data[0] milestone["deadline"] = deadline milestone["thelist"] = Array.new milestones << milestone #otherwise, we just have a normal task else #Add task to current milestone list array milestones.last["thelist"] << data[0] end } } #Reverse our milestone list, so that the to-do's show up oldest first milestones.reverse #Let's go through each milestone and add to basecamp milestones.each{ |m| #Get a copy of our todo list tasklist = m['thelist'] #Nil out key so we dont send to basecamp API m['thelist'] = nil #Create a milestone with our project id #Uaing the data from our milestone hash session.create_milestone(project.id,m) puts "Milestone created." #Grab an instance of the milestone we just created themile = session.milestones(project.id).last #create a to-do list for milestone tmplist = Hash.new tmplist["tracked"] = false; #Use milestone title prefixed with M-LISt for list title tmplist["name"] = "M-LIST: " + m['title'] tmplist["description"] = "Task list for milestone." tmplist["milestone-id"] = themile.id #Create the list with Basecamp API session.create_list(project.id,tmplist) puts "Milestone list created." thelist = session.lists(project.id,true).last #Create items underneath our list tasklist.each{|task| session.create_item(thelist.id,task)} } puts "All done!"