Est-il possible de lister toutes les activités pour une plage de dates donnée à Trello?


11

J'utilise Trello depuis plusieurs mois et je publie régulièrement des activités sur des cartes pendant que je travaille dessus, puis je les déplace de gauche à droite dans la liste «Complète». Je ne profite pas des dates d'échéance. Existe-t-il un mécanisme pour répertorier le texte d'activité sur toutes les cartes pour une plage donnée. J'essaie d'extraire des données brutes pour alimenter un rapport d'état pour une période donnée.

Exemple: Si le jour actuel est le 15 mai 2013. Je veux produire une liste de tous les textes d'activité sur chaque carte qui avait des entrées «activité» pour la période du 29 avril au 3 mai.


Cela peut être fait, mais uniquement en utilisant l'API Trello. Êtes-vous à l'aise de faire une programmation légère pour obtenir les données que vous souhaitez?
Ian Henry

@IanHenry Oui, je suis à l'aise.
Brian

Réponses:


14

Oui, en utilisant l'API Trello et quelques autres outils.

Cette réponse repose sur HTTPie et jq , deux outils disponibles gratuitement qui peuvent être installés via pip et Homebrew si vous utilisez un Mac:

$ pip install httpie
$ brew install jq

En utilisant, HTTPienous pouvons interroger l'API Trello pour obtenir le flux d'action brut pour un tableau, puis nous pouvons utiliser jqpour transformer ces données en quelque chose d'utile.

Commençons par quelque chose de "simple". La commande suivante nous donnera tous les commentaires faits sur la carte Trello Dev au mois d'avril 2013. Je vais l'expliquer dans une seconde:

http GET "https://api.trello.com/1/boards/4d5ea62fd76aa1136000000c/actions" "since==Apr 1 2013 EDT" "before==May 1 2013 EDT" "limit==1000" "filter==commentCard" |  jq 'group_by(.data.card.id) | map({key: (.[0].data.card | "\(.name) (\(.id))"), value: map({date, member: .memberCreator.fullName, comment: .data.text}) }) | from_entries'

Si tout se passait comme prévu, nous devrions voir quelque chose comme ceci:

{
  "Embed All The Things (516fcff9b998572923008fb2)": [
    {
      "comment": "Embed.ly now supports https better, so maybe we can upgrade to that version. http://embed.ly/embed/security/ssl",
      "member": "Brett Kiefer",
      "date": "2013-04-26T16:15:21.408Z"
    },
    {
      "comment": "Embedding a Google Map would be nice.",
      "member": "Michael Warkentin",
      "date": "2013-04-24T18:39:12.155Z"
    },
    {
      "comment": "Github issues / pull requests",
      "member": "Michael Warkentin",
      ...

Cool. C'est un objet JSON unique et raisonnable que nous pouvons facilement analyser dans un certain nombre d'autres formats. Passons maintenant en revue afin que nous puissions le comprendre suffisamment pour le modifier en fonction de nos besoins.

http GET "https://api.trello.com/1/boards/4d5ea62fd76aa1136000000c/actions" "since==Apr 1 2013 EDT" "before==May 1 2013 EDT" "limit==1000" "filter==commentCard"

C'est la seule partie qui dépend de Trello. Nous faisons une demande contre l'API publique pour la carte avec id 4d5ea62fd76aa1136000000c- je l'ai obtenu en allant sur https://trello.com/dev et en regardant l'id que Trello ajoute à l'URL complète ( https://trello.com/board/trello-development/4d5ea62fd76aa1136000000c).

Les champs sinceet beforesont explicites. Je précise un limitde 1000parce que c'est la plus grande réponse Trello permettra. Si votre forum a plus de mille commentaires dans la plage de dates pertinente, une solution de pagination plus compliquée serait requise ici. Je précise un filterde commentCardparce que je suis seulement intéressé ceux aux fins de cette réponse. Si vous voulez plus de types d'actions, spécifiez une liste séparée par des virgules comme filter==commentCard,updateCard:idList,createCard. Les types d'actions valides peuvent être trouvés dans la référence de l'API Trello .

Si nous gérons cela seul, nous aurons beaucoup d'informations qui sont relativement difficiles à comprendre. Nous l'avons donc canalisé jqpour le masser en quelque chose d'un peu plus utile.

jq 'group_by(.data.card.id) | map({key: (.[0].data.card | "\(.name) (\(.id))"), value: map({date, member: .memberCreator.fullName, comment: .data.text}) }) | from_entries'

Morceau par morceau, notre jqscript effectue les transformations suivantes, chacune transmettant son résultat à l'opérateur suivant:

  • group_by(.data.card.id)
    • Trello nous donne juste un éventail d'actions. Nous transformons cela en un tableau de tableaux, où chaque sous-tableau ne contient que des actions pour une carte donnée. Fondamentalement[[card1_action1, card1_action2...], [card2_action1, card2_action2...], ...]
  • map({key: KEY_EXPRESSION, value: VALUE_EXPRESSION}) | from_entries
    • Nous ne voulons pas d'un tableau de tableaux; nous voulons juste un objet de la forme { card1: [action1, action2, ...], card2: [action1, action2, ...], ...}. En transformant le tableau en un tableau de paires clé-valeur, nous pouvons utiliser from_entriespour transformer cela en un objet. Cool.
  • Voyons maintenant ce que j'ai appelé KEY_EXPRESSIONci-dessus:(.[0].data.card | "\(.name) (\(.id))")
    • C'est assez simple. Nous prenons l'entrée de la carte de la première action (car elle devrait être la même pour toutes les actions, nous aurions pu en choisir une, mais la première semble être le bon choix). Ensuite, nous utilisons l'interpolation de chaîne ( \(...)) pour construire quelque chose qui ressemble "name (id)".
  • VALUE_EXPRESSION est map({date, member: .memberCreator.fullName, comment: .data.text})
    • Nous aurions pu simplement utiliser .pour obtenir le tableau de toutes les actions inchangées. Mais comme les actions sont un peu laides, nous les massons en quelque chose d'utile en mapenvoyant une requête ping au tableau et en l'appliquant {date, member: .memberCreator.fullName, comment: .data.text}à chaque objet d'action individuel.
      • {date}est le même que {date: date}pour jq.
      • Tout le reste est assez explicite. Nous avons maintenant la date, le membre (juste son nom, mais il serait facile d'en obtenir plus) et le texte du commentaire.

Alors voilà. Euh, j'espère. Nous aurions pu faire ce massage de données dans n'importe quel langage de script, mais c'est exactement pour cela que jqc'est conçu, c'est donc une bonne excuse pour apprendre un nouvel outil sympa. Consultez le manuel jq pour en savoir plus.

Maintenant, cela fonctionne parce que le Trello Dev Board est public. Mais que faire si nous voulons des données privées?

La bonne façon de procéder consiste à générer un jeton d'API. Le Guide de démarrage de l'API Trello contient une description détaillée de la procédure à suivre. Mais nous sommes pressés, alors nous allons le faire à la manière de l'homme paresseux ...

Connectez-vous à http://trello.com dans Chrome et ouvrez la console (Affichage> Développeur> Console JavaScript). Tapez $.cookie('token')dans la fenêtre. Cela crachera quelque chose comme "uniquememberid/somegarbledstring". Copiez la partie entre les guillemets et modifiez la demande pour qu'elle ressemble à ceci:

http GET "https://api.trello.com/1/boards/THE_ID_OF_THE_PRIVATE_BOARD_YOU_WANT/actions" "Cookie:token=uniquememberid/somegarbledstring" "since==Apr 1 2013 EDT" "before==May 1 2013 EDT" "limit==1000" "filter==commentCard" | jq ...

La seule chose que nous avons modifiée est l'ajout de l'en- "Cookie:token=uniquememberid/somegarbledstring"tête. Cela obligera Trello à utiliser le jeton. REMARQUE: ce jeton est très privé ... si vous le donnez à quelqu'un d'autre, il peut se connecter en tant que vous jusqu'à ce que vous le révoquiez sur la page de compte Trello . Alors, tu sais, fais attention. Ou passez par l'étape de génération de clé / jeton d'API.

Modifiez-les maintenant pour obtenir les données précises dont vous avez besoin au format souhaité.


3

J'ai créé un outil appelé reportsfortrello.com qui vous montrera combien de temps une carte était dans une liste pendant une période de temps.

Il est gratuit et vous permet de regarder en arrière 1000 actions par planche. Il peut également suivre les adhésions aux cartes.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.