Извлечение определенного идентификатора проекта из Asana Task API через вывод Node.js JSON

Используя Asana Task API, мы можем увидеть список проектов. которому принадлежит задача, а также GID и примечания этих проектов (текст описания).

Желаемый результат

Вся цель здесь состоит в том, чтобы получить GID проекта, у которого есть #websiteprojecttemplate в его значении Notes. Нам нужно найти GID этого проекта, а затем вывести его, чтобы мы могли использовать этот GID позже в наших действиях Zapier.

API задач Асаны

Используя этот URL-адрес API, мы можем увидеть вывод API, который возвращает данные проектов (включая GID и Notes). Я считаю, что это JSON. https://app.asana.com/api/1.0/tasks/{id}?opt_fields=projects.notes

Например: https://app.asana.com/api/1.0/tasks/1799885428032109?opt_fields=projects.notes отображается как:

https://i.imgur.com/zSizMNC.png


Текущий код

В идеале код Javascript Node.js должен был бы выполнять итерацию/искать/находить код с #websiteprojecttemplate, а затем выводить соответствующий GID. В этом случае это будет: 1199916857565229

Это код JS, который у меня есть на данный момент:

const res = await fetch('https://app.asana.com/api/1.0/tasks/' + inputData.uniqueID + '?opt_fields=projects.notes', {
    headers: {
        'Authorization': 'Bearer 0/899removedforsecurity24564s'
    }
});
const body = await res.json();
const projects = body.data;

output = { id: projects };

Что выводит что-то вроде:


  "id" : {
    "gid" : "1199885428032109",
    "projects" : [ {
      "gid" : "810573962916457",
      "notes" : "CRM project to create custom fields for the CRM task"
    }, {
      "gid" : "881219806802782",
      "notes" : "Helps keep PMs aware of what stage of progress the website projects are at; as well as how many projects each PM has (via saved Asana searches)."
    }, {
      "gid" : "1129624391492919",
      "notes" : "Tracks the stage and progress of converting a lead to a client."
    }, {
      "gid" : "1140671985497468",
      "notes" : "Additional CRM project to create more custom fields for the CRM task"
    }, {
      "gid" : "1199916857565229",
      "notes" : "Created from the #websiteprojecttemplate."
    } ]
  }

Но мне нужно, чтобы он выводил не все данные тела, а только значение gid, которое имело #websiteprojecttemplate в своем значении notes.


TL;DR

Как нам обновить текущий код, чтобы он мог перебирать gid и находить тот, который имеет #websiteprojecttemplate в notes, и выводить его число gid?


person Garconis    schedule 12.02.2021    source источник


Ответы (1)


Я думаю, что ваш вопрос сводится к тому, как найти элемент в массиве.

const project = projects.projects.find(p => p.notes.includes("#websiteprojecttemplate"));
if (project) {
  console.log(project.gid);
} else {
  console.log("no matching project");
}
person James    schedule 12.02.2021
comment
Кажется, это работает хорошо. Из любопытства, зачем использовать p вместо project? Просто короче? Что если в выводе API в какой-то момент окажется другой ключ, начинающийся с буквы p? - person Garconis; 12.02.2021
comment
Эта часть p => p.notes.includes("#websiteprojecttemplate") представляет собой функцию, которая принимает параметр p и возвращает значение true/false. Имя параметра может быть любым и не привязано к свойствам в массиве, над которым работает .find. И да, это' - person James; 13.02.2021
comment
Да и короче :) - person James; 13.02.2021