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

11

Ich benutze Trello seit mehreren Monaten und poste regelmäß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 keine Fälligkeitstermine. Gibt es einen Mechanismus, um den Aktivitätstext auf allen Karten für einen bestimmten Bereich aufzulisten? Ich versuche, einige 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, die für den Zeitraum vom 29. April bis 3. Mai 'Aktivitäts'-Einträge enthielt.

Brian
quelle
Dies ist möglich, jedoch nur mithilfe der Trello-API. Fühlen Sie sich wohl, wenn Sie leicht programmieren, um die gewünschten Daten zu erhalten?
Ian Henry
@ IanHenry Ja, ich fühle mich wohl.
Brian

Antworten:

14

Ja, mit der Trello-API und einigen anderen Tools.

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

$ pip install httpie
$ brew install jq

Mit können HTTPiewir die Trello-API abfragen, um den Rohaktions-Feed für ein Board zu erhalten, und jqdiese Daten dann in etwas Nützliches verwandeln.

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

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 wir problemlos in eine beliebige Anzahl anderer Formate analysieren können. 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- das habe ich erhalten, indem ich zu https://trello.com/dev gegangen bin und mir die ID angesehen habe, die Trello an die vollständige URL anhängt ( https://trello.com/board/trello-development/4d5ea62fd76aa1136000000c).

Die Felder sinceund beforesind selbsterklärend. Ich gebe ein limitvon an, 1000weil dies die größte Antwort ist, die Trello zulässt. Wenn Ihr Board mehr als tausend Kommentare im relevanten Datumsbereich hat, wäre hier eine kompliziertere Paging-Lösung erforderlich. Ich gebe ein filtervon an, commentCardweil ich nur für die Zwecke dieser Antwort an diesen interessiert bin. Wenn Sie weitere Aktionstypen wünschen, geben Sie eine durch Kommas getrennte Liste an filter==commentCard,updateCard:idList,createCard. Gültige Aktionstypen finden Sie in der Trello-API-Referenz .

Wenn wir das alleine ausführen, erhalten wir viele Informationen, die relativ schwer zu verstehen sind. Also leiten wir es hinein, jqum 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 jqSkript die folgenden Transformationen durch, wobei jede ihr Ergebnis an den nächsten Operator weiterleitet:

  • group_by(.data.card.id)
    • Trello gibt uns nur eine Reihe von Aktionen. Wir verwandeln das in ein Array von Arrays, 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 from_entriesverwandeln, können wir daraus ein Objekt machen. Cool.
  • Schauen wir uns nun an, was ich KEY_EXPRESSIONoben genannt habe:(.[0].data.card | "\(.name) (\(.id))")
    • Das ist ziemlich einfach. Wir nehmen den Karteneintrag aus der ersten Aktion (da er für alle Aktionen gleich sein sollte, hätten wir jeden auswählen können, aber der erste scheint die richtige Wahl zu sein). Dann verwenden wir String Interpolation ( \(...)), um etwas zu konstruieren, das aussieht "name (id)".
  • VALUE_EXPRESSION ist map({date, member: .memberCreator.fullName, comment: .data.text})
    • Wir hätten einfach .das Array aller Aktionen unverändert lassen können. Da Aktionen jedoch etwas hässlich sind, massieren wir sie in etwas Nützliches, indem wir mapüber das Array pingen und {date, member: .memberCreator.fullName, comment: .data.text}auf jedes einzelne Aktionsobjekt anwenden .
      • {date}ist das gleiche wie {date: date}zu 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 jqwurde sie entwickelt. Es ist also eine gute Ausrede, ein cooles neues Tool zu erlernen. Weitere Informationen finden Sie im jq-Handbuch .

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

Der richtige Weg, dies zu tun, besteht darin, ein API-Token zu generieren. Das Trello API-Handbuch Erste Schritte enthält eine detaillierte Anleitung dazu. Aber wir haben es eilig, also machen wir es auf die Art des Faulen ...

Melden Sie sich in Chrome bei http://trello.com an und öffnen Sie die Konsole (Ansicht> Entwickler> JavaScript-Konsole). Tippe $.cookie('token')in das Fenster. Dies wird so etwas zurückspucken "uniquememberid/somegarbledstring". 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 "Cookie:token=uniquememberid/somegarbledstring"Headers. Dadurch wird Trello den Token verwenden. HINWEIS: Dieses Token ist sehr privat. Wenn Sie es einer anderen Person geben, kann sich diese Person grundsätzlich als Sie anmelden, bis Sie es auf der Trello-Kontoseite widerrufen . Also, weißt du, sei vorsichtig. Oder führen Sie den Schritt zur Generierung von API-Schlüsseln / Token durch.

Ändern Sie jetzt weg, um die genauen Daten zu erhalten, die Sie in dem gewünschten Format benötigen.

Ian Henry
quelle
3

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

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

Brendan
quelle