0

Create Subtask

by
Published Oct 31, 2023

Create a subtask under an existing task. Subtasks are not added to the parent's projects unless `projects` is set. Dates: `due_on`/`start_on` as YYYY-MM-DD, or `due_at` as an ISO 8601 date-time.

Script asana Verified

The script

Submitted by hugo989 Typescript (fetch-only)
Verified 2 hours ago
1
//native
2

3
/**
4
 * Create Subtask
5
 * Create a subtask under an existing task. Subtasks are not added to the parent's projects unless `projects` is set. Dates: `due_on`/`start_on` as YYYY-MM-DD, or `due_at` as an ISO 8601 date-time.
6
 */
7
export async function main(
8
  auth: RT.Asana,
9
  task_gid: string,
10
  name: string,
11
  notes: string | undefined,
12
  html_notes: string | undefined,
13
  assignee: string | undefined,
14
  due_on: string | undefined,
15
  due_at: string | undefined,
16
  start_on: string | undefined,
17
  projects: string[] | undefined,
18
  tags: string[] | undefined,
19
  followers: string[] | undefined,
20
  completed: boolean | undefined,
21
  custom_fields: { [key: string]: any } | undefined
22
) {
23
  const data = {
24
    name,
25
    notes: notes || undefined,
26
    html_notes: html_notes || undefined,
27
    assignee: assignee || undefined,
28
    due_on: due_on || undefined,
29
    due_at: due_at || undefined,
30
    start_on: start_on || undefined,
31
    projects: projects?.length ? projects : undefined,
32
    tags: tags?.length ? tags : undefined,
33
    followers: followers?.length ? followers : undefined,
34
    completed: completed || undefined,
35
    custom_fields:
36
      custom_fields && Object.keys(custom_fields).length
37
        ? custom_fields
38
        : undefined,
39
  }
40

41
  const response = await fetch(
42
    `https://app.asana.com/api/1.0/tasks/${task_gid}/subtasks`,
43
    {
44
      method: "POST",
45
      headers: {
46
        Authorization: `Bearer ${auth.token}`,
47
        "Content-Type": "application/json",
48
        Accept: "application/json",
49
      },
50
      body: JSON.stringify({ data }),
51
    }
52
  )
53

54
  if (!response.ok) {
55
    throw new Error(`${response.status} ${await response.text()}`)
56
  }
57

58
  return await response.json()
59
}
60

Other submissions
  • Submitted by hugo697 Typescript (fetch-only)
    Created 528 days ago
    1
    type Asana = {
    2
      token: string;
    3
    };
    4
    /**
    5
     * Create a subtask
    6
     * Creates a new subtask and adds it to the parent task. Returns the full record for the newly created subtask.
    7
     */
    8
    export async function main(
    9
      auth: Asana,
    10
      task_gid: string,
    11
      opt_pretty: string | undefined,
    12
      opt_fields: string | undefined,
    13
      body: {
    14
        data?: (({ gid?: string; resource_type?: string; [k: string]: unknown } & {
    15
          name?: string;
    16
          resource_subtype?: "default_task" | "milestone" | "section" | "approval";
    17
          [k: string]: unknown;
    18
        }) & {
    19
          actual_time_minutes?: number;
    20
          approval_status?:
    21
            | "pending"
    22
            | "approved"
    23
            | "rejected"
    24
            | "changes_requested";
    25
          assignee_status?: "today" | "upcoming" | "later" | "new" | "inbox";
    26
          completed?: boolean;
    27
          completed_at?: string;
    28
          completed_by?: {
    29
            gid?: string;
    30
            resource_type?: string;
    31
            [k: string]: unknown;
    32
          } & { name?: string; [k: string]: unknown };
    33
          created_at?: string;
    34
          dependencies?: {
    35
            gid?: string;
    36
            resource_type?: string;
    37
            [k: string]: unknown;
    38
          }[];
    39
          dependents?: {
    40
            gid?: string;
    41
            resource_type?: string;
    42
            [k: string]: unknown;
    43
          }[];
    44
          due_at?: string;
    45
          due_on?: string;
    46
          external?: { data?: string; gid?: string; [k: string]: unknown };
    47
          hearted?: boolean;
    48
          hearts?: {
    49
            gid?: string;
    50
            user?: {
    51
              gid?: string;
    52
              resource_type?: string;
    53
              [k: string]: unknown;
    54
            } & { name?: string; [k: string]: unknown };
    55
            [k: string]: unknown;
    56
          }[];
    57
          html_notes?: string;
    58
          is_rendered_as_separator?: boolean;
    59
          liked?: boolean;
    60
          likes?: {
    61
            gid?: string;
    62
            user?: {
    63
              gid?: string;
    64
              resource_type?: string;
    65
              [k: string]: unknown;
    66
            } & { name?: string; [k: string]: unknown };
    67
            [k: string]: unknown;
    68
          }[];
    69
          memberships?: {
    70
            project?: {
    71
              gid?: string;
    72
              resource_type?: string;
    73
              [k: string]: unknown;
    74
            } & { name?: string; [k: string]: unknown };
    75
            section?: {
    76
              gid?: string;
    77
              resource_type?: string;
    78
              [k: string]: unknown;
    79
            } & { name?: string; [k: string]: unknown };
    80
            [k: string]: unknown;
    81
          }[];
    82
          modified_at?: string;
    83
          name?: string;
    84
          notes?: string;
    85
          num_hearts?: number;
    86
          num_likes?: number;
    87
          num_subtasks?: number;
    88
          start_at?: string;
    89
          start_on?: string;
    90
          [k: string]: unknown;
    91
        }) & {
    92
          assignee?: string;
    93
          assignee_section?: string;
    94
          custom_fields?: { [k: string]: string };
    95
          followers?: string[];
    96
          parent?: string;
    97
          projects?: string[];
    98
          tags?: string[];
    99
          workspace?: string;
    100
          [k: string]: unknown;
    101
        };
    102
        [k: string]: unknown;
    103
      }
    104
    ) {
    105
      const url = new URL(
    106
        `https://app.asana.com/api/1.0/tasks/${task_gid}/subtasks`
    107
      );
    108
      for (const [k, v] of [
    109
        ["opt_pretty", opt_pretty],
    110
        ["opt_fields", opt_fields],
    111
      ]) {
    112
        if (v !== undefined && v !== "") {
    113
          url.searchParams.append(k, v);
    114
        }
    115
      }
    116
      const response = await fetch(url, {
    117
        method: "POST",
    118
        headers: {
    119
          "Content-Type": "application/json",
    120
          Authorization: "Bearer " + auth.token,
    121
        },
    122
        body: JSON.stringify(body),
    123
      });
    124
      if (!response.ok) {
    125
        const text = await response.text();
    126
        throw new Error(`${response.status} ${text}`);
    127
      }
    128
      return await response.json();
    129
    }
    130