月次レポートは「書く」のに時間がかかりすぎる
月次レポートのつらさは、作成そのものより「定型作業を毎月繰り返す」ことにある。数字はスプレッドシートにある。言うべきことも大体決まっている。それでも「数字を見て→文章にして→整形して→配布する」のルーティンが2〜3時間を食う。
Googleスプレッドシート→Claude→Notionのフローを作ると、このルーティンを15分程度に圧縮できる。実際の数字は人間が確認してコメントを加えるが、定型の文章部分はAIに任せる設計だ。
フロー全体の設計
自動化のフローはシンプルに3ステップで設計する。
- GoogleスプレッドシートのデータをClaudeが読める形式に変換する
- Claudeにレポート文章を生成させる
- 生成した文章をNotionのページに書き込む
全体をつなぐ方法はいくつかある。GASを使う(無料・シンプル)、MakeやZapierを使う(ノーコード・月額あり)、Pythonスクリプトを書く(柔軟・要開発スキル)のどれかだ。ここではGAS(Google Apps Script)を使ったシンプルな構成を説明する。
Step 1:スプレッドシートのデータを整形する
レポートに使うデータをスプレッドシートで管理している前提で進める。例として、以下のような月次KPIデータがあるとする。
| 指標 | 当月 | 先月 | 前年同月 |
|---|---|---|---|
| 売上(万円) | 1,250 | 1,100 | 980 |
| 新規顧客数 | 42 | 38 | 31 |
| 解約率(%) | 1.8 | 2.1 | 2.5 |
GASで、このシートのデータを取得してClaudeに渡せるテキスト形式に変換する。
function getSheetData() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('月次KPI');
const data = sheet.getDataRange().getValues();
// ヘッダー行と各行をテキスト化
const headers = data[0];
const rows = data.slice(1);
let text = '【月次KPIデータ】\n';
rows.forEach(row => {
headers.forEach((header, i) => {
text += `${header}: ${row[i]}\n`;
});
text += '\n';
});
return text;
}
Step 2:GASからClaude APIを呼び出す
GASはHTTPリクエストが送れるため、Claude APIに直接リクエストを送れる。APIキーは Google Apps ScriptのScript Propertiesに保存しておく(コードに直接書かない)。
function generateReport(kpiData) {
const apiKey = PropertiesService.getScriptProperties().getProperty('CLAUDE_API_KEY');
const prompt = `以下のKPIデータを元に月次レポートの文章を作成してください。
${kpiData}
【出力形式】
## 今月のサマリー
(3〜5文で今月の全体的な状況を記述)
## 売上について
(前月・前年同月比を踏まえたコメント)
## 顧客動向
(新規・解約のトレンドのコメント)
## 来月の注目ポイント
(今月のデータから見えてくる課題・施策の方向性)`;
const response = UrlFetchApp.fetch('https://api.anthropic.com/v1/messages', {
method: 'post',
headers: {
'x-api-key': apiKey,
'anthropic-version': '2023-06-01',
'content-type': 'application/json'
},
payload: JSON.stringify({
model: 'claude-opus-4-5',
max_tokens: 1024,
messages: [{ role: 'user', content: prompt }]
})
});
const result = JSON.parse(response.getContentText());
return result.content[0].text;
}
Step 3:NotionページにAPIで書き込む
生成した文章をNotionに書き込むには、Notion APIを使う。NotionのIntegrationを作成してAPIキーを取得し、書き込み先のページIDを指定する。
function writeToNotion(reportText) {
const notionKey = PropertiesService.getScriptProperties().getProperty('NOTION_API_KEY');
const pageId = '書き込み先のページID';
// 今月の日付でページを作成
const today = new Date();
const title = `${today.getFullYear()}年${today.getMonth()+1}月 月次レポート`;
UrlFetchApp.fetch(`https://api.notion.com/v1/pages`, {
method: 'post',
headers: {
'Authorization': `Bearer ${notionKey}`,
'Content-Type': 'application/json',
'Notion-Version': '2022-06-28'
},
payload: JSON.stringify({
parent: { page_id: pageId },
properties: {
title: {
title: [{ text: { content: title } }]
}
},
children: [
{
object: 'block',
type: 'paragraph',
paragraph: {
rich_text: [{ type: 'text', text: { content: reportText } }]
}
}
]
})
});
}
全体をつなぐ関数と自動実行の設定
3つの関数をひとつにまとめ、GASのトリガーで毎月1日に自動実行する。
function monthlyReportFlow() {
const kpiData = getSheetData();
const reportText = generateReport(kpiData);
writeToNotion(reportText);
// 完了をメールで通知(任意)
GmailApp.sendEmail(
Session.getActiveUser().getEmail(),
'月次レポートが生成されました',
`Notionに月次レポートを作成しました。\n内容を確認して必要に応じて編集してください。`
);
}
GASのトリガーで「月のタイマー」を設定すると、毎月指定日に自動実行できる。
人間が確認・編集する部分
AIが生成したレポートをそのまま提出するのはリスクがある。以下は必ず人間が確認する。
- 数字の読み方が正しいか(前月比の計算ミスなど)
- 定性的なコメントが実態と合っているか
- 機密情報の取り扱いが適切か
AIに任せるのは「文章の下書き」であって、数字の解釈と最終判断は人間が行う。この役割分担を明確にしておくことが重要だ。
まとめ
Googleスプレッドシート→Claude API→Notion APIのフローを組むと、月次レポートの定型文章部分はほぼ自動化できる。実装はGASで1〜2時間あれば完成する。毎月繰り返す定型業務の時間削減効果は大きく、浮いた時間を「考える仕事」に使えるようになるのが最大のメリットだ。