Google Meet議事録をCRMに自動登録する方法──GAS+Claude APIで作る実装手順【コード付き】
商談が終わるたびに発生するCRMへの入力仕事。Google Meetの文字起こしは自動で残る時代に、転記だけが人間の仕事のまま残っています。月額の議事録ツールを買わずに、いまのGoogle Workspaceだけで「商談が終わった瞬間、CRM入力も終わっている」を作る実装手順を、本番稼働中の構成(GAS+Claude API+Airtable)とサニタイズ済みコードで解説します。AI費用は議事録1件あたり数円のオーダーです。
商談が終わるたびに発生する「CRMへの入力仕事」。Google Meetの文字起こしは自動で残る時代になったのに、そこからCRMへの転記だけが人間の仕事のまま残っています。この記事では、月額の議事録ツールを買わずに、いまのGoogle Workspaceだけで「商談が終わった瞬間、CRM入力も終わっている」を作る実装手順を、実際に本番稼働しているコードの構成で解説します。部品はGAS(Google Apps Script)+Claude API+Airtableの3つ。追加のSaaS契約はゼロ、AIの従量課金は議事録1件あたり数円のオーダーです。
この記事でわかること
- 全体構成:Meet文字起こし→GAS→Claude API→CRM(Airtable)→Slack通知
- 前提条件:Meetの文字起こしが使えるプラン(公式仕様)と費用の試算
- 手順1〜4の実装コード(サニタイズ済み・そのまま流用可)
- 「静かな故障」を防ぐ設計(処理済み管理・2段階バリデーション・成功通知)
- 自作をやめて専用ツールを買うべき条件
全体像──3つの部品で作る
仕組みはシンプルです。①Google Meetの文字起こしが、会議終了後に主催者のGoogle Driveへ自動保存される。②GASが定期実行でそのフォルダを監視し、新しい文字起こしを取得する。③Claude APIが議事録を「CRMの型」(会社名・決定事項・次アクション・期日)に構造化する。④Airtable APIで該当する案件レコードを更新(なければ作成)する。⑤Slackに「何をどう更新したか」を通知する。
私たちはこの構成のエージェント(GAS+Claude API+Airtable API、Slack連携込み)を実案件で本番稼働させており、商談の場で実物を見せたことが受注につながった経験もあります。この記事のコードは、その実装と同じ部品・同じ設計パターンで組んだものです。

前提1:Meetの文字起こしが使えるプランか
まず入口の確認です。Google Meetの文字起こし(Transcripts)は全プランで使えるわけではありません。Google公式ヘルプによると、対応プランは次のとおりです。
Google Meet文字起こしの公式仕様(2026年9月時点)
| 項目 | 公式仕様 |
|---|---|
| 対応プラン | Business Standard/Business Plus/Enterprise各エディション/Education Plus等 |
| 保存先 | 会議主催者のGoogle Drive内「Google Meet」フォルダ |
| 日本語 | 対応(英・仏・独・伊・日・韓・葡・西の8言語) |
| 有効化 | ホスト管理が無効なら同一ドメインの誰でも開始可。会議前の設定で自動開始も可能 |
ポイントは2つ。日本語の文字起こしに公式対応していること、そして保存先が「主催者のDriveの決まったフォルダ」であること。保存先が固定だから、GASで監視する対象を1つに絞れます。
前提2:費用──追加のSaaSはゼロ、AIは1件数円
この構成で新たに発生する費用はClaude APIの従量課金だけです。試算してみます。使用モデルはClaude Haiku 4.5(入力$1/出力$5 per 100万トークン・Anthropic公式単価)。商談1時間の議事録は約1万字=入力1万〜1.5万トークン、抽出結果のJSON出力は約1,000トークン。
計算すると、1件あたり約$0.02=3円前後。月100件の商談でも数百円程度です。議事録ツールの月額課金(1ユーザーあたり数千円×人数)と比べると、費用の桁が2つ違います。精度をさらに高めたい場合はSonnet系モデルに差し替えても、1件あたり数十円のオーダーに収まります(単価は改定される可能性があるため、Anthropic公式の料金ページでご確認ください)。
手順1:文字起こしを拾う──「処理済み」の管理が9割
GASの時間主導型トリガー(例:30分おき)で「Google Meet」フォルダを見に行き、未処理のドキュメントを取得します。
ここで最重要の設計判断があります。「どれを処理済みとするか」を、人間が触れる場所に置かないことです。私たちは過去に、メールの未読・既読をトリガーにした自動化で「人が先にメールを開くと、永久に処理されない」という静かな故障を経験しました。以来、処理済み管理は必ずシステム専用のフラグ(ここではScript Properties)で持ちます。
javascript
var PROPS = PropertiesService.getScriptProperties();
var ANTHROPIC_API_KEY = PROPS.getProperty('ANTHROPIC_API_KEY');
var AIRTABLE_PAT = PROPS.getProperty('AIRTABLE_PAT');
var SLACK_WEBHOOK = PROPS.getProperty('SLACK_WEBHOOK');
var BASE = 'appXXXXXXXXXXXXXX'; // AirtableのベースID
var TBL_CASES = 'tblXXXXXXXXXXXXXX'; // 案件テーブルID
// 30分おきの時間主導型トリガーで実行する
function watchMeetTranscripts() {
var folders = DriveApp.getFoldersByName('Meet Recordings');
if (!folders.hasNext()) return;
var files = folders.next().getFilesByType(MimeType.GOOGLE_DOCS);
var processed = JSON.parse(PROPS.getProperty('PROCESSED_IDS') || '[]');
while (files.hasNext()) {
var file = files.next();
if (processed.indexOf(file.getId()) !== -1) continue; // 処理済みはスキップ
var text = DocumentApp.openById(file.getId()).getBody().getText();
var result = extractToCrm(text); // 手順2
if (result) {
upsertCase(result); // 手順3
notifySlack(result, file.getName()); // 手順4
}
processed.push(file.getId());
PROPS.setProperty('PROCESSED_IDS', JSON.stringify(processed));
}
}処理済みIDをScript Propertiesに持つことで、ファイル名の変更・既読状態・フォルダ整理といった「人間の普通の操作」が自動化を壊さなくなります。
手順2:Claudeで議事録を「CRMの型」に変換する
核になるのがこの部分です。プロンプトで出力をJSONに固定し、CRMのフィールドに対応した構造で返させます。
javascript
function extractToCrm(transcript) {
var sys =
'あなたは営業議事録をCRMデータに変換するアシスタントです。\n' +
'議事録から以下を抽出し、JSONのみを出力してください(前後に文章を付けない)。\n' +
'{\n' +
' "company": "顧客の会社名(議事録から特定できない場合はnull)",\n' +
' "summary": "商談内容の要約(200字以内)",\n' +
' "decisions": "決定事項(箇条書きテキスト)",\n' +
' "next_action": "次アクション(誰が・何を・いつまでに)",\n' +
' "due_date": "次アクションの期日(YYYY-MM-DD。不明ならnull)",\n' +
' "temperature": "high | middle | low のいずれか(受注温度感)"\n' +
'}';
var res = UrlFetchApp.fetch('https://api.anthropic.com/v1/messages', {
method: 'post',
contentType: 'application/json',
headers: {
'x-api-key': ANTHROPIC_API_KEY,
'anthropic-version': '2023-06-01'
},
payload: JSON.stringify({
model: 'claude-haiku-4-5', // 速くて安い。精度重視ならSonnet系へ
max_tokens: 2000,
system: sys,
messages: [{ role: 'user', content: transcript }]
}),
muteHttpExceptions: true
});
var body = JSON.parse(res.getContentText());
if (!body.content || !body.content[0]) return null;
return validate(body.content[0].text); // ← そのまま信じない
}手順3:バリデーションしてAirtableへ登録する
AIの出力は確率的にズレます。私たちの実測では、この種の抽出は数%の確率で形式が崩れたり、期待しない値が入ったりします。だから登録前に必ず2段階のチェックを挟みます。①JSONとして解釈できるか(構造)、②各フィールドの値がルール内か(値)。
javascript
function validate(text) {
var data;
try {
data = JSON.parse(text); // ① 構造チェック
} catch (e) {
return null; // 解釈不能なら登録しない(通知で人間に回す)
}
// ② 値チェック
if (!data.company) return null;
var temps = ['high', 'middle', 'low'];
if (temps.indexOf(data.temperature) === -1) data.temperature = 'middle';
if (data.due_date && !/^\d{4}-\d{2}-\d{2}$/.test(data.due_date)) data.due_date = null;
return data;
}
function upsertCase(d) {
// 会社名で既存レコードを検索
var url = 'https://api.airtable.com/v0/' + BASE + '/' + TBL_CASES +
'?filterByFormula=' + encodeURIComponent('FIND("' + d.company + '", {会社名})');
var res = UrlFetchApp.fetch(url, {
headers: { Authorization: 'Bearer ' + AIRTABLE_PAT },
muteHttpExceptions: true
});
var recs = JSON.parse(res.getContentText()).records || [];
var fields = {
'商談メモ': d.summary + '\n【決定】' + d.decisions,
'次アクション': d.next_action,
'期日': d.due_date,
'温度感': d.temperature
};
var opts = {
contentType: 'application/json',
headers: { Authorization: 'Bearer ' + AIRTABLE_PAT },
muteHttpExceptions: true
};
if (recs.length > 0) { // あれば更新
opts.method = 'patch';
opts.payload = JSON.stringify({ fields: fields });
UrlFetchApp.fetch('https://api.airtable.com/v0/' + BASE + '/' + TBL_CASES + '/' + recs[0].id, opts);
} else { // なければ新規作成
fields['会社名'] = d.company;
opts.method = 'post';
opts.payload = JSON.stringify({ records: [{ fields: fields }] });
UrlFetchApp.fetch('https://api.airtable.com/v0/' + BASE + '/' + TBL_CASES, opts);
}
}バリデーションに落ちたら「登録しない」が正解
解釈できなかった議事録は登録せず、Slack通知で人間に回します。「たまに間違ったデータが静かに入るCRM」は、入力の手間より高くつきます。データベースが一度信用を失うと、誰も見なくなり、誰も見ないから更新されなくなる——この悪循環を避けるための安全弁です。
手順4:「動いたこと」を通知する
最後がSlack通知です。ここにも実運用の教訓があります。「失敗したら通知」ではなく「動いたことを通知」すること。裏で動く自動化は、止まってもエラー画面が出ません。成功時に毎回通知が来ていれば、「今日は通知が来ていない=何かおかしい」と人間が気づけます。
javascript
function notifySlack(d, fileName) {
var text = '📋 議事録をCRMに登録しました\n' +
'会社: ' + d.company + ' / 温度感: ' + d.temperature + '\n' +
'次アクション: ' + d.next_action + (d.due_date ? '(期日 ' + d.due_date + ')' : '') + '\n' +
'元ファイル: ' + fileName;
UrlFetchApp.fetch(SLACK_WEBHOOK, {
method: 'post',
contentType: 'application/json',
payload: JSON.stringify({ text: text }),
muteHttpExceptions: true
});
}通知には何をどう更新したかの中身を入れます。営業メンバーがSlackで内容を目視確認し、違っていればその場で直す——この「人間のレビューが自然に挟まる」設計が、AI自動化を実務で信頼される状態に保ちます。
運用の注意──作った後に壊れる3つのポイント
この構成は作って終わりではありません。実案件の保守で実際に起きたことを3つ共有します。
作った後に壊れる3つのポイント
- 1列名の変更で止まる:Airtable側の列名を誰かが「わかりやすく」変えると、そこを参照する処理が止まります。フィールドは列名でなくフィールドIDで参照する(AirtableのAPIは returnFieldsByFieldId に対応)と、この事故を構造的に防げます
- 2作った人が辞めると見えなくなる:GASのトリガーは作成者のアカウントで実行され続け、他のアカウントからは見えません(公式仕様)。個人アカウントでなくシステム用アカウントで作るのが予防策です。詳しくはAIで作った業務ツールは半年後に誰が直すのかに書きました
- 3APIの仕様変更:Claude API・Airtable APIとも安定していますが、年単位では変わります。手順4の成功通知が「来なくなったら気づける」仕組みとして効きます
自作をやめておくべき条件
この実装がどんな場面でも万能なわけではありません。次に当てはまる場合は、専用ツールの導入や別の構成を検討すべきです。
自作か、購入か──状況別のおすすめ
| 状況 | おすすめの選択 |
|---|---|
| 通話のトーク解析(話速・被せ率・トーク比率)まで欲しい | amptalk等の商談解析ツールを買う。自作の領分ではない |
| CRMがSalesforceで、変える予定がない | AppExchangeの連携製品が近道。この構成のAirtable部分をSF APIに置き換える手もあるが工数が増える |
| 議事録の要約と共有だけでいい(CRM登録が不要) | GeminiのメモやGoogle Workspace Studioのノーコードで十分。実例は志村のnote(Meet議事録をSlackに自動共有)へ |
| そもそもCRM自体がまだない | 先にCRMを立てる。AirtableでSFAを自作する全工程から |
逆に言えば、「Google Workspaceを使っていて」「CRMはAirtable(またはこれから導入する)で」「入力作業の自動化が目的」なら、この構成が最短かつ最も低コストな選択肢です。

よくある質問
「費用は本当に月数百円で済みますか?」
Claude APIの従量課金は前述の試算どおり、1件数円のオーダーに収まります(Haiku 4.5・公式単価で試算)。GASとGoogle Driveは既存のGoogle Workspace契約の範囲内で利用でき、AirtableもCRM側で既に契約している前提であれば、この自動化のための追加固定費はゼロです。ただしトークン単価は改定されることがあるため、導入時にはAnthropic公式の料金ページで最新情報をご確認ください。
「ZoomやTeamsの会議でも同じことができますか?」
問題なく対応可能です。今回の構成のうちGoogle Meet固有の要素は、「文字起こしがDrive内の所定フォルダに自動保存される」という入口部分だけです。Zoomであればクラウド録画の文字起こしをAPIやWebhookで取得し、Teamsであれば文字起こしファイルの保存先を監視対象に差し替えれば、手順2以降(Claudeでの構造化→CRM登録→Slack通知)の処理はそのまま活用できます。
「AIの抽出精度はどのくらい信用していいですか?」
「会社名・決定事項・次アクション」の抽出は実用水準に達していますが、100%ではありません。そのため本記事では、①バリデーションに落ちたデータは登録せず人間の対応に回す、②成功通知に抽出内容を載せて目視レビューを挟む、という2つの安全弁を設計に組み込んでいます。AIの出力を過信するのではなく、誤りにすぐ気づける仕組みを整えておくのが、この種の自動化を実務で扱う鉄則です。
まとめ──入力仕事は、仕組みで消す
この記事の要点
- 1Meetの文字起こしはBusiness Standard以上・日本語対応・主催者Driveに自動保存(公式仕様)
- 2必要な部品はGAS+Claude API+Airtableの3つ。追加SaaSは不要、AI費用も1件数円のオーダー
- 3設計の勘所は3点:処理済み管理を人間が触れない場所に置く/登録前に2段階バリデーション/「動いたこと」を毎回通知する
- 4トーク解析まで求めるなら専用ツールを導入し、入力自動化が目的なら自作する。分岐の基準は機能ではなく目的
同じ取り組みを、貴社でも。
「自社の商談フローに合わせた具体的な組み方を知りたい」「AirtableのCRM設計から相談したい」という方は、無料の壁打ち(30分)でご相談ください。実際に稼働している画面をお見せしながら、貴社に最適な構成図をその場で描きます!!
AI×CRM構築サービスを見る他の記事