0

Search Tasks in Workspace

by
Published Oct 31, 2023

Advanced task search across a workspace (Asana premium plans only; free workspaces get 402 Payment Required). Id filters take comma-separated gids. `filters` adds any other search parameter as-is, e.g. {"custom_fields.123.value": "456", "is_subtask": false}. Results are not paginated: to page, sort by created_at and pass the last task's created_at as "created_at.before" in `filters`.

Script asana Verified

The script

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

3
export type DynSelect_workspace = string
4

5
// Resolver: the workspaces and organizations the token can access.
6
export async function workspace(auth: RT.Asana) {
7
  const response = await fetch(
8
    "https://app.asana.com/api/1.0/workspaces?limit=100",
9
    {
10
      headers: {
11
        Authorization: `Bearer ${auth.token}`,
12
        Accept: "application/json",
13
      },
14
    }
15
  )
16
  if (!response.ok) {
17
    throw new Error(`${response.status} ${await response.text()}`)
18
  }
19
  const { data } = await response.json()
20
  return data.map((w: { gid: string; name: string }) => ({
21
    value: w.gid,
22
    label: w.name,
23
  }))
24
}
25

26
/**
27
 * Search Tasks in Workspace
28
 * Advanced task search across a workspace (Asana premium plans only; free workspaces get 402 Payment Required). Id filters take comma-separated gids. `filters` adds any other search parameter as-is, e.g. {"custom_fields.123.value": "456", "is_subtask": false}. Results are not paginated: to page, sort by created_at and pass the last task's created_at as "created_at.before" in `filters`.
29
 */
30
export async function main(
31
  auth: RT.Asana,
32
  workspace: DynSelect_workspace,
33
  text: string | undefined,
34
  assignee_any: string | undefined,
35
  projects_any: string | undefined,
36
  sections_any: string | undefined,
37
  tags_any: string | undefined,
38
  completed: "any" | "complete" | "incomplete" | undefined,
39
  due_on_after: string | undefined,
40
  due_on_before: string | undefined,
41
  modified_at_after: string | undefined,
42
  sort_by:
43
    | "modified_at"
44
    | "created_at"
45
    | "due_date"
46
    | "completed_at"
47
    | "likes"
48
    | undefined,
49
  sort_ascending: boolean | undefined,
50
  opt_fields: string | undefined,
51
  limit: number | undefined,
52
  filters: { [key: string]: any } | undefined
53
) {
54
  const url = new URL(
55
    `https://app.asana.com/api/1.0/workspaces/${workspace}/tasks/search`
56
  )
57
  const params = {
58
    text,
59
    "assignee.any": assignee_any,
60
    "projects.any": projects_any,
61
    "sections.any": sections_any,
62
    "tags.any": tags_any,
63
    completed:
64
      completed === "complete"
65
        ? true
66
        : completed === "incomplete"
67
          ? false
68
          : undefined,
69
    "due_on.after": due_on_after,
70
    "due_on.before": due_on_before,
71
    "modified_at.after": modified_at_after,
72
    sort_by,
73
    sort_ascending: sort_ascending || undefined,
74
    opt_fields,
75
    limit: limit ?? 100,
76
    ...filters,
77
  }
78
  for (const [key, value] of Object.entries(params)) {
79
    if (value != null && value !== "") {
80
      url.searchParams.append(key, String(value))
81
    }
82
  }
83

84
  const response = await fetch(url, {
85
    headers: {
86
      Authorization: `Bearer ${auth.token}`,
87
      Accept: "application/json",
88
    },
89
  })
90

91
  if (!response.ok) {
92
    throw new Error(`${response.status} ${await response.text()}`)
93
  }
94

95
  return await response.json()
96
}
97

Other submissions
  • Submitted by hugo697 Typescript (fetch-only)
    Created 528 days ago
    1
    type Asana = {
    2
      token: string;
    3
    };
    4
    /**
    5
     * Search tasks in a workspace
    6
     * To mirror the functionality of the Asana web app's advanced search feature, the Asana API has a task search endpoint that allows you to build complex filters to find and retrieve the exact data you need.
    7
     */
    8
    export async function main(
    9
      auth: Asana,
    10
      workspace_gid: string,
    11
      opt_pretty: string | undefined,
    12
      opt_fields: string | undefined,
    13
      text: string | undefined,
    14
      resource_subtype: "default_task" | "milestone" | undefined,
    15
      assignee_any: string | undefined,
    16
      assignee_not: string | undefined,
    17
      portfolios_any: string | undefined,
    18
      projects_any: string | undefined,
    19
      projects_not: string | undefined,
    20
      projects_all: string | undefined,
    21
      sections_any: string | undefined,
    22
      sections_not: string | undefined,
    23
      sections_all: string | undefined,
    24
      tags_any: string | undefined,
    25
      tags_not: string | undefined,
    26
      tags_all: string | undefined,
    27
      teams_any: string | undefined,
    28
      followers_not: string | undefined,
    29
      created_by_any: string | undefined,
    30
      created_by_not: string | undefined,
    31
      assigned_by_any: string | undefined,
    32
      assigned_by_not: string | undefined,
    33
      liked_by_not: string | undefined,
    34
      commented_on_by_not: string | undefined,
    35
      due_on_before: string | undefined,
    36
      due_on_after: string | undefined,
    37
      due_on: string | undefined,
    38
      due_at_before: string | undefined,
    39
      due_at_after: string | undefined,
    40
      start_on_before: string | undefined,
    41
      start_on_after: string | undefined,
    42
      start_on: string | undefined,
    43
      created_on_before: string | undefined,
    44
      created_on_after: string | undefined,
    45
      created_on: string | undefined,
    46
      created_at_before: string | undefined,
    47
      created_at_after: string | undefined,
    48
      completed_on_before: string | undefined,
    49
      completed_on_after: string | undefined,
    50
      completed_on: string | undefined,
    51
      completed_at_before: string | undefined,
    52
      completed_at_after: string | undefined,
    53
      modified_on_before: string | undefined,
    54
      modified_on_after: string | undefined,
    55
      modified_on: string | undefined,
    56
      modified_at_before: string | undefined,
    57
      modified_at_after: string | undefined,
    58
      is_blocking: string | undefined,
    59
      is_blocked: string | undefined,
    60
      has_attachment: string | undefined,
    61
      completed: string | undefined,
    62
      is_subtask: string | undefined,
    63
      sort_by:
    64
        | "due_date"
    65
        | "created_at"
    66
        | "completed_at"
    67
        | "likes"
    68
        | "modified_at"
    69
        | undefined,
    70
      sort_ascending: string | undefined
    71
    ) {
    72
      const url = new URL(
    73
        `https://app.asana.com/api/1.0/workspaces/${workspace_gid}/tasks/search`
    74
      );
    75
      for (const [k, v] of [
    76
        ["opt_pretty", opt_pretty],
    77
        ["opt_fields", opt_fields],
    78
        ["text", text],
    79
        ["resource_subtype", resource_subtype],
    80
        ["assignee.any", assignee_any],
    81
        ["assignee.not", assignee_not],
    82
        ["portfolios.any", portfolios_any],
    83
        ["projects.any", projects_any],
    84
        ["projects.not", projects_not],
    85
        ["projects.all", projects_all],
    86
        ["sections.any", sections_any],
    87
        ["sections.not", sections_not],
    88
        ["sections.all", sections_all],
    89
        ["tags.any", tags_any],
    90
        ["tags.not", tags_not],
    91
        ["tags.all", tags_all],
    92
        ["teams.any", teams_any],
    93
        ["followers.not", followers_not],
    94
        ["created_by.any", created_by_any],
    95
        ["created_by.not", created_by_not],
    96
        ["assigned_by.any", assigned_by_any],
    97
        ["assigned_by.not", assigned_by_not],
    98
        ["liked_by.not", liked_by_not],
    99
        ["commented_on_by.not", commented_on_by_not],
    100
        ["due_on.before", due_on_before],
    101
        ["due_on.after", due_on_after],
    102
        ["due_on", due_on],
    103
        ["due_at.before", due_at_before],
    104
        ["due_at.after", due_at_after],
    105
        ["start_on.before", start_on_before],
    106
        ["start_on.after", start_on_after],
    107
        ["start_on", start_on],
    108
        ["created_on.before", created_on_before],
    109
        ["created_on.after", created_on_after],
    110
        ["created_on", created_on],
    111
        ["created_at.before", created_at_before],
    112
        ["created_at.after", created_at_after],
    113
        ["completed_on.before", completed_on_before],
    114
        ["completed_on.after", completed_on_after],
    115
        ["completed_on", completed_on],
    116
        ["completed_at.before", completed_at_before],
    117
        ["completed_at.after", completed_at_after],
    118
        ["modified_on.before", modified_on_before],
    119
        ["modified_on.after", modified_on_after],
    120
        ["modified_on", modified_on],
    121
        ["modified_at.before", modified_at_before],
    122
        ["modified_at.after", modified_at_after],
    123
        ["is_blocking", is_blocking],
    124
        ["is_blocked", is_blocked],
    125
        ["has_attachment", has_attachment],
    126
        ["completed", completed],
    127
        ["is_subtask", is_subtask],
    128
        ["sort_by", sort_by],
    129
        ["sort_ascending", sort_ascending],
    130
      ]) {
    131
        if (v !== undefined && v !== "") {
    132
          url.searchParams.append(k, v);
    133
        }
    134
      }
    135
      const response = await fetch(url, {
    136
        method: "GET",
    137
        headers: {
    138
          Authorization: "Bearer " + auth.token,
    139
        },
    140
        body: undefined,
    141
      });
    142
      if (!response.ok) {
    143
        const text = await response.text();
    144
        throw new Error(`${response.status} ${text}`);
    145
      }
    146
      return await response.json();
    147
    }
    148