2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Teams × Asana × Python × タスクスケジューラでタスクを希望のセクションに自動振り分けする方法

Last updated at Posted at 2025-12-04

はじめに

TeamsのAsanaアプリを用いて、チャットやチャネル、会議からAsanaにタスクを追加し、「マイタスク」一覧に表示されるタスクを期日ごとに自動的にセクションへ振り分ける方法を備忘録としてまとめます。

対象読者

以下に、当てはまる方に役立ちます。

  • TeamsでAsanaアプリが利用できる方(弊社では申請により利用可能)
  • 会社のDLPポリシーの関係で Power Automate のHTTPリクエストやAsanaコネクタが利用できない方
    (※Power Automateが利用できる場合は、そちらを使う方が簡単です)
  • WindowsのタスクスケジューラをDLPポリシーに違反せず利用できる方

実現したいこと

AsanaではTeams経由で追加されたタスクは、常にプロジェクトの一番上のセクション(本稿では「Teamsから作成されたタスク」)に追加されます。
そこで以下のルールで自動振り分けを行います。

  • 期日が 今日から2日以内 → 「今日の作業」セクションへ移動
  • 期日が 今日から2日以降 → 「明日以降の作業」セクションへ移動

スクリーンショット 2025-12-04 092030.png

実装の流れ

  1. Python環境をローカルPC上(例:Cドライブ内)に作成
  2. タスク情報をGETし、振り分けたいセクションにPUTするHTTPリクエストのスクリプトを記述
  3. Windowsタスクスケジューラで定期的にPythonスクリプトを実行

必要なアプリ


必要な変数の定義

  • PAT(Asanaの個人アクセストークン)
  • project_gid(プロジェクトID)
  • section_gid(移動元や移動先のセクションID)
    • source_section_gid #移動元セクションID(Teamsから作成されたタスク)
    • today_section_gid #移動元セクションID(今日の作業)
    • future_section_gid #移動元セクションID(明日以降の作業)

変数の取得方法

PAT(個人アクセストークン)

  1. Asana開発者コンソール にアクセス
  2. 「個人アクセストークン」セクションで「+トークンを新規作成」
  3. トークンに名前(例:TaskSchedulerIntegration)を付ける
  4. トークンを発行(※一度しか表示されないので必ずコピーして保管)
    スクリーンショット 2025-12-04 113406.png

project_gid(プロジェクトID)

  1. Asana開発者コンソール の右上からAsanaを起動
  2. リストからマイタスクを選択したのちURLを確認
    https://app.asana.com/1/**************/project/1209********7487/list/1209********7496
    
  3. 上記の1209********7487の部分がproject_gidなので保管

section_gid(セクションID)

  1. コマンドプロンプトを開き、以下のコマンドを入力({PAT},{project_gid}は自分で編集)

    curl -k -H "Authorization: Bearer {PAT}" https://app.asana.com/api/1.0/projects/{project_gid}/sections
    
  2. 以下のようなレスポンスを確認したのち、移動元および移動先セクションのgidの値を保管

    {
      "data": [
        {
          "gid": "1234567890123456",
          "name": "Teamsから作成されたタスク",
          "resource_type": "section"
        },
        {
          "gid": "2345678901234567",
          "name": "今日の作業",
          "resource_type": "section"
        }
      ]
    }
    

Python環境構築

  1. コマンドプロンプトでフォルダ内にPythonの仮想環境を構築(フォルダを作成)

    python -m venv asana_move
    
  2. asana_moveフォルダに移動

    cd C:\Users\***\asana_move
    
  3. フォルダ内にrequestsライブラリをインストール

    pip install requests
    
  4. 以下のコマンドを入力し、メモ帳でスクリプトファイルを開く

    notepad asana_move.py
    
  5. 以下のファイルをメモ帳に開いて保存
    Pythonスクリプト例

    import requests
    from datetime import datetime, timedelta, UTC
    
    PAT = "自分で編集"
    
    # セクションID
    source_section_gid = "自分で編集"  # 移動元のgid(Teamsから作成されたタスク)
    today_section_gid = "自分で編集"   # 移動先のgid(今日の作業)
    future_section_gid = "自分で編集"  # 移動先のgid(明日以降の作業)
    
    # APIエンドポイント
    get_tasks_url = f"https://app.asana.com/api/1.0/sections/{source_section_gid}/tasks?opt_fields=name,due_on"
    move_today_url = f"https://app.asana.com/api/1.0/sections/{today_section_gid}/addTask"
    move_future_url = f"https://app.asana.com/api/1.0/sections/{future_section_gid}/addTask"
    
    headers = {
        "Authorization": f"Bearer {PAT}",
        "Content-Type": "application/json"
    }
    
    today = datetime.now(UTC).date()
    two_days_later = today + timedelta(days=2)
    
    response = requests.get(get_tasks_url, headers=headers)
    
    if response.status_code == 200:
        tasks = response.json().get("data", [])
        for task in tasks:
            task_name = task["name"]
            task_gid = task["gid"]
            due_on = task.get("due_on")
    
            # 判定ロジック
            if due_on:
                due_date = datetime.strptime(due_on, "%Y-%m-%d").date()
                if today <= due_date <= two_days_later:
                    # 今日から2日以内 → 今日の作業
                    print(f"移動対象: {task_name} (期日: {due_on}) → 今日の作業")
                    move_url = move_today_url
                else:
                    # 2日以降 → 明日以降の作業
                    print(f"移動対象: {task_name} (期日: {due_on}) → 明日以降の作業")
                    move_url = move_future_url
            else:
                # 期日なし → 今日の作業
                print(f"移動対象: {task_name} (期日なし) → 今日の作業")
                move_url = move_today_url
    
            # タスク移動API呼び出し
            move_response = requests.post(move_url, headers=headers, json={"data": {"task": task_gid}})
            if move_response.status_code == 200:
                print(f"タスク '{task_name}' を移動しました。")
            else:
                print(f"移動失敗: {move_response.status_code}, {move_response.text}")
    else:
        print(f"エラー: {response.status_code}, 詳細: {response.text}")
    

    ここまで完了すればPythonスクリプトの実行で、セクション間でタスクの移動は自動化されている状態なので、Asanaで「Teamsから作成されたタスク」に任意のタスクを作成し、コマンドプロンプトでasana_moveフォルダにいることを確認して、以下のコマンドでPythonスクリプトを実行。

    Python3 asana_move.py
    

    「タスク '{task_name}' を移動しました。」と表示されれば成功です。
    次に、Windowsで自動的にPythonスクリプトが実行されるようにタスクスケジューラに設定を行います。


タスクスケジューラの設定

  1. Windowsで「タスクスケジューラ」を起動
    スクリーンショット 2025-12-04 120422.png

  2. 操作タブの「タスクの作成」を選択

  3. 名前を入力(例:AsanaTaskScheduler)

  4. 全般タブで以下の設定にする
    スクリーンショット 2025-12-04 124642.png

  5. トリガータブで新規作成を押し、以下のように設定
    (例:毎日午前8時50分に起動し、30分ごとに更新)
    ※更新頻度を多くしすぎるとPCが重くなるので注意
    スクリーンショット 2025-12-04 125112.png

  6. 操作タブで新規作成を押し、以下のように設定

    • 操作 プログラムの開始
    • プログラム/スクリプト
      C:\Users\***\AppData\Local\Microsoft\WindowsApps\pythonw.exe
      (pythonw.exeは、ウィンドウを開かずに実行するため)
    • 引数の追加(オプション)
      C:\Users\***\asana_move\asana_move.py
  7. 条件タブを以下のように設定
    スクリーンショット 2025-12-04 130326.png

  8. 設定タブを以下のように設定
    スクリーンショット 2025-12-04 130520.png

  9. 完了をクリック

お疲れさまでした。
これで毎日指定時間にPythonスクリプトが実行され、タスクが自動的に振り分けられます。

まとめ

• Teamsから追加されたタスクはAsanaの最上位セクションに入る仕様
• Python+Asana API+Windowsタスクスケジューラを組み合わせることで、期日ごとに自動振り分け可能
• Power Automateが使えない環境でも、ローカルPCで簡易的に自動化できる

この方法を応用すれば、さらに細かいルール(例:担当者別、タグ別)での振り分けも可能です。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?