22
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

プリザンターOpenAPI仕様を使ってn8nカスタムノードを作ってみた

Last updated at Posted at 2025-12-15

プリザンターOpenAPI仕様を使ってn8nカスタムノードを作ってみた

はじめに

数年前にPowerAutomateのコネクタ作成記事を書いた際、プリザンターのOpenAPI仕様を作成していました。

今回はその仕様を最新のプリザンターAPIに合わせてアップデートし、n8n用のカスタムノードを作ってみましたので、その機能や使い方、AIによるコード生成の活用例についてご紹介します。

OpenAPIとは

OpenAPI(旧Swagger)は、APIの仕様をYAMLやJSONで記述できる標準フォーマットです。
この仕様を整備しておくことで、

  • APIの仕様が明確になり、ドキュメントも自動生成できる
  • 各種ツールやサービスとの連携がしやすくなる
  • クライアントやテストコードの自動生成も可能
    といったメリットがあります。

今回は、以前作成したままになっていたOpenAPI仕様を最新のプリザンターAPIに合わせて更新し、OpenAPIのバージョンも2.0から3.0にアップグレードしました。

  • こちらから確認・ダウンロードできます

現在はレコードの「取得」「作成」「更新」「削除」のAPIのみですが、その他APIにも拡張していく予定です

n8nノード作成に活用

n8nは、ノーコード/ローコードでさまざまなサービスやアプリケーションを連携できるワークフロー自動化ツールです。
オープンソースとして開発されており、クラウド版・セルフホスト版の両方が提供されています。

主な特徴は以下の通りです。

  • 直感的なUIで複雑な処理もドラッグ&ドロップで構築可能
  • 300種類以上のサービス・アプリと連携できる豊富なノード
  • JavaScriptやカスタム関数による柔軟な拡張性

業務の自動化やデータ連携、通知、定期処理など幅広い用途で利用されています。

AIによるコード生成との組み合わせ

今回はGitHub CopilotのAIエージェント(使用モデルはClaude Opus(preview))を使い、OpenAPI仕様からn8nのカスタムノード(TypeScript)を自動生成してみました。

AIへの指示は、

の2点だけでしたが、ほぼ期待するコードを生成してくれました。
OpenAPIのような構造化された標準仕様があることで、APIの仕様に関しては正確に把握できているように感じました。

n8nノード Pleasanter

今回作成したノードは、GitHubリポジトリで公開しています。ソースコードなどはこちらでご確認ください。
https://github.com/pleasanter-developer-community/n8n-node-pleasanter

また、npmでも公開しているので、n8nのCommunity nodesから簡単にインストールできます。
https://www.npmjs.com/package/n8n-nodes-pleasanter

デバッグ環境について

n8nノードの開発・デバッグには、n8nのDockerイメージを利用すると便利です。
以下は、docker-compose.ymlの例です。作成したカスタムノードn8n-nodes-pleasanterのソースコードをマウントして利用する設定になっています。

services:
  n8n:
    image: docker.n8n.io/n8nio/n8n
    container_name: n8n-pleasanter-dev
    restart: unless-stopped
    ports:
      - "5678:5678"
    environment:
      - N8N_HOST=localhost
      - N8N_PORT=5678
      - N8N_PROTOCOL=http
      - WEBHOOK_URL=http://localhost:5678/
      - GENERIC_TIMEZONE=Asia/Tokyo
      - TZ=Asia/Tokyo
    volumes:
      - ./volume:/home/node/.n8n
      - ./n8n-nodes-pleasanter/dist:/home/node/.n8n/custom/node_modules/n8n-nodes-pleasanter/dist:ro
      - ./n8n-nodes-pleasanter/package.json:/home/node/.n8n/custom/node_modules/n8n-nodes-pleasanter/package.json:ro

インストール方法

n8nのUI上でComunity notesとしてインストール可能です。

  1. n8nの設定 > Community nodes に移動します
  2. n8n-nodes-pleasanter を検索してインストールします

image.png

使用例

下記のようなTODOリストのテーブルを例にワークフローの作成手順を説明します。

image.png

ワークフローの仕様

  • 手動起動(n8nのUI上で手動実行)(Manual Trigger)
  • TODOレコードの「開始」が当日且かつ「状況」が「未実施」のレコードを取得(Get record(s))
  • 取得したレコードをループ処理(Loop Over Items)
  • 各レコードの「状況」を「実行中」に変更(Update a record)

ワークフロー作成手順

  1. n8nエディタで新しいワークフローを作成

  2. トリガーに「Manual Trigger」を選択
    image.png

  3. ノード追加で「Pleasanter」を検索

  4. 検索で表示された「Pleasanter」を選択後、Actionsから「Get record(s)」を選択
    image.png

  5. CredentialでプリザンターのURLとAPIキーを登録
    「Credential to connect with」のドロップダウンで「+Create new credential」をクリックしてプリザンターの認証情報(BaseURLとAPI Key)を登録します。
    (既にプリザンターの認証情報を登録している場合は設定済みの認証情報を選択)
    image.png
    image.png
    image.png

  6. Get record(s)の各種パラメータを設定
    image.png

    • 「Site ID or Record ID」に対象のテーブルのサイトIDを入力
    • 「Output Format」は「Flat」を選択(Output Formatについて後述します)
    • レコードの取得条件はView Optionsで設定
      • 「Add View Option」ドロップダウンからViewで指定可能なプロパティを選択
        image.png
      • 「Column Filter Hash」を選択しKey欄とValue欄に以下の内容を入力
        • 開始(StartTime)が"今日"
        • 状況(Status)が"未実施"(100)
          image.png
  7. 取得したレコードを「Loop Over Items」ノードでループ処理
    image.png
    image.png

  8. ループ内にPleasanterノードをAction 「Update a record」で追加
    image.png

    • レコードのIDは「Get record(s)」の結果から「IssueId」を参照
    • 更新する値は「Record Data」の「Add Field」から「Status」を選択して、値を設定
      image.png
  9. ワークフローを保存して実行

Output Formatについて

Get record(s) Actionの「Output Format」では「Flat」か「Raw」のどちらかを選択します。

  • Raw:プリザンターから返却されるJSONがそのまま出力されます。下記のようなフォーマットになります

    [
      {
        "StatusCode": 200,
        "LimitPerDate": 10000,
        "LimitRemaining": 9990,
        "Response": {
          "Offset": 0,
          "PageSize": 200,
          "TotalCount": 0,
          "Data": []
        }
      }
    ]
    
  • Flat: レコードデータの配列のみを返します。実行結果共通の項目(StatusCode, LimitPerDate, LimitRemaining, Offset, PageSize, TotalCount)は全てのレコードに追加されます。データ量は大きくなりますが、後続のループ処理にそのまま渡せるため便利です

    [
      {
        "StatusCode": 200,
        "LimitPerDate": 10000,
        "LimitRemaining": 9987,
        "Offset": 0,
        "PageSize": 200,
        "TotalCount": 1,
        "SiteId": 17244127,
        "UpdatedTime": "2025-12-15T11:06:06",
        "Title": "くさむしり",
        ...
      }
    ]
    

実行結果

実行ログを確認してみます。

  1. フロー実行前のテーブル
    image.png

2.「Get record(s)」で対象レコードの取得
開始が今日で未実施の2件を取得
image.png
3. 「Loop Over Items」1件目
image.png
4. 「Update a record」1件目
image.png
5. 「Loop Over Items」2件目
image.png
6. 「Update a record」2件目
image.png
7. 「Loop Over Items」終了時
image.png
8. フロー実行後のテーブル
image.png

想定通りにレコードが更新できていることが確認できます。

まとめ

OpenAPI仕様を最新化し、AIによるコード生成を組み合わせてn8nノードを作成することで、プリザンターのAPIをより直感的かつ効率的に活用できるようになりました。

今回はn8nのカスタムノードを例にご紹介しましたが、標準化されたOpenAPIをベースにすることで、今後は他のツールやサービスとの連携もさらに広がっていくと考えています。

今回公開したOpenAPI仕様やカスタムノードは、どちらもGitHubで自由に利用できます。

ぜひ実際に使ってみて、フィードバックやプルリクエストをお寄せいただけると嬉しいです。

22
4
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
22
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?