サイトアイコン PreciousDays Inc.

【GAS×Gemini】初心者OK!音声から議事録を自動作成する方法|Googleドライブ連携+コピペOKコード公開

本記事では、GAS(Google Apps Script)とGemini APIを活用し、会議音声から議事録を自動作成する仕組みを構築する方法を解説します。

Googleドライブに音声データをアップするだけで

・Geminiが音声を解析
・AIが議事録を作成
・Googleドキュメントに自動保存

という一連の処理を完全自動化できます。

実際にコピペで使えるGASのコードも公開しているので、ぜひ貴社の業務効率化に取り入れてくださいね。

この記事で分かること
・GASとGeminiを使った議事録自動化の仕組み
・音声データからAIが議事録を生成するフロー
・実際に動くGASコード
・Googleドライブ連携の方法
・初心者でも導入できる設定手順

全体フロー

今回は客先での打ち合わせや社内MTG等で録音した会議の音声データから議事録を作成し、そのドキュメントをクラウドに保存する流れとなります。

この自動化において、各データを連携しやすいように、ツールは全てGoogleで統一します。

一連の流れはこのように設計しました。

音声データをGoogleドライブの特定フォルダにアップ

Geminiがその音声データを解析+議事録を作成

指定フォルダに議事録データ(Googleドキュメント)を保存

このフローを構築できれば、現場のメンバーは出先からでもスマホで音声データをドライブにアップするだけなので、運用も簡単ですね。

事前準備物一覧

今回はGoogleのサービスを使うので、法人であればGoogle Workspace、フリーランスの方はGoogleアカウントを持っていることが前提となります。

そのうえで事前に必要となるのがこちら。

・Gemini API(Google AI Studioで作成)
一連のフローでGeminiを稼働させる為に必要となります。・GoogleドライブのフォルダURL
音声データをアップする任意のフォルダ・Googleドキュメントファイル
AIに議事録を書かせる為の空のドキュメントファイル

準備①:Gemini APIキーを取得する

こちらはすでにAPIキーを取得済の方はスキップしてください。

  1. Google AI Studio(https://aistudio.google.com/)にアクセス
  2. Googleアカウントでログイン
  3. 画面左側メニューから「Get API key」をクリック
  4. 「API キーを作成」を選択
  5. API キーに名前を付けてプロジェクトを選択
    (プロジェクトが未作成の場合はその場で新規作成可能)
  6. APIキーが自動生成されるので支払い情報を設定
  7. 表示されたAPIキーをコピーして安全に保存
    ※再表示できない場合があるため必ず控える

以上がAPI キー取得の流れとなります。

このAPI キーは厳重に管理してください。

準備②:Googleドライブに音声データアップ用フォルダを作成する

次に、ご自身のドライブ内(場所はどこでもOK)に音声データをアップする為のフォルダを作成しましょう。

私はこのように、音声アップロード用のフォルダと議事録保管用のフォルダを作成しました。

後ほど、GASのコードを作成する際に音声フォルダのID(URLの一部)が必要になるので、フォルダURLの以下の部分をコピーしておきましょう。

準備③:Googleドキュメントファイルを用意

こちらはAIに記載させる為の空のファイルを1つ用意します。

ファイルの名前は何でも大丈夫です。

GASでファイルを指定する必要があるので、以下のURLの部分をコピーしておきましょう。

この空のドキュメントに、今後AIが自動で議事録を作成していきます。

GAS(Google Apps Script)の実装

事前準備物が揃ったら、いよいよGASを実装していきましょう。

・・・といってもプログラムのコード自体をAIに書かせてしまうので、非エンジニアの方でも全く問題ありません。

今回は当社でコードを作成しているので、以下のコードをまるっとコピペしてもらえればOKです。

実装手順①:GASにアクセス

まずはhttps://script.google.com/にアクセスしましょう。

手順②:新しいプロジェクトを作成

画面左上の「+新しいプロジェクト」をクリックします。

するとこのようなコードを記載する画面が表示されるので、デフォルトで記載されているコードは全て削除して、以下のコードを貼り付けてください。


/**
 * ここにタイトルを記載
 */

const DOC_ID = 'ここにGoogleドキュメントのIDを記載';
const FOLDER_ID = 'ここにフォルダのIDを記載';
const API_KEY = 'ここにAPI キーを記載';

function generateMinutesFromAudio() {
  // 1. あなたのキーで今すぐ使える「正しいモデル名」を自動取得する
  const modelListUrl = `https://generativelanguage.googleapis.com/v1beta/models?key=${API_KEY}`;
  const modelRes = UrlFetchApp.fetch(modelListUrl);
  const models = JSON.parse(modelRes.getContentText()).models;
  
  // Flash系のモデルを優先的に探す
  const activeModel = models.find(m => m.name.includes('flash') && m.supportedGenerationMethods.includes('generateContent'))?.name;
  
  if (!activeModel) {
    console.error("利用可能なモデルが見つかりませんでした。APIキーの設定を確認してください。");
    return;
  }
  
  console.log('使用するモデル: ' + activeModel);

  const folder = DriveApp.getFolderById(FOLDER_ID);
  const files = folder.getFiles();
  
  while (files.hasNext()) {
    const file = files.next();
    if (file.getDescription() === 'processed') continue;

    console.log('処理開始: ' + file.getName());
    
    try {
      const blob = file.getBlob();
      const base64Data = Utilities.base64Encode(blob.getBytes());
      const mimeType = blob.getContentType();

      // 自動取得した「正しいモデル名」でリクエスト
      const url = `https://generativelanguage.googleapis.com/v1beta/${activeModel}:generateContent?key=${API_KEY}`;
      
      const prompt = "あなたは優秀な秘書です。提供された音声データから、以下の制約条件・出力フォーマットを遵守して議事録を作成してください。その際、markdownの**は使わないでください。太文字は不要です。\n\n# 制約条件\n- 打ち合わせ内容は誰が見ても理解できるように分かりやすく要約する。\n\n# 出力フォーマット\n- 【日時】\n- 【場所】\n- 【参加者】\n- 【打ち合わせ内容】\n- 【決定事項】\n- 【今後のアクション】\n- 【その他】";

      const payload = {
        "contents": [{
          "parts": [
            { "text": prompt },
            { "inline_data": { "mime_type": mimeType, "data": base64Data } }
          ]
        }]
      };

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

      const response = UrlFetchApp.fetch(url, options);
      const json = JSON.parse(response.getContentText());
      
      if (json.candidates && json.candidates[0].content) {
        const minutesText = json.candidates[0].content.parts[0].text;
        const doc = DocumentApp.openById(DOC_ID);
        const body = doc.getBody();
        
        body.appendHorizontalRule();
        body.appendParagraph("■ 生成日時: " + Utilities.formatDate(new Date(), "JST", "yyyy/MM/dd HH:mm"));
        body.appendParagraph("■ 元ファイル: " + file.getName());
        body.appendParagraph(minutesText);
        
        file.setDescription('processed');
        console.log('完了: ' + file.getName());
      } else {
        console.error('APIエラー: ' + response.getContentText());
      }
    } catch (e) {
      console.error('エラー: ' + e.toString());
    }
  }
}

その際、コード内の以下の部分をご自身で変更してください。

3行目:ご自身でお好きなタイトルを記載してください。
6行目:ご自身のGoogleドキュメントのIDを記載してください。
7行目:ご自身のフォルダIDを記載してください。
8行目:ご自身のAPI キーを記載してください。

上記コード内には、AI(Gemini)のプロンプトも記載しています。

議事録の出力フォーマットや指示内容を変更したい場合は43行目の「あなたは優秀な秘書です~」部分をご自由に編集してください。

なお、このコードは本記事を執筆している2026年3月4日現在のものです。

今後はGoogleのシステム要件等により、そのままコピペでは使えなくなる可能性がありますので、あらかじめご了承ください。

手順③:保存+実行

コードを書いたら、下の画像を参照に上書き保存して、試しに実行ボタンを押してみましょう。

実行ボタンを押した結果、以下のように正常に稼働していればOKです。

コードに問題がある場合はエラーが表示されますので、その際はフォルダID等コピペした内容が間違っていないか確認してください。

特にコードの知識がない方は、気付かないうちに元のコードの一部を削除していたり、コピペの際に本来必要な半角スペースが無くなっていたり、といったミスが発生しがちです。

手順④:トリガーを設定

ここまで来たら、あともう少しで完成です。

画面左側にあるメニューから目覚まし時計のアイコンをクリックして、さらに表示された画面の右下部分にある「+トリガーを追加」をクリックしましょう。

トリガーの設定内容は以下のようにしてください。

実行する関数: generateMinutesFromAudio
デプロイ時に実行: 「Head」
イベントのソース: 「時間主導型」
時間ベースのトリガーのタイプ: 「分単位のタイマー」
時間の間隔: 「10分おき」や「30分おき」など(お好みで大丈夫です)

最後に「保存」を押せば完了です。

お疲れ様でした~!

実際に該当フォルダに音声データをアップして、自動で議事録が作成されるか試してみましょう。

録音時間が1時間を超えるものは完成までに少し時間がかかりますが、当社では90分の打ち合わせデータもしっかりと議事録が作成されています。

ぜひ貴社でもご活用ください。

もしこの記事を読んでも上手く稼働させられないという方がいらっしゃれば、当社でサポートも可能ですので、お問合せフォームからお気軽にご連絡ください。

それではまた!

モバイルバージョンを終了