È possibile elencare tutte le attività per un determinato intervallo di date in Trello?


11

Uso Trello da diversi mesi e pubblico regolarmente attività sulle carte mentre lavoro su di esse, quindi le sposto da sinistra a destra nell'elenco "Completo". Non faccio leva sulle scadenze. Esiste un meccanismo per elencare il testo dell'attività su tutte le carte per un determinato intervallo. Sto cercando di estrarre alcuni dati non elaborati per alimentare un rapporto sullo stato per un determinato periodo.

Esempio: se la data odierna è il 15 maggio 2013. Voglio produrre un elenco di tutti i testi delle attività su ogni carta che contenesse voci "attività" per il periodo dal 29 aprile al 3 maggio.


Questo può essere fatto, ma solo usando l'API Trello. Ti senti a tuo agio nel programmare un po 'di luce per ottenere i dati desiderati?
Ian Henry,

@IanHenry Sì, mi sento a mio agio.
Brian,

Risposte:


14

Sì, lo è, utilizzando l'API Trello e alcuni altri strumenti.

Questa risposta si basa su HTTPie e jq , due strumenti disponibili gratuitamente che possono essere installati tramite pip e Homebrew se si utilizza un Mac:

$ pip install httpie
$ brew install jq

Utilizzando HTTPiepossiamo interrogare l'API di Trello per ottenere il feed di azioni non elaborate per una scheda, quindi possiamo usare jqper trasformare quei dati in qualcosa di utile.

Cominciamo con qualcosa di "semplice". Il seguente comando ci fornirà tutti i commenti fatti sulla Trello Dev Board nel mese di aprile 2013. Lo spiegherò tra un secondo:

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'

Se tutto è andato secondo i piani, dovremmo vedere qualcosa del genere:

{
  "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",
      ...

Freddo. Questo è un singolo oggetto JSON ragionevole che possiamo facilmente analizzare in qualsiasi numero di altri formati. Ora passiamo a quello in modo da poterlo capire abbastanza bene da modificarlo in base alle nostre esigenze.

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

Questa è l'unica parte che dipende da Trello. Facciamo una richiesta contro l'API pubblica per la scheda con ID 4d5ea62fd76aa1136000000c: l'ho ottenuta andando su https://trello.com/dev e guardando l'id che Trello aggiunge all'URL completo ( https://trello.com/board/trello-development/4d5ea62fd76aa1136000000c).

I campi sincee beforesono autoesplicativi. Specifico a limitof 1000perché è la risposta più grande che Trello consentirà. Se la tua bacheca ha più di mille commenti nell'intervallo di date pertinente, qui sarebbe necessaria una soluzione di paging più complicata. Specifico a filterof commentCardperché sono interessato solo a quelli ai fini di questa risposta. Se vuoi più tipi di azioni, specifica un elenco separato da virgole come filter==commentCard,updateCard:idList,createCard. Tipi di azioni validi sono disponibili nel riferimento API Trello .

Se lo gestiamo da solo, avremo molte informazioni che sono relativamente difficili da dare un senso. Quindi lo convogliamo jqper massaggiarlo in qualcosa di un po 'più 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'

Pezzo per pezzo, la nostra jqsceneggiatura sta effettuando le seguenti trasformazioni, ognuna delle quali invia il risultato all'operatore successivo:

  • group_by(.data.card.id)
    • Trello ci dà solo una serie di azioni. Trasformiamo questo in un array di array, in cui ciascun array secondario contiene solo azioni per una determinata carta. Fondamentalmente[[card1_action1, card1_action2...], [card2_action1, card2_action2...], ...]
  • map({key: KEY_EXPRESSION, value: VALUE_EXPRESSION}) | from_entries
    • Non vogliamo una serie di array; vogliamo solo un oggetto del modulo { card1: [action1, action2, ...], card2: [action1, action2, ...], ...}. Trasformando l'array in un array di coppie chiave-valore, possiamo usarlo from_entriesper trasformarlo in un oggetto. Freddo.
  • Ora diamo un'occhiata a quello che ho chiamato KEY_EXPRESSIONsopra:(.[0].data.card | "\(.name) (\(.id))")
    • Questo è abbastanza semplice. Prendiamo l'entrata della carta dalla prima azione (dal momento che dovrebbe essere la stessa per tutte le azioni, avremmo potuto sceglierne una qualsiasi, ma la prima sembra una scelta sana). Quindi usiamo l'interpolazione di stringhe ( \(...)) per costruire qualcosa che assomigli "name (id)".
  • VALUE_EXPRESSION è map({date, member: .memberCreator.fullName, comment: .data.text})
    • Avremmo potuto semplicemente usare .per mantenere invariata la matrice di tutte le azioni. Ma poiché le azioni sono un po 'brutte, le stiamo massaggiando in qualcosa di utile mapeseguendo il ping sull'array e applicando {date, member: .memberCreator.fullName, comment: .data.text}a ogni singolo oggetto azione.
      • {date}è lo stesso {date: date}di jq.
      • Tutto il resto è piuttosto autoesplicativo. Ora abbiamo la data, il membro (solo il loro nome, ma sarebbe facile ottenerne di più) e il testo del commento.

Così il gioco è fatto. Ehm, si spera. Avremmo potuto massaggiare questi dati in qualsiasi linguaggio di scripting, ma questo è esattamente ciò jqper cui è stato creato, quindi è una buona scusa per imparare un nuovo fantastico strumento. Consulta il manuale di jq per ulteriori informazioni.

Ora, questo funziona perché la Trello Dev Board è pubblica. E se volessimo i dati privati?

Il modo giusto per farlo è generare un token API. La Guida introduttiva dell'API Trello contiene una descrizione dettagliata di come eseguire questa operazione. Ma abbiamo fretta, quindi lo faremo alla maniera dei pigri ...

Accedi a http://trello.com in Chrome e apri la console (Visualizza> Sviluppatore> Console JavaScript). Digita $.cookie('token')nella finestra. Questo sputerà qualcosa di simile "uniquememberid/somegarbledstring". Copia la parte tra virgolette e modifica la richiesta in modo che sia simile a questa:

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

L'unica cosa che cambiamo è l'aggiunta "Cookie:token=uniquememberid/somegarbledstring"dell'intestazione. Questo farà sì che Trello usi il token. NOTA che quel token è molto privato ... se lo dai a qualcun altro, può sostanzialmente accedere come te fino a quando non lo revoca nella pagina dell'account Trello . Quindi, sai, stai attento. Oppure passa attraverso la fase di generazione della chiave API / token.

Ora modifica via per ottenere i dati precisi di cui hai bisogno nel formato desiderato.


3

Ho creato uno strumento chiamato reportsfortrello.com che ti mostrerà per quanto tempo una carta è stata in un elenco per un certo periodo di tempo.

È gratuito e ti consente di guardare indietro di 1000 azioni per ogni scheda. Può anche tenere traccia delle iscrizioni alle carte.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.