SECTION 20

実践: 自動レポート配信システム

毎朝届く — 売上レポートを完全自動化

calendar_today2026年4月 LCREATOR.Inc Google AI 研修プログラム

SECTION 20 — 自動レポート配信システム

手動レポートが抱える3つの問題

PROBLEM
schedule

時間のムダ

毎朝1時間かけてスプレッドシートを開き、数値を拾い、メールを書く。月20日なら年間240時間が消える。

240h
年間の無駄な作業時間
bug_report

ミスの温床

コピー&ペーストのミス、古いデータの参照、計算式の見落とし。手動作業ではヒューマンエラーがゼロにならない

よくあるミス:
・先月のデータをそのまま送信
・集計範囲の指定ミス
・宛先の誤送信
person_off

属人化リスク

担当者が休暇・病欠・退職すると誰もレポートを出せない。業務が特定の人に依存してしまう。

起こりうること:
・担当者不在で報告が止まる
・引き継ぎに数週間かかる
・手順書がなく誰も理解できない
arrow_forward 解決策: GAS + Gemini API + Googleドキュメントで完全自動化。担当者不在でも毎朝8時にレポートが配信されます。

SECTION 20 — 自動レポート配信システム

自動レポートシステムの全体像

OVERVIEW
table_chart 売上データ スプレッドシート
arrow_forward
functions GAS集計 日次/週次/月次
arrow_forward
psychology AI分析 Gemini API
arrow_forward
description レポート生成 Googleドキュメント
arrow_forward
picture_as_pdf PDF変換 GAS
arrow_forward
send 自動配信 メール/Chatwork

使用するツール

  • Googleスプレッドシート(データ源)
  • Google Apps Script(自動化)
  • Gemini API(AI分析コメント)
  • Googleドキュメント(テンプレート)
  • Gmail / Chatwork Webhook

自動化で得られる効果

  • 毎朝1時間 → ゼロ(完全自動)
  • ヒューマンエラーをゼロに
  • 担当者不在でも配信継続
  • AIが前日比・異常値を自動コメント

スケジュール例

  • 毎朝7:30 — データ集計・AI分析
  • 毎朝8:00 — PDF生成・メール配信
  • 毎週月曜 — 週次サマリー配信
  • 毎月1日 — 月次レポート配信

SECTION 20 — 自動レポート配信システム

売上データのスプレッドシート設計

DATA DESIGN

GASで集計しやすいデータ構造を設計します。1行1トランザクションの原則を守ることが重要です。

列名 内容
date売上日date
product_id商品コードstring
product_name商品名string
categoryカテゴリstring
quantity販売数number
unit_price単価(円)number
revenue売上金額(円)number
region販売地域string
売上データスプレッドシート設計

シート構成の推奨設計

  • RAWデータシート: 生データのみ。手動編集禁止
  • 日次集計シート: GASが自動更新
  • AI分析シート: コメント・洞察を格納
  • 設定シート: 配信先・閾値を管理
warning
設計の注意点(黄: ヒント)
revenue列はformula(=quantity*unit_price)ではなく、GASで書き込む実数値にすると集計が安定します。

SECTION 20

集計と分析

GASで数値を集計し、Gemini APIが意味のある洞察を生成する

SECTION 20 — 集計と分析

GASで日次売上を自動集計する

GAS
GAS function aggregateDailySales() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const raw = ss.getSheetByName('RAWデータ'); const daily = ss.getSheetByName('日次集計'); // 昨日の日付を取得 const yesterday = new Date(); yesterday.setDate(yesterday.getDate() - 1); const targetDate = Utilities.formatDate( yesterday, 'Asia/Tokyo', 'yyyy/MM/dd' ); // RAWデータをフィルタして集計 const data = raw.getDataRange().getValues(); let totalRevenue = 0, totalQty = 0; data.slice(1).forEach(row => { if (row[0] === targetDate) { totalRevenue += row[6]; // revenue列 totalQty += row[4]; // quantity列 } }); // 日次集計シートに追記 daily.appendRow([ targetDate, totalRevenue, totalQty, new Date() ]); }

週次・月次集計の拡張

同じ関数に「集計タイプ」引数を追加することで日次/週次/月次を1関数で処理できます。DRYの原則を守りましょう。

集計する指標の設計

  • 当日売上(totalRevenue)
  • 前日比(vs_yesterday_rate)
  • 月累計(monthly_cumulative)
  • 目標達成率(target_achievement)
  • カテゴリ別内訳(category_breakdown)
lightbulb ヒント: appendRow()は処理が遅いため、大量行はsetValues()でまとめて書き込む方が高速です。

SECTION 20 — 集計と分析

Gemini APIで洞察コメントを自動生成する

AI ANALYSIS
GAS function generateInsight(salesData) { const prompt = ` 以下の売上データを分析し、経営層向けの 日次レポートコメントを生成してください。 【昨日の売上データ】 ・売上合計: ${salesData.revenue}円 ・前日比: ${salesData.vsYesterday}% ・目標達成率: ${salesData.targetRate}% ・カテゴリ別TOP3: ${salesData.top3} 【出力形式】 1. 売上サマリー(1文) 2. 注目ポイント(良い点・懸念点) 3. 明日に向けたアクション提案 各項目100文字以内、敬語で記述`; const apiKey = ScriptApp.getOAuthToken(); const response = UrlFetchApp.fetch( `https://us-central1-aiplatform.googleapis.com/...`, { method: 'post', payload: JSON.stringify({ contents: [{ parts: [{ text: prompt }] }] })} ); return JSON.parse(response.getContentText()) .candidates[0].content.parts[0].text; }

AI生成コメントの例

1. 売上サマリー
昨日の売上は1,250,000円と、先週同曜日比で+8.3%の好調な結果となりました。

2. 注目ポイント
飲料カテゴリが+22%と牽引。一方、雑貨は-5%で注意が必要です。

3. アクション提案
飲料の在庫補充を優先的に実施されることをお勧めします。

tips_and_updates ヒント(黄: 補足): プロンプトに「経営層向け」「100文字以内」など制約を入れると、ビジネス用途に適した文体・長さになります。

SECTION 20 — 集計と分析

Googleドキュメントのテンプレート置換

TEMPLATE

テンプレートドキュメントに「{{PLACEHOLDER}}」を埋め込み、GASで実際のデータに置換します。

GAS function generateReport(data, aiComment) { // テンプレートをコピーして新規ドキュメントを作成 const templateId = 'YOUR_TEMPLATE_DOC_ID'; const copy = DriveApp .getFileById(templateId) .makeCopy(`日次レポート_${data.date}`); const doc = DocumentApp.openById(copy.getId()); const body = doc.getBody(); // プレースホルダーを実データに置換 body.replaceText('{{DATE}}', data.date); body.replaceText('{{REVENUE}}', data.revenue.toLocaleString() + '円'); body.replaceText('{{VS_YESTERDAY}}', data.vsYesterday + '%'); body.replaceText('{{AI_COMMENT}}', aiComment); doc.saveAndClose(); return copy.getId(); }

テンプレートに入れる項目

プレースホルダー 内容
{{DATE}}レポート日付
{{REVENUE}}当日売上金額
{{VS_YESTERDAY}}前日比(%)
{{TARGET_RATE}}目標達成率
{{AI_COMMENT}}AI生成コメント
check_circle 推奨(緑): テンプレートはマスターとして保護フォルダに保存し、GASは常にコピーを作成して処理します。オリジナルを上書きしないことが重要です。

SECTION 20 — 集計と分析

GASでドキュメントをPDF化する

PDF
GAS function convertToPdf(docId, filename) { const docFile = DriveApp.getFileById(docId); // PDF変換URLを構築 const url = 'https://docs.google.com/feeds/download/' + 'documents/Export?id=' + docId + '&exportFormat=pdf'; // 認証トークンを使ってPDFを取得 const token = ScriptApp .getOAuthToken(); const response = UrlFetchApp.fetch(url, { headers: { Authorization: 'Bearer ' + token } }); const pdfBlob = response.getBlob() .setName(filename + '.pdf'); // 元のドキュメントは削除(不要ファイルを残さない) docFile.setTrashed(true); return pdfBlob; }

PDF変換の仕組み

  • Google DocsのExport APIを使用
  • ScriptApp.getOAuthToken()で認証
  • Blobオブジェクトとして取得
  • そのままGmailの添付ファイルに使用可能
error
注意(赤: リスク)
元のドキュメントを残したままにすると、Driveが毎日生成されたファイルで溢れます。処理後は必ず削除またはアーカイブフォルダに移動してください。
tips_and_updates スプレッドシートのPDF化: 同様の方法でスプレッドシートも「&exportFormat=pdf&gid=シートID」で特定シートのみPDF化できます。

SECTION 20

配信

メール・Chatwork・Slackへのマルチチャネル配信を設定する

SECTION 20 — 配信

GmailでPDF添付メールを自動配信する

EMAIL
GAS function sendReportEmail(pdfBlob, data) { // 設定シートから配信先を取得 const config = getConfig(); const recipients = config.emailRecipients; // メール本文(AI生成サマリーを含む) const subject = `【日次売上レポート】${data.date}`; const body = ` お疲れ様です。 ${data.date}の売上レポートをお送りします。 ■ サマリー ・売上合計: ${data.revenue.toLocaleString()}円 ・前日比: ${data.vsYesterday}% ・目標達成率: ${data.targetRate}% ■ AIコメント ${data.aiComment} 詳細はPDFをご確認ください。 --- 本メールは自動配信されています。 `; GmailApp.sendEmail(recipients, subject, body, { attachments: [pdfBlob], name: '売上管理システム' }); }

配信先管理の推奨設計(緑: 推奨)

配信先メールアドレスはスクリプトにハードコードせず、スプレッドシートの設定シートで管理します。非エンジニアでも変更できます。

// 設定シートから配信先を取得 const config = ss .getSheetByName('設定') .getRange('B2') .getValue();

複数宛先への配信

recipients にカンマ区切りで複数アドレスを指定できます。CC/BCCも options オブジェクトで設定可能です。

SECTION 20 — 配信

Chatwork / Slack Webhookで要約を通知する

WEBHOOK
GAS — Chatwork function sendChatwork(data, roomId) { const apiToken = PropertiesService .getScriptProperties() .getProperty('CHATWORK_TOKEN'); const message = `[info][title] 日次売上レポート ${data.date}[/title] 売上: ${data.revenue.toLocaleString()}円 前日比: ${data.vsYesterday}% 目標達成率: ${data.targetRate}% [${data.vsYesterday >= 0 ? '↑' : '↓'}AIコメント] ${data.aiComment}[/info]`; UrlFetchApp.fetch( `https://api.chatwork.com/v2/rooms/${roomId}/messages`, { method: 'post', headers: { 'X-ChatWorkToken': apiToken }, payload: { body: message } } ); }

Slack Webhookへの変更

const slackUrl = PropertiesService .getScriptProperties() .getProperty('SLACK_WEBHOOK'); UrlFetchApp.fetch(slackUrl, { method: 'post', contentType: 'application/json', headers: { 'Authorization': `Bearer ${token}` }, payload: JSON.stringify({ text: `売上: ${data.revenue}円` }) });
security
セキュリティ注意(赤: リスク)
APIトークン・WebhookURLは必ずスクリプトプロパティに保存。ソースコードに直接書かないこと。ソースコードはGit管理されることが多く、漏洩リスクがあります。

SECTION 20 — 配信

時間駆動トリガーで毎朝8時に実行する

SCHEDULE
1

メインの統合関数を作成

集計 → AI分析 → テンプレ置換 → PDF変換 → 配信 の全工程を1関数にまとめる

2

GASエディタでトリガー設定

左メニュー「トリガー」→「トリガーを追加」→「時間ベース」→「日タイマー」→「午前7〜8時」

3

テスト実行で確認

手動でmainReport()を実行し、メール受信・PDF品質・AIコメント内容を確認

4

翌朝の自動実行を確認

トリガー設定後、翌朝8時台にメールが届いていることを確認して本番運用開始

推奨トリガー構成

時刻 関数 内容
毎朝 7:30aggregateSales()データ集計
毎朝 8:00generateAndSend()レポート配信
毎週月曜weeklyReport()週次サマリー
schedule 集計と配信を分ける理由(黄: ヒント): 集計に時間がかかることがあるため、集計完了を確認してから配信する2段階構成が安全です。

SECTION 20

ハンズオン

実際に手を動かして自動レポート配信システムを構築しよう

SECTION 20 — ハンズオン

ハンズオン 1: 売上データ集計GASを作成する

HANDS-ON 1
1

スプレッドシートを準備

新規スプレッドシートを作成し「RAWデータ」「日次集計」「設定」の3シートを追加

2

サンプルデータを入力

RAWデータシートに配布のCSVデータを貼り付け(過去7日分、50行程度)

3

GASスクリプトを追加

拡張機能 → Apps Script を開き、aggregateDailySales() のコードを入力

4

実行して確認

手動実行し、日次集計シートに昨日の売上合計が正しく入ることを確認

GASトリガー設定と自動集計実行画面
check_circle
期待される結果
日次集計シートのA列に日付、B列に売上合計、C列に販売数が自動入力されます。

追加課題(黄: ヒント)

前日比の計算を追加してみましょう。VLOOKUP関数をGAS内で実装するか、1つ前の行の値と比較する方法があります。

help
うまくいかない場合
・日付のフォーマットを確認(RAWデータと集計関数の形式を統一)
・実行ログでエラーメッセージを確認

SECTION 20 — ハンズオン

ハンズオン 2: AI分析コメントを生成する

HANDS-ON 2
1

スクリプトプロパティにAPIキーを設定

GASエディタ → プロジェクトの設定 → スクリプトプロパティ → GCP_PROJECT_ID を追加

2

generateInsight() を追加

配布コードを追加。プロンプト内の変数が日次集計シートの値を参照するよう調整

3

手動実行でコメントを確認

Logger.log(aiComment) でコンソールに出力し、コメント内容が適切か確認

4

AI分析シートに書き込む

生成されたコメントをAI分析シートに日付と共に保存する処理を追加

AIコメントの改善サンプル

改善前のプロンプト(曖昧):

「売上データを分析してください」

改善後のプロンプト(具体的):

「経営層向けに50文字以内で要約し、良い点1つ・懸念点1つを箇条書きで提示してください」

check_circle
完成の確認ポイント
・前日比プラスの日と マイナスの日でコメントのトーンが変わる
・専門用語や英語が混じらず読みやすい
・毎回少し異なる文章が生成される

SECTION 20 — ハンズオン

ハンズオン 3: PDF生成・メール配信を設定する

HANDS-ON 3
1

Googleドキュメントでテンプレートを作成

{{DATE}}、{{REVENUE}}、{{AI_COMMENT}}などのプレースホルダーを含むテンプレートを作成しIDを控える

2

generateReport()とconvertToPdf()を追加

配布コードを追加。TEMPLATE_DOC_IDを先ほど控えたIDに変更

3

sendReportEmail()でメール送信テスト

自分のメールアドレス宛にテスト送信。PDF品質・本文・AIコメントを確認

4

時間駆動トリガーを設定

mainReport()を毎朝8:00に実行するトリガーを設定して完成

完成チェックリスト

  • PDFが正しい日付のファイル名で届く
  • 本文にAIコメントが含まれている
  • 前日比が正しく計算されている
  • トリガーが設定されている
  • 元のドキュメントが削除されている
warning
本番運用前の確認事項(赤: リスク)
・GAS実行権限(Drive・Gmail)が承認済みか
・スクリプトプロパティのAPIキーが正しいか
・配信先メールアドレスが正しいか
これらを確認してから実際の配信先を設定すること

SECTION 20 — 自動レポート配信システム

安定運用のためのエラー管理とログ設計

OPERATIONS
GAS — エラーハンドリング function mainReport() { try { const data = aggregateDailySales(); const aiComment = generateInsight(data); const docId = generateReport(data, aiComment); const pdfBlob = convertToPdf(docId); sendReportEmail(pdfBlob, data); // 成功ログを記録 writeLog('SUCCESS', `レポート配信完了: ${data.date}`); } catch(e) { // エラー発生時は管理者に通知 GmailApp.sendEmail( 'admin@example.com', '【エラー】自動レポート失敗', `エラー内容: ${e.message}\n` + `スタック: ${e.stack}` ); writeLog('ERROR', e.message); } }
history

ログシートの設計

内容
timestamp実行日時
statusSUCCESS / ERROR
message詳細メッセージ
lightbulb
エラー通知のベストプラクティス
エラーメールの件名に「【エラー】」を入れてフィルタを設定し、Slackに転送する設定にすると見落としが防げます。
warning GASの制限(黄: 補足): 1日の実行時間は合計6時間まで。トリガー数は20個まで。大量データの場合は処理を分散させましょう。

SECTION 20 — 自動レポート配信システム

このセクションのまとめ

SUMMARY

GAS + Gemini API + Googleドキュメントの組み合わせで、毎朝1時間の手作業をゼロにする完全自動レポート配信システムが構築できます。

0h
自動化後の
毎朝の作業時間
8:00
毎朝の
自動配信時刻
0
ヒューマン
エラー件数

習得したスキル

functions

GASデータ集計

日次/週次/月次の自動集計ロジック設計

psychology

AI洞察生成

Gemini APIでビジネス向けコメントを自動生成

send

マルチチャネル配信

メール・Chatwork・Slack への自動通知

security

エラー管理

try/catchとログシートによる安定運用

SECTION 20 完了

自動レポート配信システムの構築スキルを習得しました

check_circle Google AI 研修プログラム — 全セクション修了
ハンズオン
3
スライド数
20
使用ツール
GAS/Gemini
🏠 研修ポータル ▶ この章の動画 📺 動画一覧