月次レポートは「書く」のに時間がかかりすぎる

月次レポートのつらさは、作成そのものより「定型作業を毎月繰り返す」ことにある。数字はスプレッドシートにある。言うべきことも大体決まっている。それでも「数字を見て→文章にして→整形して→配布する」のルーティンが2〜3時間を食う。

Googleスプレッドシート→Claude→Notionのフローを作ると、このルーティンを15分程度に圧縮できる。実際の数字は人間が確認してコメントを加えるが、定型の文章部分はAIに任せる設計だ。

フロー全体の設計

自動化のフローはシンプルに3ステップで設計する。

  1. GoogleスプレッドシートのデータをClaudeが読める形式に変換する
  2. Claudeにレポート文章を生成させる
  3. 生成した文章をNotionのページに書き込む

全体をつなぐ方法はいくつかある。GASを使う(無料・シンプル)、MakeやZapierを使う(ノーコード・月額あり)、Pythonスクリプトを書く(柔軟・要開発スキル)のどれかだ。ここではGAS(Google Apps Script)を使ったシンプルな構成を説明する。

Step 1:スプレッドシートのデータを整形する

レポートに使うデータをスプレッドシートで管理している前提で進める。例として、以下のような月次KPIデータがあるとする。

指標当月先月前年同月
売上(万円)1,2501,100980
新規顧客数423831
解約率(%)1.82.12.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時間あれば完成する。毎月繰り返す定型業務の時間削減効果は大きく、浮いた時間を「考える仕事」に使えるようになるのが最大のメリットだ。