// Gotowe workflow

Aktualizacja zadań w Todoist

▸ // rozdziały lekcji

Aktualizacja zadań w Todoist - Wolniś: „Terminy przesuwają się same”

Cały workflow na kanwie - dwa wyzwalacze wpięte w Get many tasks, dalej Update a task

Zadanie bez terminu w Todoist nie pokazuje się w widoku „Dziś" ani w „Nadchodzących". Leży w skrzynce i czeka, aż ktoś je znajdzie. Zwykle nikt go nie znajduje.

Wrzucasz coś szybko z telefonu, bez daty, bo „potem ustawię". Po tygodniu masz w skrzynce 30 takich pozycji i pół godziny przeklikiwania, żeby każdej nadać dzień. Ten workflow robi to za ciebie co 30 minut.

Efekt: cokolwiek wrzucisz bez daty, rano ląduje na liście dnia. Skrzynka sama opróżnia się do kalendarza.

Co robi ten workflow

  1. When clicking ‘Execute workflow’ - ręczny wyzwalacz do testów. Klikasz i patrzysz, co się stało, bez czekania na harmonogram.
  2. Schedule Trigger - właściwy wyzwalacz z wyrażeniem cron. Odpala workflow co pół godziny w godzinach pracy.
  3. Get many tasks - węzeł Todoist, który pobiera zadania pasujące do filtra „no due date", czyli wszystkie bez terminu.
  4. Update a task - węzeł Todoist, który każdemu z tych zadań ustawia termin na jutro, 8:00.

Oba wyzwalacze są wpięte w ten sam węzeł „Get many tasks", więc ręczne uruchomienie robi dokładnie to samo co automatyczne.

Czego potrzebujesz

  • konta Todoist i tokenu API,
  • poświadczenia Todoist w n8n. Jak je założyć, pokazuję w lekcji Credentials Todoist.

Workflow nie ma identyfikatorów projektów ani kluczy do podmiany. Działa na całym koncie, do którego ma dostęp token.

Jak uruchomić

  1. Zaimportuj plik z dołu lekcji. Jak to zrobić, pokazuję w lekcji o imporcie.
  2. Otwórz węzeł „Get many tasks" i wybierz swoje poświadczenie Todoist. To samo zrób w „Update a task". W pliku poświadczeń nie ma, wyczyściłem je przed publikacją.
  3. Kliknij Execute workflow i obejrzyj wynik „Get many tasks". To lista zadań, które za chwilę dostaną jutrzejszy termin.
  4. Jeśli lista się zgadza, kliknij Publish. Harmonogram działa dopiero po publikacji, więcej o tym w lekcji o interfejsie i publikacji.

Zaznaczam wprost: import tego pliku do n8n 2.40.6 sprawdziłem, działania na żywym koncie Todoist w tej wersji n8n już nie. Pierwsze uruchomienie zrób ręcznie i patrz na dane.

Harmonogram - wyrażenie cron

Schedule Trigger nie ma tu zwykłego „co 30 minut", tylko wyrażenie cron:

*/30 8-19 * * *

Pięć pól to kolejno minuta, godzina, dzień miesiąca, miesiąc i dzień tygodnia. */30 w minutach znaczy „co 30 minut", 8-19 w godzinach zawęża to do przedziału 8:00-19:30. Poza tymi godzinami workflow stoi i nie odpytuje Todoist po nocy.

Filtr robi całą selekcję

W „Get many tasks" pole filtra ma wartość „no due date". To zwykła składnia filtrów Todoist, ta sama, którą wpisujesz w aplikacji. n8n niczego nie odsiewa po swojej stronie - Todoist od razu zwraca tylko zadania bez terminu.

Pro-tip. Jeśli na liście są rzeczy, których nie chcesz ruszać, zawęź filtr, na przykład do jednego projektu: „no due date & #Inbox". Składnię sprawdź najpierw w wyszukiwarce filtrów w samym Todoist. Jeśli tam pokazuje to, co chcesz, w n8n zadziała tak samo.

Wyrażenie z datą

„Update a task" wykonuje się raz na każde zadanie z poprzedniego kroku. Identyfikator zadania bierze z {{ $json.id }}, a nowy termin liczy tak:

{{ $now.plus({ days: 1 }).set({ hour: 8, minute: 0, second: 0, millisecond: 0 }).toISO() }}

Po kolei: $now to bieżąca chwila, plus({ days: 1 }) dodaje dzień, set(...) ustawia godzinę na 8:00:00, a toISO() zamienia wynik na format, który przyjmuje pole terminu z godziną.

Węzeł Update a task - pole Due Date Time z wyrażeniem i podglądem wyniku pod spodem

Haczyk. $now liczy czas w strefie ustawionej dla workflow albo całej instancji n8n. Jeśli serwer stoi w UTC, „jutro o 8:00" wyjdzie w Todoist jako 10:00 latem. Zanim uznasz, że Todoist źle pokazuje godziny, sprawdź strefę w ustawieniach workflow (trzy kropki obok nazwy > Settings).

Drugi szczegół wynika z samego harmonogramu. Zadanie dodane o 21:00 czeka do przebiegu o 8:00 rano i wtedy dostaje termin na następny dzień. Licząc od chwili wpisania, to już pojutrze. Jeśli ci to przeszkadza, rozciągnij godziny w wyrażeniu cron.

Kiedy tego nie używać

Trzymasz w Todoist listy, które celowo nie mają dat? Zakupy, pomysły „kiedyś", lista książek. Ten workflow co pół godziny wrzuci je wszystkie na jutro. Zanim opublikujesz, zawęź filtr do jednego projektu albo zrezygnuj z automatu.

To samo przy koncie współdzielonym z zespołem. Filtr łapie wszystkie zadania bez terminu, do których token ma dostęp, także cudze w projektach wspólnych.

Podsumowanie

Cztery węzły zamieniają skrzynkę Todoist w listę na jutro rano. Całą robotę robi jeden filtr „no due date" i jedno wyrażenie z datą. Ten sam układ - wyzwalacz, pobranie z filtrem, aktualizacja każdego wyniku - przerobisz na dowolną inną regułę, zmieniając tylko te dwa pola.

W następnej lekcji, Skalowanie obrazków do WordPressa, n8n pobierze obrazek, zmniejszy go, zapisze jako WebP i przypnie do wpisu.

Pokaż JSON do skopiowania - todoist-aktualizacja-zadan.json
{
  "name": "Todoist",
  "nodes": [
    {
      "parameters": {},
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [
        -272,
        0
      ],
      "id": "324346a5-9717-47ab-a477-79a2175cc667",
      "name": "When clicking ‘Execute workflow’"
    },
    {
      "parameters": {
        "operation": "getAll",
        "filters": {
          "filter": "no due date"
        }
      },
      "type": "n8n-nodes-base.todoist",
      "typeVersion": 2.1,
      "position": [
        -32,
        0
      ],
      "id": "58d85fb1-ec8e-46a8-a408-7255b70a410d",
      "name": "Get many tasks"
    },
    {
      "parameters": {
        "operation": "update",
        "taskId": "={{ $json.id }}",
        "updateFields": {
          "dueDateTime": "={{ $now.plus({ days: 1 }).set({ hour: 8, minute: 0, second: 0, millisecond: 0 }).toISO() }}"
        }
      },
      "type": "n8n-nodes-base.todoist",
      "typeVersion": 2.1,
      "position": [
        176,
        0
      ],
      "id": "2b22c390-7e2b-49ed-b56d-64d30dfe8c1f",
      "name": "Update a task"
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "*/30 8-19 * * *"
            }
          ]
        }
      },
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        -256,
        208
      ],
      "id": "78cfb86e-10df-4623-b79c-d33f06c03a93",
      "name": "Schedule Trigger"
    }
  ],
  "connections": {
    "When clicking ‘Execute workflow’": {
      "main": [
        [
          {
            "node": "Get many tasks",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get many tasks": {
      "main": [
        [
          {
            "node": "Update a task",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Get many tasks",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "pinData": {}
}