You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:32:32