中級向けn8n 公式テンプレート承認済み
月次報告のスライドを自動作成
Google Chat やフォームで「9月の売上報告」と頼むと、スプレッドシートの数字から、合計・先月比・上位の項目・グラフの入った Google スライドができます。
AI(Claude)が読むのは「何月分か」だけです。数字はすべてコードが計算し、Claude が書くまとめの文も、中の数字をコードが照らします。
試したとき、Claude は 24% と 21% を勝手に足して「45%」と書きました。データにない数字なので、コードがまとめを差し替えました。
人の手間は、どう変わるか
Before(人が手でやっていたこと)
- 毎月、シートでその月の行を絞り込み、合計と先月比を計算する
- グラフを更新して、スライドに数字とグラフを貼り直す
- 一言のまとめを書き、数字が合っているかを見直す
After(このワークフローを入れると)
- チャットで「9月の売上報告」と頼むと、数字とグラフの入ったスライドのリンクが返ってくる
- 合計・先月比・件数・平均・上位の項目は、コードがシートから計算する
- AI のまとめにデータにない数字があれば、コードが作った素朴なまとめに差し替える
それでも人に残ること
- スライドを開いて、中身と言い回しを確かめる
- もとのシートを、正しく保つ
公開
動作確認: — n8n 2.36.8 / Claude Haiku 4.5 / Google スプレッドシート・スライド・ドライブ / Google Chat(Google Workspace)
n8n 公式テンプレート: 英語版が n8n の審査を通過しました()。注記を読む
この記事で配っている JSON は、n8n に出した英語版と同じものです(審査のあとで n8n 側が手を入れていれば、公式のページの版のほうが新しい)。n8n が内容を保証するものではありません。 n8n 公式のページ(英語版)を見る
月次報告のスライドに、AI の書いた数字が紛れ込むと困ります。だからこのワークフローは、スライドに載る数字を、すべてコードに計算させます。 AI(Claude)に任せるのは、「9月の売上報告」から何月分かを読むことと、計算済みの数字から3行のまとめの文を書くことだけです。
それでも、まとめの文には数字が入ります。そこで、まとめの中の数字を、コードが1つずつ照らします。 試したとき、Claude は「Cold brew pack と Coffee beans で、合わせて売上の 45%」という意味の一文を書きました(実際の文は英語)。24% と 21% を、自分で足した数字です。指示では「数字を計算しない」と書いていました。データにない数字なので、コードはそのまとめを使わず、コードが作った素朴なまとめに差し替えました。
monthly-report-slides.json をダウンロード(n8n 公式テンプレートとして承認された英語版と同じファイル)
AI に任せるのは、月を読むことと、まとめの文だけ
| どこで | AI がすること | コードがすること |
|---|---|---|
| 依頼を読む | 「9月の売上報告」から、何月分か(2026-09)と、そう読んだ言葉(「9月」)を返す |
その言葉が依頼文にあるかを確かめ、月を言葉から自分で計算して照らす。未来の月、データのない月は止める |
| 数字 | (何もしない) | シートから、合計、先月比、件数、平均、取引先の数、上位の項目を計算する。グラフのもとになる Report タブも書き換える |
| まとめ | 計算済みの数字だけを渡されて、3行の文を書く | 文の中の数字が、渡した数字の中にあるかを1つずつ照らす。1つでもなければ、コードが作ったまとめに差し替える |
まとめの照らし方は、単純です。渡した数字(「¥432,000」「+7.5%」「41%」など)を一覧にしておき、まとめの文から数字を抜き出して、一覧にないものが1つでもあれば不採用にします。
試した結果
架空のコーヒー豆の卸の売上(8月〜10月、63行)で試しました(2026年10月20日。Claude Haiku 4.5、各1回)。
| 依頼 | どこから | 結果 |
|---|---|---|
| 9月の売上報告を作って(1回目) | Chat と同じ形のデータ | 作成。売上 ¥432,000(8月比 +7.5%)、26件、5社。AI のまとめは不採用(「45%」)。代わりにコードのまとめを載せた |
| 9月の売上報告を作って(2回目) | Chat と同じ形のデータ | 作成。AI のまとめの数字がすべて一致し、採用 |
| 今月の売上報告 | Chat と同じ形のデータ | 作成。月の途中なので「Oct 1–20」を「Sep 1–20」と比べた(¥306,200、−2.5%) |
| Sales report for last month please | Chat と同じ形のデータ | 作成(9月分) |
| 7月の売上報告をお願い | Chat と同じ形のデータ | 止まった: 7月のデータがない |
| 売上報告のスライドを作って | Chat と同じ形のデータ | 止まった: 月が書かれていない |
| 来月の売上報告 | Chat と同じ形のデータ | 止まった: 「来月」から月を読めない |
| 9月の売上報告を作って | 本物の Google Chat | 作成。返事まで 10.2秒。「Open the slides」のボタンで開く |
| 8月の売上報告(最終版) | 本物の Google Chat | 作成。12.1秒(¥402,000) |
| 9月の問い合わせ報告を作って | Config だけ変えた(問い合わせ、経路ごとに1行1件で数える) | 作成。41件、8月比 +36.7%、1位は LINE の17件(+70.0%)。サンプルを作ったときに数えた数と一致 |
作って見つけた5つの落とし穴
1. 「計算するな」と書いても、AI はまとめの中で計算した
まとめを書かせる指示には、「数字を計算・丸め・変換しない。事実に書かれたとおりに写す」と書いていました。それでも1回目のまとめには、次の一文がありました。
Cold brew pack surged +194.1% to ¥90,000, while Coffee beans 1kg grew +83.3% to ¥105,600, collectively representing 45% of total sales.
「合わせて売上の45%」の 45% は、21% と 24% を足した数字です。
足し算自体は正しいのですが、スライドに載せる数字は、コードが計算したものだけというのが、この作りの約束です。指示だけでは守られないので、コードで照らす部分が要ります。2回目は、渡した数字だけを使ったまとめになり、そのまま採用されました。同じ指示でも、回によって守られたり守られなかったりします。
2. シートとつながったグラフは、前の月の資料まで変える
最初は、ひな形に、シートとつながったグラフ(リンクされたグラフ)を置き、スライドを作るたびに「更新」させていました。ところが、コピーしたスライドのグラフも、元のシートとつながったままです。Report タブは毎回書き換わるので、9月の資料でグラフの「更新」を押すと、最後に作った月のグラフに変わってしまうはずです(押して確かめてはいません)。
そこで、グラフは つながっていない画像 として入れる形に変えました(Slides API の createSheetsChart で、linkingMode を NOT_LINKED_IMAGE にする)。作ったスライドが、あとから変わることはありません。Slides API で、入ったものがグラフではなく画像であることを確かめました。
グラフを置く場所は、ひな形に {{chart}} と書いたテキストボックスを置いてもらい、その位置と大きさに入れて、テキストボックスは消します。利用者が、自分のひな形のどこにでも置けるようにするためです。
3. 数字を照らすコードに、私のバグがあった
1回目で不採用になったまとめには、「45%」のほかにも、データにないと判定された数字がありました。「¥432,000,」のように、数字の後ろの読点まで拾っていたのが原因で、正しい数字まで「データにない」とされていました。照らす側のコードが間違えると、正しいまとめまで捨てることになります。数字を抜き出す正規表現を直してから、2回目以降を試しています。
4. n8n の式の中に }}} があると、壊れる
サンプルのシートにグラフを足す処理で、送る JSON の終わりが }}} になり、n8n が式({{ }})の終わりと読み違えて、エラーになりました。中身が固定の JSON は、式にせず、そのまま書くと避けられます。
5. Google スライドの API の細かい決まり
ひな形をワークフローで作るときに、2つ詰まりました。どちらも、エラーの文から分かりました。
- スライドを作るときのレイアウトは、
predefinedLayoutを直接ではなく、slideLayoutReference: { predefinedLayout: 'TITLE' }の形で指定する - スライドなどに付ける ID(
objectId)は、5文字以上でないといけない
売上以外の報告にも使える
Config で、使うタブと列、スライドに出す言葉を指定します。日付の列、分ける列、数える列がある表なら、報告にできます。数える列を空にすると、1行を1件として数えます。
| 報告の例 | 日付の列 | 分ける列 | 数える列 |
|---|---|---|---|
| 売上(サンプル) | 売上日 | 商品 | 金額 |
| 問い合わせ | 受付日 | 経路(電話・メール・LINE) | 空(1行1件) |
| 経費 | 利用日 | 費目 | 金額 |
| 残業 | 日付 | 部署 | 時間 |
1行1件で数えるときは、「平均」の行が意味を持たないので、ひな形からその行を消してください。
使うための設定
- 認証情報: Google スプレッドシート、Google ドライブ、Google スライド(いずれも OAuth2)、Anthropic
- スプレッドシート: データのタブ(サンプルは
Sales:date, customer, product, amount)と、グラフを1つだけ置いたReportタブ。グラフの範囲は、A〜C列で、分ける項目の数+見出しの行まで - スライドのひな形: 次の文字を、好きな場所に置く。グラフを入れたい場所には、
{{chart}}とだけ書いたテキストボックスを置く{{report_title}} {{period}} {{prev_period}} {{prepared_on}} {{value_label}} {{group_label}} {{entry_label}} {{average_label}} {{distinct_label}} {{total}} {{vs_last_month}} {{entries}} {{average}} {{distinct}} {{top_groups}} {{summary}} - Config: シートとひな形の ID、使う列、スライドに出す言葉、通貨、タイムゾーン、まとめの言語
- フォームで試す。 Google Chat から頼むには、請求書の下書きの記事と同じ準備(Google Workspace、Chat アプリ、外から届く n8n)が要ります
確認していないこと
- 実際の会社の売上データ。 試したのは、架空のデータです
- ほぼ同時に2つの報告を頼んだとき。 Report タブを共有しているので、グラフが混ざる可能性があります
- グラフの「更新」を押すと前の月の資料が変わる件は、つながったグラフをやめる前に、押して確かめてはいません(仕組みからの推測です)
- まとめが数字を別の書き方(「43万2千円」など)で書いた場合は、照らせずに不採用になるはずです(試していません)
次に読む
- 同じ「AI に数字を書かせない」作りで、請求書を作るのは 請求書の下書きを自動作成
- AI に任せる範囲を、手作業から決める考え方は AI 導入は、手作業から始める
- AI に「送る」を任せない設計は AI エージェントの暴走は、指示では防げなかった
- Code ノードの使い方は n8n Code ノードの使い方