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に届く。
関連記事:
- GAS×ChatGPT入門 で基礎を固める
- GAS×LINE連携 で通知チャネルを広げる
最終更新: 2026-02-02
コメント