Zoom / Google Meet × Googleスプレッドシートで議事録を自動要約する方法
なぜ議事録の自動化が必要なのか?
リモート会議が一般的になり、議事録を正確に残すことの重要性が増しています。しかし、会議内容を聞き返しながら手作業でまとめるのは大変で、時間もかかります。ZoomやGoogle Meetの録画・文字起こし機能とOpenAI APIを組み合わせれば、会議後すぐに概要・決定事項・アクションアイテムを抽出し、チームと共有できます。情報共有のスピードが上がり、対応漏れの防止にもつながります。
1. 会議の文字起こしデータを取得する方法
Zoomの文字起こし
Zoomには自動字幕/文字起こし機能があり、クラウド録画を使うと会議後にトランスクリプトファイル(VTTなど)が生成されます。自動化するにはクラウド録画が利用できるProプラン以上が必要で、会議終了後に文字起こしファイルが生成されるまで30分ほどタイムラグがあることに注意してください。トランスクリプトはWebポータルからダウンロードするほか、Zoom MarketplaceのアプリやZapierなどを用いて自動取得することも可能です。ファイルの形式はWebVTTで、USER: 発言
の形式で時刻と発言者が記録されています。ただし現状は言語指定ができず、ときどき英語で出力されるケースがあるため、社内でレビューが必要です。
ポイント
- Pro以上のZoomアカウントでクラウド録画と字幕保存を有効にする。
- トランスクリプトは会議後に生成され、VTTファイルとしてダウンロードできる。
- 自動取得にはZoom MarketplaceアプリやZapierなどの連携サービスを活用する。
Google Meetの文字起こし
Google Meetは2025年時点で日本語を含む8言語に対応した自動文字起こし機能を提供しています。文字起こし機能はBusiness Standard以上のWorkspaceエディションやWorkspace Individualなどで利用でき、PC版のみ対応です。文字起こしをオンにすると、音声内容だけが主催者のGoogleドライブに保存されます。会議終了後、主催者や共同主催者にトランスクリプトのリンクがメールで送られ、Googleカレンダーの予定にもファイルが添付されます。チャットメッセージは含まれないため、必要な場合は録画機能と併用してください。
ポイント
- Business StandardやBusiness Plus等のWorkspace契約が必要。
- PCから会議に参加して右下のアクティビティ→文字起こしを開始で録音できる。
- 文字起こしは会議後に自動で処理され、主催者のドライブに保存。メールとカレンダーからアクセス可能。
2. Google Apps Scriptで文字起こしファイルを検知・読み込む
文字起こしファイルを手動でダウンロードして整理するのは手間なので、Googleドライブにアップロードし、GASで自動処理しましょう。
- 文字起こしファイルを保存するフォルダを作成し、ZoomやGoogle Meetのトランスクリプトをそのフォルダにアップロードします(Zoomの場合はダウンロードしたVTT/TXTファイル、Meetの場合はドライブ上の文字起こしファイルをコピー)。
- Googleスプレッドシートに「議事録」シートを作成し、日付・会議名・要約・決定事項・アクションアイテムなどの列を用意します(例: 2025/08/25 定例ミーティング 新プロジェクト確認 リリース日程を9月末に決定 担当者割り当て)。
- Apps Scriptで新しいファイルを検知し、内容を読み込み、OpenAI APIへ要約リクエストを送るスクリプトを書きます。この記事後半でコード例を紹介します。
トランスクリプトが長い場合、APIのトークン制限を超えないように分割して送信し、分割部分をまとめて一つの要約にする仕組みを作ると良いでしょう。
3. OpenAI APIで議事録を要約する
文字起こしファイルから取得した長文テキストを要約する際は、プロンプトの設計が重要です。Qiitaで紹介されている議事録プロンプトのガイドラインでは、議題・決定事項・アクションアイテムなどの見出しを適切に使い、重要な発言や担当者・期限を強調し、冗長な部分を削除して要点をまとめることが推奨されています。また、ハルシネーション(事実でない内容の生成)を防ぐために「事実に基づいてまとめること」を指示に含めると効果的です。
GASでOpenAI APIを呼び出すコード例
以下のサンプルは、Googleドライブのテキストファイルを読み込み、OpenAI API(gpt-4o-miniモデル)に要約を依頼し、結果をスプレッドシートに保存するものです。APIキーとフォルダIDは環境に合わせて設定してください。
const OPENAI_API_KEY = "YOUR_API_KEY";
// ChatGPTで文字起こしを要約し、要約・決定事項・アクションアイテムを抽出
function summarizeMeeting(text) {
const url = "https://api.openai.com/v1/chat/completions";
const payload = {
model: "gpt-4o-mini",
messages: [
{role: "system", content: "あなたは会議議事録を要約するアシスタントです。入力文から『要約』『決定事項』『アクションアイテム』を抽出してください。重要な発言や担当者、期限を明確にしてください。ハルシネーションは禁止です。"},
{role: "user", content: text}
],
max_tokens: 500
};
const options = {
method: "post",
headers: {
"Authorization": "Bearer " + OPENAI_API_KEY,
"Content-Type": "application/json"
},
payload: JSON.stringify(payload)
};
const response = UrlFetchApp.fetch(url, options);
const data = JSON.parse(response.getContentText());
return data.choices[0].message.content.trim();
}
// ドライブの文字起こしファイルを読み込み → 要約 → スプレッドシートに保存
function processTranscript() {
const folder = DriveApp.getFolderById("YOUR_FOLDER_ID");
const files = folder.getFiles();
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("議事録");
while (files.hasNext()) {
const file = files.next();
const content = file.getBlob().getDataAsString();
// 要約生成
const summaryText = summarizeMeeting(content);
// 要約結果を「要約」「決定事項」「アクションアイテム」に分ける
// 例:行ごとに「要約: xxx」「決定事項: xxx」「アクション: xxx」の形式で返ってくると想定
const lines = summaryText.split('\n').filter(line => line.trim() !== '');
let summary = '';
let decisions = '';
let actions = '';
lines.forEach(line => {
if (line.startsWith('要約')) summary = line.replace('要約:', '').trim();
else if (line.startsWith('決定事項')) decisions = line.replace('決定事項:', '').trim();
else if (line.startsWith('アクション')) actions = line.replace('アクション:', '').trim();
else summary += ' ' + line.trim(); // fallback: 全体を要約に追加
});
// 日付・会議名はファイル名やタイムスタンプから取得
const timestamp = new Date();
const meetingName = file.getName().replace(/\.[^/.]+$/, ''); // 拡張子除去
sheet.appendRow([timestamp, meetingName, summary, decisions, actions]);
// 処理済みのファイルをアーカイブフォルダへ移動するなどの対策を検討
}
}
運用のポイント
- トランスクリプトが長い場合は適切な長さに分割し、セクションごとにAPIを呼び出したあと、最終的にまとめ直す処理を入れる。
- システムプロンプトでは、要約の構成やハルシネーションを避ける指示を明示し、担当者や期限を強調する。
- APIキーは環境変数やGoogleシークレットマネージャーで安全に管理する。
- 送信するデータには機密情報が含まれる場合があるため、社内規定や個人情報保護方針に従って利用する。
4. 会議録の自動処理をスムーズにするコツ
文字起こし機能の事前設定
- Zoom: ミーティング前に字幕とクラウド録画を有効にし、参加者に録画・文字起こしを行うことを通知します。Proプラン以上であることを確認し、生成されるVTTファイルを定期的に保存するフォルダを決めます。
- Google Meet: 主催者が文字起こし機能を開始し、会議後にドライブに保存されることを参加者に伝えます。文字起こしは日本語を含む言語に対応し、Business Standard以上のエディションで利用できます。
スプレッドシートの設計
- 列の構成: 日付、会議名、要約、決定事項、アクションアイテム、担当者、期限など、チームの運用に合わせて列を追加します。
- データの整理: GASが新しい行を追加するたびに、フィルタや条件付き書式で重要項目をハイライトすると閲覧しやすくなります。
- 共有範囲: スプレッドシートの共有設定を適切に行い、関係者だけが閲覧・編集できるようにします。
プロンプトの改善と検証
- 要約結果が期待に沿わない場合はプロンプトを調整し、決定事項やアクションアイテムのキーワードを明示する。
- 会議のフォーマットや専門用語をナレッジファイルにまとめ、プロンプトに参照させる方法も有効です。
- 生成された議事録は必ず人間がレビューし、誤解や抜け漏れがないか確認する。
5. セキュリティとコンプライアンスへの配慮
- 文字起こしファイルや議事録には機密情報が含まれる場合が多く、Googleドライブのアクセス権限管理やスプレッドシートの共有設定を慎重に行いましょう。
- OpenAI APIへの送信が社内規定に抵触しないか確認し、必要に応じて情報を匿名化するなどの対策を講じます。
- ZoomやGoogle Meetの文字起こしは会議に参加しているユーザーにも通知されるため、事前に録音・文字起こしを行う旨を参加者に周知します。
まとめ
Zoom / Google Meetで録音・文字起こししたデータをOpenAI APIで自動要約し、Googleスプレッドシートに記録することで、議事録作成の手間を大幅に削減できます。要点を明確にするためには、以下のポイントが重要です。
- 文字起こし機能の理解: ZoomではProプラン以上のクラウド録画が必要で、トランスクリプトは会議終了後に生成されます。Google MeetではBusiness Standard以上のエディションで日本語文字起こしが利用でき、会議後に主催者のドライブに保存されます。
- GASとOpenAI APIの連携: Googleドライブのフォルダを監視し、文字起こしファイルを読み込んで要約し、スプレッドシートに記録します。プロンプトでは要約・決定事項・アクションアイテムを明確に抽出する指示を加えると精度が向上します。
- 運用とレビュー: 自動生成された議事録は必ず人間が確認し、誤りや漏れを補正します。APIキーや機密情報の取り扱いにも十分配慮しましょう。
議事録自動化の仕組みを導入すれば、会議後すぐに要約が共有され、情報共有のスピードが飛躍的に向上します。まずは小さなチームや定例ミーティングから試してみてください。