it-swarm.com.de

Ist es möglich, alle Aktivitäten für einen bestimmten Zeitraum in Trello aufzulisten?

Ich benutze Trello seit mehreren Monaten und poste routinemäßig Aktivitäten auf Karten, während ich daran arbeite, und verschiebe sie dann von links nach rechts in die Liste "Vollständig". Ich nutze Fälligkeitstermine nicht. Gibt es einen Mechanismus, um den Aktivitätstext für einen bestimmten Bereich auf allen Karten aufzulisten? Ich versuche, Rohdaten abzurufen, um einen Statusbericht für einen bestimmten Zeitraum zu erstellen.

Beispiel: Wenn der heutige Tag der 15. Mai 2013 ist. Ich möchte eine Liste aller Aktivitätstexte auf jeder Karte erstellen, auf der "Aktivitätseinträge" für den Zeitraum vom 29. April bis 3. Mai vorhanden waren.

11
Brian

Ja, mithilfe der Trello-API und einiger anderer Tools.

Diese Antwort basiert auf HTTPie und jq , zwei frei verfügbaren Tools, die über pip und Homebrew installiert werden können benutze einen Mac:

$ pip install httpie
$ brew install jq

Mit HTTPie können wir die Trello-API abfragen, um den unformatierten Action-Feed für ein Board abzurufen. Anschließend können wir jq verwenden, um diese Daten in nützliche Daten umzuwandeln.

Beginnen wir mit etwas "Einfachem". Der folgende Befehl gibt uns alle Kommentare, die im April 2013 am Trello Dev Board abgegeben wurden. Ich werde dies gleich erläutern:

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'

Wenn alles nach Plan lief, sollten wir so etwas sehen:

{
  "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. Dies ist ein einzelnes, vernünftiges JSON-Objekt, das problemlos in eine beliebige Anzahl anderer Formate geparst werden kann. Lassen Sie uns das jetzt durchgehen, damit wir es gut genug verstehen können, um es an unsere Bedürfnisse anzupassen.

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

Dies ist der einzige Teil, der von Trello abhängt. Wir stellen eine Anfrage gegen die öffentliche API für das Board mit der ID 4d5ea62fd76aa1136000000c - Ich habe das durch Aufrufen von https://trello.com/dev und Betrachten der ID, an die Trello angehängt ist die vollständige URL (https://trello.com/board/trello-development/4d5ea62fd76aa1136000000c).

Die Felder since und before sind selbsterklärend. Ich gebe limit von 1000 an, da dies die größte Antwort ist, die Trello zulässt. Wenn Ihr Board im relevanten Datumsbereich mehr als tausend Kommentare enthält, ist hier eine kompliziertere Paging-Lösung erforderlich. Ich gebe filter von commentCard an, da ich nur an diesen für die Zwecke dieser Antwort interessiert bin. Wenn Sie weitere Aktionstypen wünschen, geben Sie eine durch Kommas getrennte Liste wie filter==commentCard,updateCard:idList,createCard an. Gültige Aktionstypen finden Sie in der Trello API-Referenz .

Wenn wir das alleine machen, werden wir eine Menge Informationen bekommen, die relativ schwer zu verstehen sind. Also leiten wir es in jq um es in etwas Nützlicheres zu massieren.

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

Stück für Stück führt unser Skript jq die folgenden Transformationen durch, von denen jede ihr Ergebnis an den nächsten Operator weiterleitet:

  • group_by(.data.card.id)
    • Trello gibt uns nur eine Reihe von Aktionen. Wir wandeln das in ein Array von Arrays um, wobei jedes Sub-Array nur Aktionen für eine bestimmte Karte enthält. Grundsätzlich [[card1_action1, card1_action2...], [card2_action1, card2_action2...], ...]
  • map({key: KEY_EXPRESSION, value: VALUE_EXPRESSION}) | from_entries
    • Wir wollen kein Array von Arrays. wir wollen nur ein Objekt der Form { card1: [action1, action2, ...], card2: [action1, action2, ...], ...}. Indem wir das Array in ein Array von Schlüssel-Wert-Paaren umwandeln, können wir from_entries verwenden, um daraus ein Objekt zu machen. Cool.
  • Nun schauen wir uns an, was ich oben KEY_EXPRESSION genannt habe: (.[0].data.card | "\(.name) (\(.id))")
    • Das ist ziemlich einfach. Wir nehmen den Karteneintrag von der ersten Aktion (da er für alle Aktionen gleich sein sollte, hätten wir jede auswählen können, aber die erste scheint die richtige Wahl zu sein). Dann verwenden wir die String-Interpolation (\(...)), um etwas zu konstruieren, das wie "name (id)" aussieht.
  • VALUE_EXPRESSION ist map({date, member: .memberCreator.fullName, comment: .data.text})
    • Wir hätten einfach . verwenden können, um das Array aller Aktionen unverändert zu erhalten. Aber da Aktionen irgendwie hässlich sind, massieren wir sie zu etwas Nützlichem, indem wir map über das Array schwenken und {date, member: .memberCreator.fullName, comment: .data.text} auf jedes einzelne Aktionsobjekt anwenden.
      • {date} ist dasselbe wie {date: date} bis jq.
      • Alles andere ist ziemlich selbsterklärend. Wir haben jetzt das Datum, das Mitglied (nur den Namen, aber es wäre leicht, mehr zu bekommen) und den Text des Kommentars.

Da haben Sie es also. Hoffentlich. Wir hätten diese Datenmassage in jeder Skriptsprache durchführen können, aber genau dafür wurde jq entwickelt, daher ist es eine gute Ausrede, ein cooles neues Tool zu erlernen. Weitere Informationen finden Sie im jq-Handbuch .

Dies funktioniert, weil das Trello Dev Board öffentlich ist. Aber was ist, wenn wir private Daten wollen?

Die richtige Möglichkeit besteht darin, ein API-Token zu generieren. Das Trello API Getting Started Guide enthält eine detaillierte Anleitung dazu. Aber wir haben es eilig, also machen wir es auf die faule Art und Weise ...

Melden Sie sich bei http://trello.com in Chrome an und öffnen Sie die Konsole (Ansicht> Entwickler> JavaScript-Konsole). Geben Sie $.cookie('token') in das Fenster ein. Dies wird so etwas wie "uniquememberid/somegarbledstring" zurückspucken. Kopieren Sie den Teil zwischen den Anführungszeichen und ändern Sie die Anforderung so, dass sie ungefähr so ​​aussieht:

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 ...

Das Einzige, was wir geändert haben, ist das Hinzufügen des Headers "Cookie:token=uniquememberid/somegarbledstring". Dadurch verwendet Trello den Token. Beachten Sie, dass dieses Token sehr privat ist. Wenn Sie es jemand anderem geben, kann sich dieser grundsätzlich so lange wie Sie anmelden, bis Sie es auf der Trello Account Page widerrufen. Also sei vorsichtig. Oder führen Sie den Schritt zur Generierung von API-Schlüsseln/-Token aus.

Ändern Sie nun die Einstellungen weg, um die genauen Daten zu erhalten, die Sie im gewünschten Format benötigen.

14
Ian Henry

Ich habe ein Tool namens reportsfortrello.com erstellt, das Ihnen anzeigt, wie lange eine Karte in einer Liste während eines bestimmten Zeitraums enthalten war.

Es ist kostenlos und ermöglicht es Ihnen, 1000 Aktionen pro Board nachzuschlagen. Es kann auch Kartenmitgliedschaften verfolgen.

3
Brendan