毎日 Slack に日報をコピペで投稿。フォーマットが人によってバラバラで、
書き忘れや投稿忘れも頻発していた。
手動コピペで投稿
フォーマットがバラバラ
投稿忘れ: 週に1〜2回
18:00に自動投稿
全員同じフォーマット
投稿忘れ: ゼロ
日中の作業内容・明日の予定・課題をスプレッドシートに入力します。
| A | B | C | D | |
|---|---|---|---|---|
| 1 | 日付 | 作業内容 | 明日の予定 | 課題 |
| 2 | 2026/04/04 | LP修正(SOLEIL)完了 広告レポート作成 | 新規LP着手(CRAFT) | 素材の納品待ち |
| 3 | 2026/04/03 | バナー制作 x3 | LP修正(SOLEIL) | なし |
時間ベーストリガーで毎日18:00に自動でSlackに投稿されます。
Slack Webhookで整形されたメッセージが #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 }),
});
}