Copy/Move project to a new workspace in Asana
function asanaRequest($methodPath, $httpMethod = 'GET', $body = null) | |
{ | |
$apiKey = 'ASANA_API_KEY_HERE'; /// Get it from http://app.asana.com/-/account_api | |
$url = "https://app.asana.com/api/1.0/$methodPath"; | |
$ch = curl_init(); | |
curl_setopt($ch, CURLOPT_URL, $url); | |
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC ) ; | |
curl_setopt($ch, CURLOPT_USERPWD, $apiKey); | |
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); | |
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $httpMethod); | |
if ($body) | |
{ | |
if (!is_string($body)) | |
{ | |
$body = json_encode($body); | |
} | |
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); | |
curl_setopt($ch, CURLOPT_POSTFIELDS, $body); | |
} | |
$data = curl_exec($ch); | |
curl_close($ch); | |
$result = json_decode($data, true); | |
return $result; | |
} | |
function createTask($workspaceId, $projectId, $task) | |
{ | |
$data = array('data' => $task); | |
$result = asanaRequest("workspaces/$workspaceId/tasks", 'POST', $data); | |
if ($result['data']) | |
{ | |
$newTask = $result['data']; | |
$newTaskId = $newTask['id']; | |
$data = array('data' => array('project' => $projectId)); | |
$result = asanaRequest("tasks/$newTaskId/addProject", 'POST', $data); | |
return $newTask; | |
} | |
return $result; | |
} | |
function copyTasks($fromProjectId, $toProjectId) | |
{ | |
$result = asanaRequest("projects/$toProjectId"); | |
if (!$result['data']) | |
{ | |
return; | |
} | |
$workspaceId = $result['data']['workspace']['id']; | |
$result = asanaRequest("projects/$fromProjectId/tasks?opt_pretty&opt_fields=name,due_on,assignee_status,notes,assignee"); | |
$tasks = $result['data']; | |
for ($i = count($tasks) - 1; $i >= 0; $i--) | |
{ | |
$task = $tasks[$i]; | |
$newTask = $task; | |
unset($newTask['id']); | |
$newTask['assignee'] = $newTask['assignee']['id']; | |
foreach ($newTask as $key => $value) | |
{ | |
if (empty($value)) | |
{ | |
unset($newTask[$key]); | |
} | |
} | |
$newTask = createTask($workspaceId, $toProjectId, $newTask); | |
if ($newTask['id']) | |
{ | |
$taskId = $task['id']; | |
$result = asanaRequest("tasks/$taskId/stories"); | |
$comments = array(); | |
foreach ($result['data'] as $story) | |
{ | |
$date = date('l M d, Y h:i A', strtotime($story['created_at'])); | |
$comment = " \n" . $story['created_by']['name'] . ' on ' . $date . ":\n" . $story['text']; | |
$comments[] = $comment; | |
} | |
$comment = implode("\n----------------------", $comments); | |
$data = array('data' => array('text' => $comment)); | |
$newTaskId = $newTask['id']; | |
$result = asanaRequest("tasks/$newTaskId/stories", 'POST', $data); | |
} | |
} | |
} | |
/// Sample usage | |
copyTasks(12345678910, 98765432110); /// Get those numbers from the URL of the project |
This comment has been minimized.
This comment has been minimized.
So good - thank you! Would love to see it handle attachments. |
This comment has been minimized.
This comment has been minimized.
Totally needed this! Thanks! Support for labels would also be nice. |
This comment has been minimized.
This comment has been minimized.
How to move to a different workspace? Can you post a sample use? Thanks! |
This comment has been minimized.
This comment has been minimized.
Can you update this to use a personal token? ... as the API key will be deprecated |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This comment has been minimized.
Thank you, worked great!