← ポートフォリオに戻る

解決する課題

毎日 Slack に日報をコピペで投稿。フォーマットが人によってバラバラで、
書き忘れや投稿忘れも頻発していた。

導入効果

Before

手動コピペで投稿
フォーマットがバラバラ
投稿忘れ: 週に1〜2回

After

18:00に自動投稿
全員同じフォーマット
投稿忘れ: ゼロ

使い方

1
スプレッドシートに記入

日中の作業内容・明日の予定・課題をスプレッドシートに入力します。

ファイル 編集 表示 日報ツール
B2 | LP修正(SOLEIL)完了 広告レポート作成
A B C D
1 日付 作業内容 明日の予定 課題
2 2026/04/04 LP修正(SOLEIL)完了 広告レポート作成 新規LP着手(CRAFT) 素材の納品待ち
3 2026/04/03 バナー制作 x3 LP修正(SOLEIL) なし
2
18:00 に自動実行

時間ベーストリガーで毎日18:00に自動でSlackに投稿されます。

18:00 自動実行
毎日 / 時間ベーストリガー
3
Slackに整形投稿

Slack Webhookで整形されたメッセージが #daily-report に投稿されます。

Sample Corp
# general
# random
# daily-report
# design
# dev
# daily-report
4月4日 金曜日
日報Bot APP 18:00
📋 本日の作業内容
  • - LP修正(SOLEIL)完了
  • - 広告レポート作成
📅 明日の予定
  • - 新規LP着手(CRAFT)
⚠️ 課題・懸念
  • - 素材の納品待ち
#daily-report にメッセージを送信

機能一覧

技術構成

項目 内容
ランタイムGoogle Apps Script (V8)
データソースGoogle スプレッドシート
投稿先Slack Incoming Webhook
メッセージ形式Block Kit(header / section / divider)
トリガー時間ベース(毎日 18:00)
二重投稿防止投稿済みフラグ列

ソースコード抜粋

// ===== メインの投稿関数(18:00 トリガーで実行) =====
function postDailyReport() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet()
    .getSheetByName(CONFIG.SHEET_NAME);
  const today   = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd');
  const data    = sheet.getDataRange().getValues();

  // 当日の行を探す
  let targetRow = null;
  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) { targetRow = data[i]; break; }
  }
  if (!targetRow || targetRow[5] === '済') return;

  // Slack Block Kit メッセージ
  const blocks = [
    { type: 'header', text: { type: 'plain_text', text: '日報 ' + today }},
    { type: 'divider' },
    { type: 'section', text: { type: 'mrkdwn',
      text: '*本日の作業内容*\n' + formatBullets_(targetRow[1]) }},
    { type: 'section', text: { type: 'mrkdwn',
      text: '*明日の予定*\n' + formatBullets_(targetRow[2]) }},
    { type: 'section', text: { type: 'mrkdwn',
      text: '*課題・懸念*\n' + formatBullets_(targetRow[3]) }},
  ];

  UrlFetchApp.fetch(CONFIG.WEBHOOK_URL, {
    method: 'post',
    contentType: 'application/json',
    payload: JSON.stringify({ blocks: blocks }),
  });
}