0
Search tasks in a workspace
One script reply has been approved by the moderators Verified

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.

Created by hugo697 192 days ago Viewed 5982 times
0
Submitted by hugo697 Typescript (fetch-only)
Verified 192 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