社内データの機密性を保ちながら、どうAIを活用するか。これは多くの情報システム担当者や業務推進者が頭を悩ませるテーマではないでしょうか。
世の中には数多くの便利なAIツールが存在しますが、手軽さの裏には常に情報漏洩のリスクが潜んでいます。APIキーをコードに直接書き込んでしまったり、利用規約を十分に確認せずに無料のAPIを利用したりするケースは、企業ガバナンスの観点から非常に危険な状態と言わざるを得ません。
高額なエンタープライズ向けAIツールを全社導入するべきか、それとも部門単位で手軽なSaaSを利用するべきか。賛否両論あるこの議論に対する現実的な解として、既存の社内インフラ内で完結する自動化アプローチが注目されています。大掛かりなシステム開発を行わずとも、Google Apps Script(GAS)とGoogle CloudのVertex AIを適切に連携させることで、安全かつ段階的にAIの恩恵を受ける環境を構築する道筋を探っていきましょう。
なぜ「GAS × Gemini」がB2B業務の安全な第一歩になるのか
「手元にあるツールで安全な環境を自作する」という選択肢は、非エンジニアに近い担当者にとって技術的ハードルが高く感じられるかもしれません。しかし、ガバナンスとコストのバランスを考慮した場合、これが最も確実な第一歩となるケースは業界を問わず報告されています。
外部サービスを使わない「Workspace内完結」のメリット
多くの企業はすでにGoogle Workspaceを業務基盤として利用しています。スプレッドシートでのデータ管理、ドキュメントでの議事録作成、Gmailでの顧客対応など、日々の業務データはすべてこの環境内に蓄積されています。
外部のAIサービスにデータを送信する場合、データの持ち出しに関する社内承認や、ベンダーのセキュリティ評価など、高いハードルを越えなければなりません。しかし、GASを用いてWorkspace内のデータとGoogle Cloud上のAIモデルを直接連携させれば、データはGoogleのインフラストラクチャから外に出ることはありません。これにより、情報システム部門の懸念を軽減しながら、業務担当者が自ら効率化を推進できる環境が整います。
Vertex AI経由でデータを学習させない設定の重要性
AIのAPIを利用する際、現場で最も警戒されるのが「送信したデータがAIの再学習に利用されないか」という点です。
Googleが提供するGeminiモデルには、一般向けのGoogle AI Studio経由のAPIと、エンタープライズ向けのGoogle Cloud(Vertex AI)経由のAPIが存在します。企業の業務利用においては、ガバナンスの観点からVertex AIを経由したアクセスを選択する企業が多く見られます。
一般的なエンタープライズクラウドの規約に基づけば、Vertex AIを通じて送信された顧客データ(プロンプトやレスポンスを含む)は、基盤モデルの学習に利用されないよう適切に設定・運用することが可能とされています。ただし、プランや契約形態によって条件が異なる場合があるため、導入前には必ず最新の公式ドキュメントでデータプライバシーに関する規約やオプトアウトの設定方法を確認してください。
【独自フレームワーク】AI導入の社内承認を通す「3軸評価」
情報システム部門の承認をスムーズに得るためには、以下の3つの軸で業務を評価するフレームワークが有効です。
- データ機密度:個人情報や未公開の財務情報を含まないか(低〜中リスクから着手)
- 業務頻度:毎日発生する定型作業か(ROIの算出が容易なものを優先)
- エラー許容度:AIが間違えた際に人間がカバーできるか(完全自動化ではなく人間介在型を前提とする)
この3軸を満たす業務(例:社内アンケートの分類、定例会議のタスク抽出など)から「GAS × Gemini」の連携をスモールスタートさせることで、リスクを最小限に抑えた実証が可能になります。
準備:10分で完了するセキュアな開発環境セットアップ
実装に入る前に、セキュリティを担保した開発環境を構築します。現場の失敗例としてよくあるのが、手軽さゆえにAPIキーをコードに直書き(ハードコード)してしまうこと。この状態でコードを社内共有すると、キーが意図せず拡散するリスクが生じます。
Google Cloud Projectの作成とVertex AI APIの有効化
まず、Google Cloud Consoleでプロジェクトを作成し、Vertex AI APIを有効化します。
- Google Cloud Consoleにアクセスし、新しいプロジェクトを作成します。
- 検索バーで「Vertex AI API」を検索し、「有効にする」をクリックします。
- 課金設定(Billing)が有効になっていることを確認します。※詳細な料金体系については、公式サイトをご確認ください。
現場のつまずきポイント:ここで課金設定を忘れると、後続のAPI呼び出しで「403 Forbidden」や「Quota exceeded」といったエラーが発生し、原因究明に時間を取られることがよくあります。
GASエディタでの認証設定とライブラリの準備
GASからVertex AIを呼び出す際、静的なAPIキーではなく、OAuth2を利用した一時的なアクセストークンを使用するのがベストプラクティスです。また、プロジェクトIDなどの環境依存変数は「スクリプトプロパティ」に保存して隠蔽します。
- GASエディタを開き、左側の歯車アイコン(プロジェクトの設定)をクリックします。
- 「スクリプト プロパティ」に以下のキーと値を追加します。
- プロパティ:
PROJECT_ID/ 値: (作成したGoogle CloudのプロジェクトID) - プロパティ:
LOCATION/ 値:asia-northeast1(または利用するリージョン)
- プロパティ:
appsscript.json(マニフェストファイル)を表示し、oauthScopesにhttps://www.googleapis.com/auth/cloud-platformを追加します。
以下のコードは、Vertex AIのAPIを安全に呼び出すための基本関数です。
/**
* Vertex AIのGeminiモデルを呼び出す基本関数
* @param {string} prompt - AIへの指示内容
* @return {string} AIからの回答
*/
function callVertexAIGemini(prompt) {
const properties = PropertiesService.getScriptProperties();
const projectId = properties.getProperty('PROJECT_ID');
const location = properties.getProperty('LOCATION');
// スクリプトの実行ユーザーの権限で一時トークンを取得(APIキー不要)
const token = ScriptApp.getOAuthToken();
// 注意: 以下のモデル名を '最新のGemini Flashモデル' に抽象化。利用前に公式ドキュメント(ai.google.dev)で確認。
const modelId = 'gemini-1.5-flash';
const endpoint = `https://${location}-aiplatform.googleapis.com/v1/projects/${projectId}/locations/${location}/publishers/google/models/${modelId}:generateContent`;
const payload = {
"contents": [{
"role": "user",
"parts": [{"text": prompt}]
}],
"generationConfig": {
"temperature": 0.2 // 事実に基づく処理の場合は低めに設定
}
};
const options = {
"method": "post",
"headers": {
"Authorization": `Bearer ${token}`,
"Content-Type": "application/json"
},
"payload": JSON.stringify(payload),
"muteHttpExceptions": true
};
try {
const response = UrlFetchApp.fetch(endpoint, options);
const json = JSON.parse(response.getContentText());
if (response.getResponseCode() !== 200) {
console.error(`API Error: ${response.getContentText()}`);
return "エラーが発生しました。ログを確認してください。";
}
return json.candidates[0].content.parts[0].text;
} catch (e) {
console.error(`Execution Error: ${e.message}`);
return "実行時エラーが発生しました。";
}
}
この実装により、コード内に機密情報を含めることなく、安全にAPIと通信する基盤が整います。
パターン1:スプレッドシート連携による「大量データの構造化」実装
実務で最も頻出する課題が、顧客アンケートや問い合わせ履歴といった「未整理のテキストデータ」の処理です。これを手作業で分類するのは多大な時間を要しますが、AIに任せることで構造化データへと変換できます。
アンケート回答の感情分析とカテゴリ分類コード
スプレッドシートのA列に「顧客の声」が入っており、B列に「感情(ポジティブ/ネガティブ/ニュートラル)」、C列に「カテゴリ(価格/機能/サポート)」を自動入力するコード例です。
/**
* スプレッドシートのテキストを分析し、結果を書き込む
*/
function analyzeFeedback() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const dataRange = sheet.getDataRange();
const values = dataRange.getValues();
// 1行目はヘッダーと仮定して2行目から処理
for (let i = 1; i < values.length; i++) {
const feedback = values[i][0]; // A列のテキスト
const isProcessed = values[i][1]; // B列が空かどうかで処理済みを判定
if (feedback && !isProcessed) {
const prompt = `
以下の顧客フィードバックを分析し、感情とカテゴリを判定してください。
出力は必ず「感情,カテゴリ」のカンマ区切り形式のみとしてください。
感情の選択肢: ポジティブ, ネガティブ, ニュートラル
カテゴリの選択肢: 価格, 機能, サポート, その他
フィードバック: "${feedback}"
`;
const result = callVertexAIGemini(prompt);
if (result && !result.includes("エラー")) {
const parts = result.split(',');
if (parts.length === 2) {
// B列に感情、C列にカテゴリを書き込む
sheet.getRange(i + 1, 2).setValue(parts[0].trim());
sheet.getRange(i + 1, 3).setValue(parts[1].trim());
}
}
// APIのレートリミット(クォータ制限)を回避するための待機
Utilities.sleep(1000);
}
}
}
タイムアウトを回避するバッチ処理のロジック
GASの実行時間には上限があります。利用するGoogle Workspaceのアカウント種別によって制限は異なりますが、一般的な目安として数分程度(約6分など)でタイムアウトする制約を意識した設計が求められます。
上記のコードでは if (feedback && !isProcessed) という条件分岐を入れています。これにより、処理が途中で止まっても、再度スクリプトを実行すれば「まだ処理されていない行」から再開できる仕組みになっています。業務運用においては、このような「冪等性(何度実行しても同じ結果になる性質)」を持たせることが安定稼働の鍵となります。
パターン2:ドキュメント連携による「議事録からのタスク自動抽出」
長時間の会議の後に、誰が何をすべきか(ネクストアクション)を整理するのは骨の折れる作業です。Googleドキュメントに書かれた議事録から、タスクだけを抽出する仕組みを構築してみましょう。
Google Docsの内容をGeminiに読み込ませる方法
ドキュメントのテキストを取得し、AIに解析させるコードです。ここでは、AIの回答をJSON形式で固定することで、後続のシステム連携を容易にするテクニックを使用します。
/**
* アクティブなドキュメントからタスクを抽出し、末尾に追記する
*/
function extractTasksFromDoc() {
const doc = DocumentApp.getActiveDocument();
const body = doc.getBody();
const text = body.getText();
const prompt = `
以下の会議議事録から、決定されたタスク(ネクストアクション)をすべて抽出してください。
以下のJSONスキーマに従って、純粋なJSON形式のみを出力してください。Markdownのバッククォートなどは不要です。
スキーマ:
{ "tasks": [ { "assignee": "担当者名", "action": "タスク内容", "deadline": "期限" } ] }
議事録:
${text}
`;
const resultText = callVertexAIGemini(prompt);
try {
// 余分な文字を取り除いてJSONとしてパース
const cleanJson = resultText.replace(/```json/g, '').replace(/```/g, '').trim();
const parsedData = JSON.parse(cleanJson);
if (parsedData.tasks && parsedData.tasks.length > 0) {
body.appendParagraph('\n--- 自動抽出されたタスク ---').setHeading(DocumentApp.ParagraphHeading.HEADING2);
parsedData.tasks.forEach(task => {
const taskText = `□ 担当: ${task.assignee} | 期限: ${task.deadline || '未定'} | 内容: ${task.action}`;
body.appendListItem(taskText);
});
}
} catch (e) {
console.error("JSONの解析に失敗しました", e);
body.appendParagraph("\n※タスクの抽出に失敗しました。形式を確認してください。");
}
}
JSONモードを活用した確実なデータ抽出
プロンプトエンジニアリングにおいて、AIに特定のフォーマットで出力させることは非常に重要です。最新のモデルでは構造化出力の精度が向上していますが、プロンプト内で明確なJSONスキーマを指定し、「純粋なJSON形式のみを出力して」と念押しすることで、プログラムで処理しやすい安定した結果を得やすくなります。出力の揺らぎはシステム連携時の致命的なバグに直結するため、この検証観点は見落とさないようにしてください。
パターン3:Gmail連携による「人間介在型(HITL)」返信下書き生成
AIに顧客対応を任せる際、「もしAIが間違った内容や失礼な文章を勝手に送信してしまったら」というリスクは計り知れません。B2Bの現場では、完全自動化に対する懐疑的な声も根強く存在します。
そこで、AIが「下書き」までを作成し、最後は人間が確認して送信ボタンを押す「Human-in-the-Loop(HITL)」というアプローチが現実的です。
受信メールのコンテキストを解析するロジック
特定の設定ラベルが付与された未読メールを取得し、文脈を理解して返信案を作成するコードです。
/**
* 特定のラベルがついたメールの返信下書きを自動作成する
*/
function draftRepliesForInquiries() {
// 「AI対応待ち」というラベルのついた未読スレッドを取得
const label = GmailApp.getUserLabelByName("AI対応待ち");
if (!label) return;
const threads = label.getThreads(0, 10);
threads.forEach(thread => {
if (thread.isUnread()) {
const messages = thread.getMessages();
const lastMessage = messages[messages.length - 1];
const body = lastMessage.getPlainBody();
const prompt = `
あなたは弊社のカスタマーサポート担当です。
以下の顧客からのメールに対する、丁寧な返信の文面を作成してください。
事実が不明な点については、「確認して改めてご連絡します」というスタンスをとってください。
顧客からのメール:
${body}
`;
const draftBody = callVertexAIGemini(prompt);
// 返信を下書きとして保存(自動送信はしない)
lastMessage.createDraftReply(draftBody);
// 処理済みとして既読にし、ラベルを外す
thread.markRead();
thread.removeLabel(label);
}
});
}
自動送信せず「下書き保存」に留める安心設計
このコードのポイントは createDraftReply() メソッドを使用している点です。これにより、担当者は自分のGmailの「下書き」フォルダを開くだけで、すでに文面が用意された状態から業務をスタートできます。ゼロから文章を考える認知負荷を下げつつ、最終的な品質担保は人間が行う。このガバナンスと効率化のバランスこそが、現場にAIを定着させる秘訣です。
運用フェーズの安心材料:コスト監視とエラー通知の自動化
システムは「作って終わり」ではありません。特に従量課金制のAPIを利用する場合、想定外のループ処理による高額請求や、APIの仕様変更による突然の停止といったリスクに備える必要があります。
トークン消費量をログに記録するコード
Vertex AIのAPIレスポンスには、消費したトークン数が含まれています。これをログとして記録しておくことで、どの業務でどれだけのコストが発生しているかを可視化できます。(最新の料金体系については公式サイトをご確認ください)
// API呼び出し関数内のレスポンス処理部分を拡張
const json = JSON.parse(response.getContentText());
const usage = json.usageMetadata;
if (usage) {
console.log(`消費トークン: プロンプト ${usage.promptTokenCount}, 生成 ${usage.candidatesTokenCount}`);
// 必要に応じてスプレッドシートのログ記録用シートに書き込む処理を追加
}
APIエラー発生時にSlack/Chatへ通知する仕組み
APIの呼び出し上限(クォータ制限)に達した場合や、認証エラーが発生した場合は、速やかに担当者に知らせる仕組みが必要です。GASの try-catch ブロック内で、Google ChatのWebhookやSlackのIncoming Webhookを呼び出す処理を追加することで、運用保守の初動を早める手立てとなります。
まとめ
外部サービスにデータを渡すことなく、Vertex AIを経由したセキュアな環境を構築し、GASを用いて段階的に導入を進める。このプロセスは、企業がAIガバナンスを維持しながら業務効率化を進めるための堅実な手段となります。
なお、企業向けAI環境の構築においては、本記事で紹介したGoogle CloudのVertex AIの他にも、Microsoftが提供するAzure OpenAI Serviceを利用したセキュアな実装も有力な選択肢として挙げられます。自社の既存インフラやセキュリティ要件に合わせて、最適なプラットフォームを選択する視点を持ってみてください。
AIの導入は、必ずしも全社的な巨大プロジェクトである必要はありません。日々のスプレッドシート整理や、メールの返信下書き作成といった「小さな自動化」を積み重ねることで、組織全体のAIリテラシーは確実に向上していきます。
自社への適用を検討する際や、より実践的なアーキテクチャの設計、チーム全体での安全なAI運用ルール作りに課題を感じている場合は、専門家が解説するセミナー形式での学習も効果的です。ハンズオンで具体的な実装手順を学ぶことで、技術的な不安を解消し、より確実な導入プロジェクトを進める目安となります。
コメント