議事録自動作成システム~GAS利用。m4a音声 → Gemini → 議事録 → スプレッドシート~

項目内容・詳細
システム名称m4a音声 → Gemini API → スプレッドシート 完全自動連携GAS
全体の処理フロー1. Driveフォルダへ音声保存 → 2. GASが監視・取得 → 3. Base64変換 → 4. Gemini API送信 → 5. 議事録生成 → 6. スプレッドシート保存
主要機能のポイント完全自動化(トリガー実行)、重複処理防止(ファイル名チェック)、セキュリティ確保(ScriptPropertiesによる鍵管理)
必要な設定情報 (Key)GEMINI_API_KEYFOLDER_ID(音声保存用)、SHEET_IDSHEET_NAME
GASメイン処理processAudioFiles():フォルダ内の未処理m4aファイルを抽出し、議事録作成・保存プロセスを回す中核関数
AIプロンプト内容要点、決定事項、次のアクション(担当・内容・期限)、会議概要を構造化して出力するよう定義
保存データ構成スプレッドシートの各列に 日時ファイル名議事録本文 を自動追加
自動化の設定GASの時間主導型トリガー(例:10分おき)で autoProcess 関数を実行するように設定
運用イメージスマホで録音してDriveに放り込むだけで、数分後にはシートに整理された議事録が届く状態

プロンプト

「m4a音声 → 自動議事録 → スプレッドシート」

を 完全自動化したGAS(完成版) を作って

scriptプロパティから機密情報は読み取って

音声をGEMINIに渡し議事録を作成

AI作成

以下は
「m4a音声 → Gemini → 議事録 → スプレッドシート」
完全自動化するGAS完成版 です。

ポイントは 機密情報は Script Properties から取得 する設計です。


全体構成(重要)

処理の流れ

① Driveフォルダにm4aを保存
        ↓
② GASがフォルダ監視
        ↓
③ 音声をBase64化
        ↓
④ Gemini APIへ送信
        ↓
⑤ 議事録生成
        ↓
⑥ スプレッドシート保存
        ↓
⑦ 処理済みファイルはスキップ

重要ポイント

  • 完全自動
  • 重複処理防止
  • ScriptPropertiesで鍵管理
  • トリガーで定期実行

① 完成GASコード

// =============================
// ScriptProperties取得
// =============================

function getConfig() {

  const props = PropertiesService.getScriptProperties();

  return {
    apiKey: props.getProperty("GEMINI_API_KEY"),
    folderId: props.getProperty("FOLDER_ID"),
    sheetId: props.getProperty("SHEET_ID"),
    sheetName: props.getProperty("SHEET_NAME") || "議事録"
  }

}

// =============================
// メイン処理
// =============================

function processAudioFiles() {

  const config = getConfig()

  const folder = DriveApp.getFolderById(config.folderId)

  const files = folder.getFiles()

  while (files.hasNext()) {

    const file = files.next()

    const name = file.getName()

    if (!name.endsWith(".m4a")) continue

    if (isProcessed(name, config)) {
      continue
    }

    const transcript = createMinutes(file, config)

    saveToSheet(name, transcript, config)

  }

}

// =============================
// Geminiで議事録作成
// =============================

function createMinutes(file, config) {

  const blob = file.getBlob()

  const base64 = Utilities.base64Encode(blob.getBytes())

  const payload = {

    contents: [

      {
        parts: [

          {
            inlineData: {
              mimeType: "audio/mp4",
              data: base64
            }
          },

          {
            text: `
会議音声を議事録化してください

出力形式

【要点】
・

【決定事項】
・

【次のアクション】
担当:
内容:
期限:

【会議概要】
`
          }

        ]
      }

    ]

  }

  const options = {

    method: "post",

    contentType: "application/json",

    payload: JSON.stringify(payload)

  }

  const url =
    "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=" +
    config.apiKey

  const res = UrlFetchApp.fetch(url, options)

  const json = JSON.parse(res.getContentText())

  return json.candidates[0].content.parts[0].text

}

// =============================
// スプレッドシート保存
// =============================

function saveToSheet(fileName, text, config) {

  const ss = SpreadsheetApp.openById(config.sheetId)

  const sheet = ss.getSheetByName(config.sheetName)

  sheet.appendRow([

    new Date(),

    fileName,

    text

  ])

}

// =============================
// 重複チェック
// =============================

function isProcessed(fileName, config) {

  const ss = SpreadsheetApp.openById(config.sheetId)

  const sheet = ss.getSheetByName(config.sheetName)

  const data = sheet.getDataRange().getValues()

  for (let i = 1; i < data.length; i++) {

    if (data[i][1] == fileName) {
      return true
    }

  }

  return false

}

// =============================
// ScriptProperties設定
// =============================

function setProperties() {

  const props = PropertiesService.getScriptProperties()

  props.setProperty("GEMINI_API_KEY", "ここにAPIキー")

  props.setProperty("FOLDER_ID", "ここにフォルダID")

  props.setProperty("SHEET_ID", "ここにシートID")

  props.setProperty("SHEET_NAME", "議事録")

}

// =============================
// 自動実行
// =============================

function autoProcess() {

  processAudioFiles()

}

② ScriptProperties設定

GASメニュー

プロジェクト設定
↓
スクリプトプロパティ

追加

KEYVALUE
GEMINI_API_KEYGemini APIキー
FOLDER_ID音声保存フォルダ
SHEET_IDスプレッドシートID
SHEET_NAME議事録

③ スプレッドシート構成

日時ファイル名議事録

④ Drive構成

GoogleDrive
   ↓
議事録音声フォルダ
   ↓
   meeting1.m4a
   meeting2.m4a

⑤ 自動実行(重要)

GASトリガー

トリガー追加
↓
autoProcess
↓
時間主導
↓
10分毎

すると

音声を入れるだけで議事録完成


完成イメージ

スマホ録音
   ↓
Driveアップ
   ↓
GAS
   ↓
Gemini
   ↓
議事録生成
   ↓
スプレッドシート保存