1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

記憶喪失エンジニアのための、GAS×AI全自動日報作成システム

Last updated at Posted at 2026-01-11

🚀 はじめに

「あれ……今日、俺なにやってたっけ?」

毎日20時、退勤前の日報作成タイム。
カレンダーと日報アプリ(弊チームではSlackで管理)を往復しながら、失われた記憶を掘り起こすあの15分間。人生で一番無駄な時間に思えませんか?

私は思います。というか、集中して業務をしている時ほど記憶が飛びます。

そこで今回は、「Googleカレンダーの実績から、AIがいい感じのビジネス文章で日報を捏造(作成)してくれるシステム」をGASで作りました。

この記事で得られるもの

  • 日報作成の15分という「無駄」からの解放
  • 最新モデル Gemini 2.5 をGASから叩く実装ノウハウ
  • 「やった感」のあるビジネスメールを自動生成するプロンプト技術

具体的な実装

  1. GASで今日のカレンダー予定を取得する
  2. Gemini API (v1beta) に投げて「日報書いて」と頼む
  3. Gmailの下書きに保存して、あとは送信ボタンを押すだけ(便宜的にメールにしていますが、ここはチームに合わせて変えてください)

🛠️ 使った技術・環境

項目 詳細 備考
実行環境 Google Apps Script (GAS) サーバーレスで無料
AIモデル Gemini 2.5 Flash 高速・軽量・無料枠あり
Input Google Calendar 実績のソース
Output Gmail (下書き) 誤爆防止のため下書き推奨

🔑 準備:APIキーとモデル名

1. APIキーの取得

Google AI Studio からAPIキーを取得します。ここは従来の手順と同じです。

2. モデル名の指定

モデル名: gemini-2.5-flash

このモデルは非常に高速で、日報の要約程度なら一瞬で終わります。


💻 実装・やったこと

以下のコードをGASのスクリプトエディタにコピペするだけで動きます。
ファイル名は main.gs など適当でOKです。

main.gs
/**
 * ==============================================================================
 * 全自動日報生成スクリプト (Powered by Gemini 2.5)
 * ==============================================================================
 */

// 設定値
const CONFIG = {
  // Google AI Studioで取得したキー
  GEMINI_API_KEY: 'ここに_YOUR_API_KEY_を貼り付け', 
  
  // 日報の宛先(上司のアドレスなど)
  MAIL_TO: 'boss@example.com',
  
  // 自分の名前
  MY_NAME: 'bara',
  
  // モデルは適宜変更してください
  MODEL_NAME: 'gemini-2.5-flash'
};

/**
 * メイン関数:ここを実行またはトリガー設定する
 */
function generateDailyReport() {
  // 1. 今日のカレンダー予定を取得
  const events = getTodayEvents();
  
  if (events.length === 0) {
    console.log("今日の予定がありません。日報生成をスキップします。");
    return;
  }

  // 2. AIへの指示書(プロンプト)を作成
  const prompt = createPrompt(events);

  // 3. Gemini APIを叩いて日報本文を生成
  const reportBody = callGeminiApi(prompt);

  // 4. Gmailの下書きを作成
  if (reportBody) {
    createDraftEmail(reportBody);
  }
}

/**
 * 今日のカレンダーイベントをテキスト化して取得
 */
function getTodayEvents() {
  const calendar = CalendarApp.getDefaultCalendar();
  const today = new Date();
  const events = calendar.getEventsForDay(today);

  return events.map(event => {
    const title = event.getTitle();
    // 時間の計算(例: 1.5h)
    const duration = (event.getEndTime() - event.getStartTime()) / (1000 * 60 * 60);
    return `- ${title} (${duration.toFixed(1)}h)`;
  }).join("\n");
}

/**
 * プロンプトエンジニアリング:ここが腕の見せ所
 */
function createPrompt(eventText) {
  return `
あなたは優秀なエンジニアです。以下の「本日のスケジュール実績」を元に、日報の本文を作成してください。

【制約事項】
- 報告者名: ${CONFIG.MY_NAME}
- 宛先は上司です。過度にへりくだる必要はありませんが、丁寧なビジネスメール形式で書いてください。
- 構成は「業務内容(箇条書き)」「所感・学び(スケジュールから推測してポジティブに)」を含めてください。
- 件名は不要です。本文のみ出力してください。
- "記憶喪失"などの余計な文言は入れないこと。

【本日のスケジュール実績】
${eventText}
  `;
}

/**
 * Gemini API 呼び出し処理
 */
function callGeminiApi(promptText) {
  const url = `https://generativelanguage.googleapis.com/v1beta/models/${CONFIG.MODEL_NAME}:generateContent?key=${CONFIG.GEMINI_API_KEY}`;
  
  const payload = {
    contents: [
      {
        parts: [{ text: promptText }]
      }
    ]
  };

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

  try {
    const response = UrlFetchApp.fetch(url, options);
    const json = JSON.parse(response.getContentText());
    
    // エラーハンドリング
    if (json.error) {
      throw new Error(`API Error: ${json.error.message}`);
    }

    if (json.candidates && json.candidates[0].content) {
      return json.candidates[0].content.parts[0].text;
    } else {
      throw new Error("AIからの応答が空でした: " + JSON.stringify(json));
    }
  } catch (e) {
    console.error("Gemini API Error:", e);
    // エラー時はログに残すのみとする(メール誤送信防止)
    return null; 
  }
}

/**
 * Gmailの下書き作成
 */
function createDraftEmail(body) {
  const dateStr = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "MM/dd");
  const subject = `【日報】${dateStr} (${CONFIG.MY_NAME})`;
  
  GmailApp.createDraft(CONFIG.MAIL_TO, subject, body);
  console.log("✅ Gmailの下書きを作成しました!");
}

📊 実行結果

今日のカレンダーを以下とします。

  • 10:00〜11:00:週次定例
  • 13:00〜15:00:管理画面のバグ調査
  • 16:00〜17:00:採用面談

これを generateDailyReport で実行すると……

生成されたメール(Gmail下書き)

件名: 【日報】01/11 (bara)
〇〇部長殿(または、〇〇さん)

お疲れ様です。baraです。
本日の業務についてご報告いたします。
【業務内容】

  •   週次定例に参加し、プロジェクト全体の進捗状況や来週以降のタスクについて認識を合わせました。
  •   管理画面のバグ調査を実施し、現象の再現条件の特定と、影響範囲の切り分けを行いました。明日以降、原因の深掘りを進めます。
  •   採用面談に同席し、当社の開発体制やチームの雰囲気について候補者の方にご説明いたしました。
    【所感】
    本日は週次定例での情報共有から、基幹機能のバグ調査、さらには採用面談と、多岐にわたる業務を効率的に遂行することができました。
    特にバグ調査においては、限られた時間の中で着実に原因特定の糸口を掴めたと感じております。採用活動にも貢献できたことで、組織の一員としての責任を改めて認識し、非常に充実した一日となりました。
    明日以降も、本日得られた情報や知見を活かし、一層業務に邁進してまいります。
    以上です。よろしくお願いいたします。
    報告者:bara

考察

カレンダーからテキスト補完してくれる、、、すごくないですか?
これが gemini-2.5-flash の実力です。賢い上に、処理速度も1秒かかりませんでした。


💡 まとめと今後の展望

今回は「下書き作成」までですが、以下のような応用も可能です。

  1. トリガー実行: 平日の17:50に自動実行するようにGASのトリガーを設定すれば、退勤前に下書きが完成しています。
  2. Slack連携: Gmailではなく、SlackのIncoming Webhookに投げてチームチャンネルに分報として投稿するのもありです。

記憶喪失になりがちなエンジニアの皆様、ぜひ試してみてください。
15分の単純作業を自動化して、浮いた時間で技術キャッチアップしましょう!(あるいは早く帰りましょう)


役に立った!と思ったらLGTM 👍 いただけるとなけなしの記憶力が回復します!

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?