MENU

GAS×ChatGPT×Slack連携|日報を自動要約して投稿する方法

GAS×ChatGPT×Slack連携|日報を自動要約して投稿する方法

日報をSlackに毎日手で投稿し、チームの報告内容を自分で要約している。その作業をGAS×ChatGPT×Slackの連携で自動化する方法を解説する。非エンジニアでも、コードをコピペして設定するだけで動かせる構成にした。


目次

この記事でできること

完成すると、以下の流れが毎日自動で走る。


1. スプレッドシートに日報データを記入
        ↓
2. GASが定期実行(毎日18時など)
        ↓
3. ChatGPTが日報を要約
        ↓
4. Slackの指定チャンネルに自動投稿

活用例:

  • チームの日報を要約して共有
  • 売上データのハイライトを自動通知
  • 問い合わせ内容の傾向分析を定期配信

事前準備

必要なもの

項目 詳細 取得方法
Googleアカウント スプレッドシート、GAS用 お持ちのもの
OpenAI APIキー ChatGPT連携用 platform.openai.com
Slack Webhook URL Slack投稿用 後述

Slack Incoming Webhook の設定

  • Slack API にアクセス
  • Create New App → From scratch
  • アプリ名(例: 日報Bot)とワークスペースを選択
  • 左メニューのIncoming Webhooksをクリック
  • Activate Incoming Webhooksをオン
  • Add New Webhook to Workspaceをクリック
  • 投稿先チャンネルを選択して許可する
  • 表示されたWebhook URLをコピー

[画像: Slack Webhook URL取得画面]


実装手順

STEP 1: スプレッドシートを準備

日報データを記録するスプレッドシートを作成する。

A列(日付) B列(担当者) C列(今日の作業) D列(課題・気づき)
2026-02-01 山田 顧客A様への提案資料作成 納期が厳しい
2026-02-01 田中 システム改修のテスト実施 バグ2件発見

STEP 2: GASコードを設置

スプレッドシートから拡張機能 → Apps Scriptを開き、以下のコードを貼り付ける。


// ===================================================
// 設定
// ===================================================
const CONFIG = {
  // OpenAI APIキー(スクリプトプロパティ推奨)
  OPENAI_API_KEY: PropertiesService.getScriptProperties().getProperty('OPENAI_API_KEY'),

  // Slack Webhook URL(スクリプトプロパティ推奨)
  SLACK_WEBHOOK_URL: PropertiesService.getScriptProperties().getProperty('SLACK_WEBHOOK_URL'),

  // 対象シート名
  SHEET_NAME: '日報',

  // ChatGPTモデル
  MODEL: 'gpt-4o-mini'
};

// ===================================================
// メイン処理: 日報を要約してSlackに投稿
// ===================================================
function summarizeAndPostToSlack() {
  // 1. 今日の日報データを取得
  const reports = getTodayReports();

  if (reports.length === 0) {
    console.log('今日の日報データがありません');
    return;
  }

  // 2. ChatGPTで要約
  const summary = generateSummary(reports);

  // 3. Slackに投稿
  postToSlack(summary);

  console.log('日報要約をSlackに投稿しました');
}

// ===================================================
// 今日の日報データを取得
// ===================================================
function getTodayReports() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet()
    .getSheetByName(CONFIG.SHEET_NAME);
  const data = sheet.getDataRange().getValues();

  const today = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy-MM-dd');
  const reports = [];

  // ヘッダー行をスキップ(1から開始)
  for (let i = 1; i < data.length; i++) {
    const rowDate = Utilities.formatDate(new Date(data[i][0]), 'Asia/Tokyo', 'yyyy-MM-dd');
    if (rowDate === today) {
      reports.push({
        name: data[i][1],
        work: data[i][2],
        issues: data[i][3]
      });
    }
  }

  return reports;
}

// ===================================================
// ChatGPTで日報を要約
// ===================================================
function generateSummary(reports) {
  const reportText = reports.map(r =>
    `【${r.name}】\n作業: ${r.work}\n課題: ${r.issues}`
  ).join('\n\n');

  const prompt = `以下はチームメンバーの日報です。
これを以下の形式で簡潔に要約してください:

## 今日のハイライト
- (チーム全体の主要な成果を2-3点)

## 注意が必要な課題
- (共有すべき課題や気づきを箇条書き)

## 明日への申し送り
- (翌日に引き継ぐべき事項)

---
${reportText}`;

  const response = callChatGPT(prompt);
  return response;
}

// ===================================================
// ChatGPT API呼び出し
// ===================================================
function callChatGPT(prompt) {
  const url = 'https://api.openai.com/v1/chat/completions';

  const payload = {
    model: CONFIG.MODEL,
    messages: [
      { role: 'system', content: 'あなたはビジネス文書を簡潔に要約するアシスタントです。' },
      { role: 'user', content: prompt }
    ],
    max_tokens: 1000,
    temperature: 0.5
  };

  const options = {
    method: 'post',
    contentType: 'application/json',
    headers: {
      'Authorization': 'Bearer ' + CONFIG.OPENAI_API_KEY
    },
    payload: JSON.stringify(payload),
    muteHttpExceptions: true
  };

  const response = UrlFetchApp.fetch(url, options);
  const json = JSON.parse(response.getContentText());

  if (json.error) {
    throw new Error(json.error.message);
  }

  return json.choices[0].message.content;
}

// ===================================================
// Slackに投稿
// ===================================================
function postToSlack(message) {
  const today = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy年M月d日');

  const payload = {
    text: `📋 *${today} 日報サマリー*\n\n${message}`,
    mrkdwn: true
  };

  const options = {
    method: 'post',
    contentType: 'application/json',
    payload: JSON.stringify(payload)
  };

  UrlFetchApp.fetch(CONFIG.SLACK_WEBHOOK_URL, options);
}

STEP 3: スクリプトプロパティを設定

  • GASエディタ → プロジェクトの設定(歯車アイコン)
  • スクリプトプロパティで以下を追加:

OPENAI_API_KEY: OpenAI APIキー

SLACK_WEBHOOK_URL: Slack Webhook URL

[画像: スクリプトプロパティ設定画面]

STEP 4: トリガーを設定(毎日自動実行)

  • GASエディタ左メニューのトリガーを開く
  • トリガーを追加
  • 設定:

– 実行する関数: summarizeAndPostToSlack

– イベントのソース: 時間主導型

– 時間ベースのトリガー: 日付ベースのタイマー

– 時刻: 午後6時〜7時

  • 保存

カスタマイズ例

要約形式を変更

プロンプトを書き換えれば、出力形式を自由に調整できる。


const prompt = `以下の日報を、3行以内で超簡潔に要約してください。
絵文字を使って読みやすくしてください。`;

特定の条件でアラート

課題に特定のキーワードが含まれていたら、別チャンネルに通知を飛ばす。


if (report.issues.includes('緊急') || report.issues.includes('バグ')) {
  postToSlack(alertMessage, ALERT_CHANNEL_URL);
}

トラブルシューティング

エラー 原因 対処法
channel_not_found Webhook URLが無効 Slack側で再設定
invalid_api_key OpenAI APIキー誤り キーを再確認
日報データがありません 日付フォーマット不一致 A列の日付形式を確認

まとめ

GAS×ChatGPT×Slack連携で、日報の要約と共有を自動化した。一度トリガーを設定すれば、あとは毎日スプレッドシートに日報を書くだけで要約がSlackに届く。

関連記事:


最終更新: 2026-02-02

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次