GODRICH

繰り返し作業 自動化、アカウント登録前に n8n で確認

n8nはアプリやAPIをコードなしでつなぎ自動化を作るツールです。アカウント登録の前に、繰り返し作業 自動化が本当に使えるか確かめたい人のために、そのまま実行できる9個を用意しました。

自動再生 · タイルを押すとその項目へ · すべて1つのzip

9個は実際に繰り返し業務が自動化されていく順番で並べました。まず毎日・毎週・毎月決まった時刻に動く基本パターン3つ(01日次・02週次・03月次)から始め、つまずきやすいタイムゾーンの罠(04)とトリガーの書き方(05)を確認し、そもそも動かすかどうかを条件で分ける方法(06)と実行漏れを追いつく方法(07)を経て、最後に結果を送れる形に整える2つ(08メール本文・09取得から整形までの3段パイプライン)で締めくくります。実際の業務自動化もたいてい、まず動かして、時刻を確認して、例外を除いて、見た目を整えるという同じ順で仕上がります。

01毎日のタスク要約

Schedule トリガーが毎朝8時に起動し(Manual Trigger でもすぐテストできます)、HTTP Request がタスク一覧を取得します。Filter が1人分だけ残し、Code ノードが完了済みをチェックボックスで示した5行の要約を作ります。朝の業務ブリーフィングや完了項目の確認のように、毎日同じことを確かめる場面で使います。

Schedule triggerAtHourFilter → CodeV2 실행 확인
{
  "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)ごとにグループを分けてから数えます。週次エンゲージメントレポートや投稿別リアクション集計のように、毎週同じ指標を見る場面で使います。

Schedule triggerAtDayCode → SummarizeV2 실행 확인
{
  "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 ノードも挟まず文章形式のレポートを直接作ります。ノード数が少ないほど壊れる場所も少なくなります。月次状況メールや登録者数の報告のように、毎月一度状況を知らせたい場面で使います。

Schedule 매월 1일Code 단독 리포트V2 실행 확인
{
  "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つの値が食い違って出てきます。スケジュールが意図しない時刻に動く問題の診断をしたいときに、そのまま再現して原因を確かめられます。

timezone Asia/Seoul$now vs Date()V2 실행 확인
{
  "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 で書き分けます — 「毎月最終平日」のような条件はその一例です。

Schedule ×2cronExpressionV2 실행 확인
{
  "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 フィールドで合流します。営業日だけ動く通知や週末の無音化が必要なときに、そのまま使えるパターンです。

IF 주말 분기HTTP → MergeV2 실행 확인
{
  "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 が自分の停止時間に気づく方法です。サーバー再起動後の漏れ検知や、実行履歴なしで間隔を測りたいときに使うパターンです。

Schedule 15분$getWorkflowStaticDataV2 실행 확인
{
  "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・メール通知の本文を作るときにそのまま使えます。

Sort → LimitMarkdown → HTMLV2 실행 확인
{
  "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段階に行き着きます。日次天気ブリーフィングや、汎用レポートパイプラインの骨格が欲しいときに使います。

HTTP → CodeMarkdown 리포트V2 실행 확인
{
  "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 をもう少し学びたい方は 自動化カテゴリー でこの流れの続きの例が見られ、このサイトがどんな基準で検証しているかは 紹介ページ にまとめてあります。

解凍パスワードを入力してください

パスワードはこの記事の本文の中にあります。読み進めると出てきます。