如何使用Google Apps Script与个人访问令牌从Asana检索(非创建)任务
我来帮你搞定用Google Apps Script从Asana拉取任务的需求,结合你给出的API参数,这里有个完整可运行的示例代码,还有关键步骤的说明:
Google Apps Script 调用Asana API拉取任务示例
准备工作
- 确保你已经生成了Asana的个人访问令牌(在Asana账户设置的开发者选项里创建)
- 把代码里的参数(assignee ID、workspace ID、令牌)替换成你的实际值
基础拉取代码(单页数据)
function fetchAsanaTasks() { // 替换成你的Asana个人访问令牌 const ASANA_TOKEN = '你的个人访问令牌'; // 你的API筛选参数,和你构造的URL参数完全对应 const apiParams = { opt_fields: 'name,assignee_status', assignee: '987654321987654', completed_since: '2018-02-22', limit: 100, workspace: '456789123456' }; // 自动构造完整API URL,避免手动拼接出错 const baseUrl = 'https://app.asana.com/api/1.0/tasks'; const queryString = Object.keys(apiParams) .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(apiParams[key])}`) .join('&'); const fullUrl = `${baseUrl}?${queryString}`; // 请求头配置,核心是Asana的授权令牌 const options = { headers: { 'Authorization': `Bearer ${ASANA_TOKEN}`, 'Content-Type': 'application/json' }, muteHttpExceptions: true // 开启后能捕获非200状态的响应,方便调试 }; try { // 发送GET请求 const response = UrlFetchApp.fetch(fullUrl, options); const responseCode = response.getResponseCode(); if (responseCode === 200) { // 解析Asana返回的JSON数据 const data = JSON.parse(response.getContentText()); const tasks = data.data; // 这里可以根据需求处理任务数据,比如打印日志或写入Google表格 console.log('拉取到的任务数量:', tasks.length); tasks.forEach(task => { console.log(`任务名称: ${task.name}, 处理状态: ${task.assignee_status}`); }); return tasks; // 返回任务数据供后续使用 } else { // 处理API返回的错误信息 const errorData = JSON.parse(response.getContentText()); console.error('请求失败,状态码:', responseCode, '错误详情:', errorData.errors); throw new Error(`Asana API请求失败: ${errorData.errors[0].message}`); } } catch (e) { console.error('脚本执行出错:', e.message); throw e; } }
扩展:分页拉取全部任务(超过100条时)
如果符合条件的任务超过100条,Asana会返回分页标记,你可以用下面的代码自动拉取所有页面的数据:
function fetchAllAsanaTasks() { const ASANA_TOKEN = '你的个人访问令牌'; const apiParams = { opt_fields: 'name,assignee_status', assignee: '987654321987654', completed_since: '2018-02-22', limit: 100, workspace: '456789123456' }; let fullUrl = 'https://app.asana.com/api/1.0/tasks?' + Object.keys(apiParams) .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(apiParams[key])}`) .join('&'); const allTasks = []; const options = { headers: { 'Authorization': `Bearer ${ASANA_TOKEN}` }, muteHttpExceptions: true }; // 循环请求直到没有下一页 do { const response = UrlFetchApp.fetch(fullUrl, options); const data = JSON.parse(response.getContentText()); if (response.getResponseCode() !== 200) { console.error('分页请求失败:', data.errors); break; } allTasks.push(...data.data); // 获取下一页的URL,没有的话就终止循环 fullUrl = data.next_page?.url || null; } while (fullUrl); console.log('总共拉取到任务数量:', allTasks.length); return allTasks; }
关键注意点
- 授权验证:必须在请求头里带上
Authorization: Bearer 你的令牌,这是Asana API唯一的身份验证方式(个人令牌模式) - 参数编码:用
encodeURIComponent处理参数,避免特殊字符导致的URL解析错误 - 错误调试:开启
muteHttpExceptions后,可以查看非200状态的响应内容,常见错误包括令牌无效、权限不足、参数格式错误等
内容的提问来源于stack exchange,提问作者Brandon
相关产品推荐
相关产品推荐

