0

我正在尝试更新 Asana 列表中自定义字段的值。我正在使用Asana API v1 的官方 Python 客户端库

我的代码目前看起来像这样;

project = "Example Project"
keyword = "Example Task"

print "Logging into ASANA"
api_key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
client = asana.Client.basic_auth(api_key)
me = client.users.me()
all_projects = next(workspace for workspace in me['workspaces'])
projects = client.projects.find_by_workspace(all_projects['id'])

for project in projects:
    if 'Example Project' not in project['name']:
        continue
    print "Project found."
    print "\t"+project['name']
    print

    tasks = client.tasks.find_by_project(project['id'], {"opt_fields":"this.name,custom_fields"}, iterator_type=None)

    for task in tasks:
        if keyword in task['name']:
            print "Task found:"
            print "\t"+str(task)
            print
            for custom_field in task['custom_fields']:
                custom_field['text_value'] = "New Data!"
            print client.tasks.update(task['id'], {'data':task})

但是当我运行代码时,任务不会更新。print client.tasks.update 的返回返回了任务的所有细节,但是自定义字段没有更新。

4

2 回答 2

1

我认为问题在于我们的 API 在自定义字段方面是不对称的……我觉得这很糟糕;在这种情况下,这可能是一个真正的问题。不能像上面那样在值块中设置自定义字段的值,这很直观,您必须使用类似于 key:value 字典的设置来设置它们custom_field_id:new_value- 不幸的是,它不那么直观。所以上面,你有

for custom_field in task['custom_fields']:
  custom_field['text_value'] = "New Data!"

我认为你必须做这样的事情:

new_custom_fields = {}
for custom_field in task['custom_fields']:
  new_custom_fields[custom_field['id']] = "New Data!"
task['custom_fields'] = new_custom_fields

目标是为看起来像这样的 POST 请求生成 JSON

{
  "data": {
    "custom_fields":{
      "12345678":"New Data!"
    }
  }
}

进一步说明,如果您有文本自定义字段,则该值应该是新的文本字符串,如果是数字自定义字段,则应该是数字,以及选择的 ID (请查看我们文档中此标题enum_options下的第三个示例site) 如果它是一个枚举自定义字段。

于 2016-12-21T20:24:47.790 回答
0

感谢马特,我得到了解决方案。

new_custom_fields = {}
for custom_field in task['custom_fields']:
  new_custom_fields[custom_field['id']] = "New Data!"

print client.tasks.update(task['id'], {'custom_fields':new_custom_fields})

我的原始代码中有两个问题,第一个是我试图对称地处理 API,这是由 Matt 发现并解决的。第二个是我试图以不正确的格式更新。请注意我的原始代码和更新代码中的 client.tasks.update 之间的区别。

于 2016-12-22T21:06:05.307 回答