kintoneを使っていると、「元データはいまだにExcelのまま」「他部署から受け取ったExcelを、毎回手作業でkintoneに転記している」といった場面に一度は出くわすのではないでしょうか。本記事では、この地味な転記作業を、ワークフロー自動化ツール「n8n」で自動化できないか実際に試しました。社内の共有フォルダにあるExcelをkintoneアプリへ自動同期する手順を、構築からつまずきやすいポイント、運用上の注意点(セキュリティ・ライセンス)まで、実際の流れに沿って解説します。
■なぜ「n8n × kintone」なのか
こうした転記作業は地味に時間を食ううえ、コピペミスや更新漏れの温床にもなります。手作業を前提にしているかぎり、kintoneにデータが集まるほど負担も増えていきます。
ここで役立つのが、ノードをつないで業務を自動化するfair-codeライセンスのワークフロー自動化ツール「n8n」です。n8nにはkintoneを操作する専用の「Kintone」ノードが用意されており、kintoneのREST API経由でレコードの追加・更新・検索ができます。
■今回つくる自動化フローのゴール
題材として、次のシナリオを自動化します。
- フォルダにある「商品マスタ.xlsx」を起点にする
- 毎朝決まった時刻に、ファイルの内容をkintoneの「商品マスタ」アプリへ反映する
- 新規の行は追加、既存の行は更新する(いわゆるUpsert)
つまり、これまで担当者が手作業でやっていた「Excelを開いて、差分を確認して、kintoneに転記する」を、n8nに丸ごと任せる構成です。
■なぜセルフホスト版を使うのか
n8nには、n8n社が運用するクラウド版(n8n Cloud)と、自社サーバーやDockerに設置するセルフホスト版(Community Edition)があります。今回はセルフホスト版を使います。
理由は明確で、ローカルや社内共有フォルダにあるファイルを直接読み込めるのはセルフホスト版だけだからです。n8n Cloudはマネージドサービスのため、自社PCやファイルサーバーのディスクには直接アクセスできません。OneDriveやSharePoint上のExcelであればクラウド版でも「Microsoft Excel 365」ノードで扱えますが、今回のように「共有フォルダの.xlsxファイル」を相手にする場合は、サーバーのファイルシステムを読める「Read/Write Files from Disk」ノードが必要になり、これはセルフホスト版の前提となります。
Community Editionは無償で、実行回数の上限もありません(サーバー費用は別途必要です)。社内利用の範囲であれば、後述するライセンスの条件下で無料で使えます。
■n8n(セルフホスト版)をローカルにインストールする
セルフホスト版のn8nをローカル環境に導入する方法は、大きく「npm(Node.js)で動かす方法」と「Dockerで動かす方法」の2つです。今回のように共有フォルダのファイルを読み込む構成では、どちらでも構築できます。それぞれの手順を紹介します。
方法1:npm(Node.js)でインストールする
すでにNode.jsが入っている、あるいはローカルのファイルパスをそのまま扱いたい場合は、npmでのインストールが手軽です。n8nはNode.js 20.19〜24.xに対応しています。まずNode.jsをインストールし、次のコマンドを実行します。
npm install n8n -g
n8n start起動したらブラウザで http://localhost:5678 を開くと、n8nのエディタ画面が表示されます。お試しで一度だけ動かすなら、グローバルインストールせずに npx n8n でも起動できます。この方法はn8nがホストOS上のプロセスとして動くため、社内共有フォルダのパスを「Read/Write Files from Disk」ノードからそのまま指定できるのが利点です。
方法2:Dockerでインストールする
環境を汚さずに導入したい、チームで同じ構成を再現したいといった場合はDockerが向いています。データ(ワークフローや認証情報)を保持するための名前付きボリュームを作成し、コンテナを起動します。
docker volume create n8n_data
docker run -it --rm --name n8n -p 5678:5678 \
-v n8n_data:/home/node/.n8n \
docker.n8n.io/n8nio/n8n同じく http://localhost:5678 でアクセスできます。Dockerで動かす場合、コンテナの中からはホストのフォルダが直接見えないため、読み込みたい共有フォルダをコンテナにマウントする必要があります。たとえば起動コマンドに -v /path/to/shared:/data/excel を追加し、後述の「Read/Write Files from Disk」ノードでは /data/excel/商品マスタ.xlsx のようにコンテナ内のパスを指定します。
起動後の最初の設定
初回アクセス時に、管理者アカウント(メールアドレスとパスワード)の作成を求められます。これでローカルのn8nが使える状態になります。なお、後述のとおりセルフホスト版は脆弱性対応のため最新版での運用が前提です。インストール後はバージョンを確認し、定期的なアップデート(npmなら再インストール、Dockerならイメージの再取得)を運用に組み込んでおきましょう。
■kintone側の事前準備
1. kintone側:アプリとフィールドコードの確認
まず、同期先となるkintoneアプリを用意します。今回は「商品マスタ」アプリに、商品コード・商品名・単価・在庫数といったフィールドを作成しました。
ここで重要なのがフィールドコードです。n8nのKintoneノードは、画面上のフィールド名ではなく、内部の「フィールドコード」を指定してデータを書き込みます。アプリの設定 →「フォーム」→ 各フィールドの歯車アイコン →「フィールドコード」で確認できるので、Excelの各列がどのフィールドコードに対応するかを先に整理しておきます。
Excelの列 | kintoneのフィールドコード | フィールドタイプ |
|---|---|---|
商品コード | product_code | 文字列1行(重複禁止) |
商品名 | product_name | 文字列1行 |
単価 | unit_price | 数値 |
在庫数 | quantity | 数値 |

更新キーにするフィールド(今回は商品コード)は、必ず「値の重複を禁止する」を有効にしておきます。 Upsert(あれば更新・なければ追加)の判定に使うためで、ここを設定し忘れると後の工程でエラーになります。
2. kintone側:APIトークンの発行
Kintoneノードからアプリを操作するには、認証情報が必要です。アプリ設定 →「APIトークン」から新しいトークンを生成し、「レコード閲覧」「レコード追加」「レコード編集」の権限を付与して保存・アプリを更新します。
権限は必要最小限にとどめるのが鉄則です。今回は削除を行わないので「レコード削除」権限は付けません。
3. n8n側:Kintone認証情報の登録
n8nで Credentials → Add credential を開き、種類で「Header Auth」を選択し、次のように設定して保存します。
- Name(ヘッダー名):
X-Cybozu-API-Token - Value(値): 先ほど発行したAPIトークン

これで「サブドメイン+APIトークンでアクセスする」という当初の意図どおりの構成になります。トークンは認証情報側に持たせ、サブドメインは後述のHTTP RequestノードのURLに入れます。なお、ゲストスペース内のアプリはURLが /k/guest/{スペースID}/v1/records.json に変わります。パスワード認証を使う場合はヘッダー名が X-Cybozu-Authorization(「ログイン名:パスワード」をBase64化した値)になりますが、本記事ではシンプルなAPIトークン方式に絞ります。
連携の「向き」も整理しておきます。今回は時刻起動(Schedule Trigger)でn8nからkintoneを読み書きする「n8n → kintone」の構成で、HTTP Requestを使います。逆に「kintoneでレコードが更新されたらn8nを起動する(kintone → n8n)」をやりたい場合は、トリガーにWebhookノードを使い、kintone側のWebhook設定でそのURLを登録します。なお、セルフホスト版であれば n8n-nodes-kintone のような非公式のコミュニティノードを導入する選択肢もありますが(n8n Cloudでは未検証のコミュニティノードは使えません)、Cloud/セルフホストを問わず確実なのは公式のHTTP Request方式です。
■ワークフローを組み立てる
ここからが本番です。n8nのキャンバス上に、次の4〜5個のノードを左から順につないでいきます。
順番 | ノード | 役割 |
|---|---|---|
1 | Schedule Trigger | 毎朝8:00など、決まった時刻にフローを起動する |
2 | Read/Write Files from Disk | フォルダの商品マスタ.xlsxをバイナリで読み込む |
3 | Extract from File | xlsxをパースし、各行をJSONデータに変換する |
4 | Edit Fields(Set)/ Code | Excelの列名をkintoneのフィールドコードへ対応づけ、型を整える |
5 | Kintone | レコードを追加・更新する(あれば更新・なければ追加) |
ステップ1:Schedule Triggerで起点を作る
最初のノードは「Schedule Trigger」です。実行間隔を「毎日 8:00」のように設定します。これで、人が操作しなくても毎朝自動でフローが走るようになります。手動でテストしたいときは、エディタ上の実行ボタンからその場で動かせます。

ステップ2:Read/Write Files from Diskでファイルを読む
次に「Read/Write Files from Disk」ノードを追加し、操作(Operation)を「Read File(s) From Disk」にします。読み込むファイルのパスに、共有フォルダ上の商品マスタ.xlsxのパスを指定します(n8nを動かしているサーバーから見えるパスである必要があります。Dockerで動かしている場合は、ホストの共有フォルダをコンテナにマウントしておきます)。
このノードはファイルをバイナリデータとして読み込みます。次のExtract from Fileノードへ、このバイナリを渡すのがポイントです。

ステップ3:Extract from Fileで表を行データに変換する
「Extract from File」ノードは、CSV・XLSX・HTML・JSONなどのファイルから中身を取り出す核心のノードです。操作を「Extract From Excel(.xlsx)」にすると、Excelの各行が1件ずつのJSONオブジェクトに変換され、後続のノードで扱える形になります。
複数シートがある場合は対象シートを指定します。1行目をヘッダー(列名)として扱う設定にしておくと、各列の値が「商品コード」「単価」といったキー名で取り出せます。

ステップ4:列名をフィールドコードに対応づける
Extract from Fileが出力するキーは、Excelの列名(日本語)です。一方、Kintoneノードに渡すべきはフィールドコード(英数字)なので、ここで橋渡しをします。
「Edit Fields(Set)」ノードで、product_code = {{ $json["商品コード"] }} のように1列ずつ対応づけていきます。列数が多い場合や型変換をまとめたい場合は「Code」ノードでJavaScriptを書いた方が早いこともあります。

ステップ5:HTTP Requestノードでkintoneにレコードを書き込む
最後に「HTTP Request」ノードを追加します。前述のとおりkintone専用ノードはないため、ここでkintoneのREST APIを直接呼び出します。Authenticationには、ステップ3で作成したHeader Auth認証情報(X-Cybozu-API-Token)を指定します。操作ごとのメソッドとURLは次のとおりです({サブドメイン}は自社のものに置き換えます)。
- 取得・検索:
GEThttps://{サブドメイン}.cybozu.com/k/v1/records.json(クエリにapp=アプリID、query=絞り込み条件) - 追加:
POSThttps://{サブドメイン}.cybozu.com/k/v1/records.json(ボディにappとrecords=レコード配列) - 更新:
PUThttps://{サブドメイン}.cybozu.com/k/v1/records.json(ボディにappとrecords。各レコードに更新キーupdateKeyを指定)
JSON例:
{
"app": 101,
"records": [
{
"updateKey": {
"field": "product_code",
"value": "{{ $('Edit Fields').item.json.product_code }}"
},
"record": {
"product_name": { "value": "{{ $('Edit Fields').item.json.product_name }}" },
"unit_price": { "value": "{{ $('Edit Fields').item.json.unit_price }}" },
"quantity": { "value": "{{ $('Edit Fields').item.json.quantity }}" }
}
}
]
}今回のように「あれば更新・なければ追加」を実現する確実な方法は、検索してから分岐する構成です。まずGETで product_code が一致するレコードを検索し、「IF」ノードで存在を判定 → あればPUTで更新・なければPOSTで追加、とつなぎます。更新側のPUTでは、更新キー(updateKey)に重複禁止を設定した product_code を指定すると、レコードIDを知らなくても該当レコードを更新できます。いずれの方法でも、判定に使うフィールドはkintone側で重複禁止に設定しておくことが前提です。
Get:

IF:

PUT:

POST:

全体像:

(任意)ステップ6:完了通知とエラーハンドリング
実用面では、最後にSlackやメールへ「○件を同期しました」と通知するノードを足しておくと、毎朝の同期が成功したかどうかを把握できて安心です。あわせて、Kintoneノードの設定で「エラー時にワークフローを止める/続行する」の挙動を決め、失敗した行だけを別途記録する分岐を用意しておくと運用が安定します。
■実行してみる
組み上がったら、まず手動実行「Execute workflow」でテストします。Excelにテストデータを入れて走らせ、kintone側に正しくレコードが追加されるかを確認します。続いて、Excelの既存行の値を書き換えて再実行し、新規追加ではなく更新として反映されることを確認できれば、「あれば更新・なければ追加」の同期は成功です。
問題なければSchedule Triggerを有効化します。以降は毎朝、人手を介さずにExcel→kintoneの同期が走り続けます。
フロー画面:

利用したExcel:

実行結果(kintone):

■つまずきやすいポイント
実際に組んでみると、「ノードはつながったのに思った通りに入らない」という場面はたいてい次のどれかが原因です。
更新キーは重複禁止フィールドであること。 Upsertの更新キーに指定するフィールドは、kintone側で「値の重複を禁止する」が有効になっている必要があります。ここが未設定だとUpsertが機能しません。
日付・数値の型変換。 Excelの日付はシリアル値(数値)として読み込まれることがあり、そのままではkintoneの日付フィールド(YYYY-MM-DD形式を期待)に入りません。Setノードやcodeノードで明示的に文字列・日付へ変換します。数値フィールドに空文字やカンマ区切りの数字を渡すとエラーになるため、ここも整形が必要です。
ドロップダウン・チェックボックスの選択肢一致。 kintoneの選択肢系フィールドは、アプリに登録済みの選択肢と完全一致する値しか受け付けません。Excel側の表記ゆれ(全角/半角、前後の空白など)は事前に揃えておきます。
CSV経由にする場合の文字コード。 ExcelをいったんCSVに出して取り込む構成にする場合、文字コード(UTF-8/Shift_JIS)の指定を誤ると文字化けします。
1リクエストあたりの件数。 kintoneのREST APIは1リクエストで扱えるレコード数に上限(100件)があります。大量データを一気に同期する場合は、Loop(バッチ処理)ノードで分割し、APIのレート制限にも配慮します。
■セキュリティと運用上の注意
業務データを自動で流し込む仕組みである以上、セキュリティと運用設計は外せません。
セルフホスト版は必ず最新版で運用する。 2025年12月、n8nのワークフロー式評価に起因する深刻なリモートコード実行(RCE)の脆弱性 CVE-2025-68613(CVSSスコア9.9) が公表されました。認証済みユーザーが細工した式を通じて任意コードを実行できる可能性があるもので、修正済みバージョンへのアップデートが必須です。セルフホストで運用する場合は、最新版へ更新する・インターネットへ直接公開しない・最小権限で動かす、といった基本対策を徹底してください。
APIトークンの権限は最小限に。 今回のように削除を行わないなら削除権限は付けない、対象アプリだけに絞る、といった原則を守ります。トークンはn8nのCredentialsで安全に保管し、ワークフローのエクスポート時に値が混入しないよう注意します。
認証情報やファイルの取り扱い。 共有フォルダのアクセス権、n8nサーバーの設置場所(社内ネットワーク内に閉じるか)など、データが社外に出ない経路設計を確認しておきます。
■ライセンスの確認(特にクライアント向けに提供する場合)
n8nは「Sustainable Use License」というfair-codeライセンスを採用しています。自社内の業務目的での利用や、クライアント向けにワークフローを構築する受託・コンサルティング業務は無償で認められています。 一方で、n8nを自社製品に組み込んで販売したり、ホスティングして外部顧客に課金したりする場合は、別途、商用ライセンス(Embed/Enterprise)の契約が必要になります。kintoneのパートナーや受託開発者が「顧客にn8n環境ごと提供する」ケースでは、ここの線引きを事前に確認しておくと安全です。
■まとめ
n8nのセルフホスト版を使えば、社内共有フォルダのExcelをkintoneへ自動同期する仕組みを、コードをほとんど書かずに構築できます。Schedule Trigger・Read/Write Files from Disk・Extract from File・Kintoneという4〜5個のノードをつなぐだけで、これまで手作業だった転記が毎朝自動で片付くようになります。
そして見逃せないのが、この自動化がkintoneのREST API経由で動くため、利用コースやライセンスを問わないという点です。標準のkintone AIが使えない開発者ライセンスやライトコースの環境でも、n8nなら業務自動化や生成AIとの連携を進められます。「Excel管理からkintoneへ」という王道のデジタル化を、最後のひと手間である転記まで含めて滑らかにする ── n8nはそのための実用的な選択肢だと、実際に組んでみて感じました。
次回は、この同期フローに生成AI(OpenAI/Claude)のノードを足し、取り込んだデータの分類や要約まで自動化する構成を試す予定です。
■参考情報(一次情報)
- n8n 公式ドキュメント
- n8n Extract from File ノード ドキュメント
- n8n Kintone ノード ドキュメント
- Sustainable Use License(n8n 公式)
- kintone REST API(レコードの更新/Upsert)
- DevpediaCode「n8nとは?AIワークフロー自動化基盤の全体像をわかりやすく解説」
※本記事は2026年6月時点で公開されている公式情報をもとに作成しています。n8n・kintoneともに仕様やノードの名称・バージョンは更新される可能性があるため、構築時は最新の公式ドキュメントをご確認ください。スクリーンショットは各ステップの設定画面を撮影して挿入してください。