繰り返し作業 自動化、アカウント登録前に n8n で確認
n8nはアプリやAPIをコードなしでつなぎ自動化を作るツールです。アカウント登録の前に、繰り返し作業 自動化が本当に使えるか確かめたい人のために、そのまま実行できる9個を用意しました。
自動再生 · タイルを押すとその項目へ · すべて1つのzip
- 01 毎日のタスク要約
- 02 週次ウィンドウ集計
- 03 月次レポートの骨格
- 04 ワークフロー時計 vs サーバー時計
- 05 間隔指定 vs cron 式
- 06 週末をスキップする条件ゲート
- 07 実行漏れのキャッチアップ
- 08 ダイジェストメール本文
- 09 取得・変換・整形の3段パイプライン
9個は実際に繰り返し業務が自動化されていく順番で並べました。まず毎日・毎週・毎月決まった時刻に動く基本パターン3つ(01日次・02週次・03月次)から始め、つまずきやすいタイムゾーンの罠(04)とトリガーの書き方(05)を確認し、そもそも動かすかどうかを条件で分ける方法(06)と実行漏れを追いつく方法(07)を経て、最後に結果を送れる形に整える2つ(08メール本文・09取得から整形までの3段パイプライン)で締めくくります。実際の業務自動化もたいてい、まず動かして、時刻を確認して、例外を除いて、見た目を整えるという同じ順で仕上がります。
01毎日のタスク要約
Schedule トリガーが毎朝8時に起動し(Manual Trigger でもすぐテストできます)、HTTP Request がタスク一覧を取得します。Filter が1人分だけ残し、Code ノードが完了済みをチェックボックスで示した5行の要約を作ります。朝の業務ブリーフィングや完了項目の確認のように、毎日同じことを確かめる場面で使います。
{
"name": "Build Summary",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"parameters": {
"jsCode": "const items = $input.all();\nconst lines = items.map(item => `- [${item.json.completed ? 'x' : ' '}] ${item.json.title}`);\nconst summary = `# Daily Summary\\n\\n${items.length} to-dos for user 3 today\\n\\n` + lines.join('\\n');\nreturn [{ json: { summary } }];"
}
}
02週次ウィンドウ集計
Schedule が毎週月曜9時に起動し、HTTP でコメント全件を取得すると、Code が今週分だけ残します。Aggregate と違い、この Summarize ノードは投稿(postId)ごとにグループを分けてから数えます。週次エンゲージメントレポートや投稿別リアクション集計のように、毎週同じ指標を見る場面で使います。
{
"name": "Count Per Post",
"type": "n8n-nodes-base.summarize",
"typeVersion": 1.1,
"parameters": {
"fieldsToSummarize": {
"values": [
{ "aggregation": "count", "field": "id" }
]
},
"fieldsToSplitBy": "postId",
"options": { "outputFormat": "separateItems" }
}
}
03月次レポートの骨格
Schedule が毎月1日9時に起動し、HTTP でユーザー一覧を取得すると、Code ノード1つだけで Aggregate も Markdown ノードも挟まず文章形式のレポートを直接作ります。ノード数が少ないほど壊れる場所も少なくなります。月次状況メールや登録者数の報告のように、毎月一度状況を知らせたい場面で使います。
{
"name": "Build Monthly Report",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"parameters": {
"jsCode": "const users = $input.all().map(item => item.json);\nconst lines = users.map(u => `- ${u.name} <${u.email}>`);\nconst monthlyReport = `# Monthly Report\\n\\n${users.length} users on file this month.\\n\\n` + lines.join('\\n');\nreturn [{ json: { monthlyReport } }];"
}
}
04ワークフロー時計 vs サーバー時計
ワークフロー設定にタイムゾーンを固定すると Schedule はその時刻で起動しますが、Code ノードの中でその時間帯に従う $now と、常に UTC のままの素の JS Date を並べて出力すると、同じ瞬間なのに2つの値が食い違って出てきます。スケジュールが意図しない時刻に動く問題の診断をしたいときに、そのまま再現して原因を確かめられます。
{
"name": "Compare Clocks",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"parameters": {
"jsCode": "const workflowNow = $now.toFormat('yyyy-LL-dd HH:mm:ss');\nconst workflowZone = $now.zoneName;\nconst serverNow = new Date().toISOString();\nreturn [{ json: { workflowNow, workflowZone, serverNow } }];"
}
}
05間隔指定 vs cron式
Schedule トリガーを2つ並べます。1つは Hours フィールドに6を、もう1つは Custom(Cron) フィールドに 0 */6 * * * を書き、同じ6時間間隔を2つの文法で表現します。単純な周期は UI で、複雑な条件は cron で書き分けます — 「毎月最終平日」のような条件はその一例です。
{
"name": "Every 6 Hours (Cron)",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.4,
"parameters": {
"rule": {
"interval": [
{ "field": "cronExpression", "expression": "0 */6 * * *" }
]
}
}
}
06週末をスキップする条件ゲート
Code が月〜日7件のサンプル日付を作ると、IF が週末かどうか(dayOfWeek が0か6)で分岐し、平日は投稿を取得してレポートを作り、週末はすぐスキップします。どちらの枝も Merge の後、同じ action フィールドで合流します。営業日だけ動く通知や週末の無音化が必要なときに、そのまま使えるパターンです。
{
"name": "Is Weekend",
"type": "n8n-nodes-base.if",
"typeVersion": 2.3,
"parameters": {
"conditions": {
"conditions": [
{ "leftValue": "={{ $json.dayOfWeek }}", "rightValue": 0, "operator": { "type": "number", "operation": "equals" } },
{ "leftValue": "={{ $json.dayOfWeek }}", "rightValue": 6, "operator": { "type": "number", "operation": "equals" } }
],
"combinator": "or"
}
}
}
07実行漏れのキャッチアップ
Schedule は15分ごとに動くはずですが、Code ノードがワークフロー自身の静的データ($getWorkflowStaticData)に最終実行時刻を覚えておき、今回は何分経過し何回分を逃したかを計算します。n8n が自分の停止時間に気づく方法です。サーバー再起動後の漏れ検知や、実行履歴なしで間隔を測りたいときに使うパターンです。
{
"name": "Detect Missed Runs",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"parameters": {
"jsCode": "const staticData = $getWorkflowStaticData('node');\nconst expectedIntervalMinutes = 15;\nconst now = Date.now();\nconst lastRun = staticData.lastRun || (now - expectedIntervalMinutes * 3 * 60000);\nconst elapsedMinutes = Math.round((now - lastRun) / 60000);\nconst missedRuns = Math.max(0, Math.floor(elapsedMinutes / expectedIntervalMinutes) - 1);\nstaticData.lastRun = now;\nreturn [{ json: { elapsedMinutes, missedRuns } }];"
}
}
08ダイジェストメール本文
Schedule が3時間ごとに RSS の最新記事を読み込み、Sort が新しい順に並べ、Limit が5件に絞ると、Code がタイトルと挨拶文を Markdown に組み立て、Markdown ノードがそれをメールにそのまま貼れる HTML に変換します。定期ニュースレターや、Slack・メール通知の本文を作るときにそのまま使えます。
{
"name": "Markdown to HTML",
"type": "n8n-nodes-base.markdown",
"typeVersion": 1,
"parameters": {
"mode": "markdownToHtml",
"markdown": "={{ $json.markdown }}",
"destinationKey": "emailHtml",
"options": {}
}
}
09取得・変換・整形の3段パイプライン
Schedule が毎日6時にキー不要の天気 API から3日分の予報を取得し、Code が最高・最低気温の平均を変換し、Markdown ノードが文章形式のレポートに整形します。ほとんどのレポートワークフローはこの3段階に行き着きます。日次天気ブリーフィングや、汎用レポートパイプラインの骨格が欲しいときに使います。
{
"name": "Build Report",
"type": "n8n-nodes-base.markdown",
"typeVersion": 1,
"parameters": {
"mode": "markdownToHtml",
"markdown": "={{ '# Weather Report — ' + $json.reportDate + '\\n\\n3-day average high: ' + $json.avgHigh + '°C\\n3-day average low: ' + $json.avgLow + '°C' }}",
"destinationKey": "report",
"options": {}
}
}
準備物 — アカウント・権限・バージョン
どの行も準備物は「なし」ですが、検証時刻と n8n バージョンが項目ごとに違うため表にしています。等級は V0(構造)・V1(インポート確認)・V2(実行確認)の3段階で、この記事は9個すべてが V2です。
| 項目 | 等級 | 準備物 | n8n バージョン |
|---|---|---|---|
| 01 毎日のタスク要約 | V2 | なし | 2.38.5 |
| 02 週次ウィンドウ集計 | V2 | なし | 2.38.5 |
| 03 月次レポートの骨格 | V2 | なし | 2.38.5 |
| 04 ワークフロー時計 vs サーバー時計 | V2 | なし | 2.38.5 |
| 05 間隔指定 vs cron式 | V2 | なし | 2.38.5 |
| 06 週末をスキップする条件ゲート | V2 | なし | 2.38.5 |
| 07 実行漏れのキャッチアップ | V2 | なし | 2.38.5 |
| 08 ダイジェストメール本文 | V2 | なし | 2.38.5 |
| 09 取得・変換・整形の3段パイプライン | V2 | なし | 2.38.5 |
取り込み方は3通りあります。n8n キャンバスに Ctrl/Cmd+V で JSON テキストをそのまま貼り付けるか、キャンバスメニューの Import from File で zip 内のファイルを選ぶか、CLI なら n8n import:workflow --input=ファイル.json の1行で済みます。取り込んだ後は、キャンバス左上の Test workflow ボタン(または Manual Trigger ノードの再生アイコン)を押せばそのまま動きます。
どこで壊れるか — 実際に見つかった罠1つ
最もつまずきやすいのは04項目のタイムゾーンです — ワークフロー設定でタイムゾーンを固定すると Schedule の起動時刻や $now 式はそれに従いますが、Code ノードの中で何気なく new Date() を使うと、サーバーのシステム時刻(たいてい UTC)のままになります。この2つを混ぜると「9時に動いているはずなのにレポートには真夜中と出る」ようなバグが起きます。この zip を開く際のパスワードは kenrd2uf で、解凍すると workflows/ の下に9個の JSON がそのまま入っています。02項目の Summarize ノードにも似た落とし穴があります — 出力フィールド名は自分で付けた名前ではなく count_id のように集計方法とフィールド名が自動で組み合わさった名前なので、count とだけ書くと次のノードがそのフィールドを見つけられません。
FAQ
n8nを初めて使いますが、先にアカウントを作る必要がありますか?
いいえ。この zip の9個のワークフローはどれもコミュニティノードやアカウントが必要な認証情報を使わないので、ローカルや無料の n8n インスタンスに取り込むだけで Manual Trigger からすぐ動かせます。
自分の n8n バージョンが違う場合はどうすればいいですか?
typeVersion エラーが出たら、そのノードをキャンバスで新しく作って export し、実際に使える値を確認してから使ってください。この zip は n8n 2.38.5(Node 24)でインポート・実行の両方を確認済みです。
Google スプレッドシートや Slack のような実際の宛先につなぐには?
HTTP Request ノードや、レポートを作る最後の Code ノードを、必要な宛先(Google Sheets・Slack・メールなど)に差し替えれば済みます。キーが必要なノードは Authentication オプションで認証情報を別途追加し、ワークフローの JSON に値を直接書いて共有しないのが n8n公式ドキュメント の推奨する方法です。
n8n をもう少し学びたい方は 自動化カテゴリー でこの流れの続きの例が見られ、このサイトがどんな基準で検証しているかは 紹介ページ にまとめてあります。