スプレッドシート連携・カスタム関数から、Gmail 要約 → Slack 通知の自動化まで。GAS から Gemini を安全に呼び出して業務に組み込む手順をまとめてみました。
なぜ Vertex AI(現 Gemini Enterprise Agent Platform)なのか
Vertex AI は Google Cloud のエンタープライズ向け AI プラットフォームです。ユーザーが入力したプロンプトや自社データが Google の基盤モデルの学習に利用されることはありません。企業のデータを守りながら、安全に生成 AI を活用できます。
全体の流れ
- GCP プロジェクトを用意する(作成 or 選択)
- Gemini API を有効化する
- GAS を標準 GCP プロジェクトに紐付ける
- 認証(アクセストークン)+
appsscript.json(スコープ)設定 - Hello World で疎通確認
- スプレッドシート連携(カスタム関数 / 一括処理メニュー)
- (応用)Gmail を要約して Slack へ通知
1. GCP プロジェクトの作成(または選択)
- Google Cloud コンソールにアクセス
- 画面上部のプロジェクト選択メニューから「新しいプロジェクト」を作成(または利用するプロジェクトを選択)
2. Agent Platform API の有効化
このコードは Agent Platform API 経由(aiplatform.googleapis.com)で Gemini を呼び出します。
- ナビゲーションメニューから 「API とサービス」 > 「ライブラリ」 を開く
- 検索窓に 「Agent Platform API」 と入力
- 該当の APIを選択し、「有効にする」 をクリック
直接有効化する場合はこのリンクからも可能です:
https://console.cloud.google.com/flows/enableapi?apiid=aiplatform.googleapis.com
3. 請求(Billing)アカウントの確認
- Vertex AI を利用するには、プロジェクトに請求アカウントの紐付けが必要です
- 初めて利用する場合は、無料トライアル枠 / 無料枠の範囲内で検証できます
ここまでで Google Cloud 側の準備は完了 です。
4. GAS と GCP プロジェクトの紐付け(標準プロジェクトへの切り替え)
GAS はデフォルトのままだと内部の特殊なプロジェクトで動作するため、そのままでは Vertex AI を呼び出せません。作成した 標準 GCP プロジェクト に紐付ける必要があります。
4-1. プロジェクト番号(Project Number)の取得
- Google Cloud コンソールのダッシュボードを開く
- 画面に表示されている 「プロジェクト番号」(数字のみ。例:
123456789012)をコピー
** ※「プロジェクト ID」とは異なるので注意**
4-2. GAS 側の設定変更
- GAS(Google Apps Script)のエディタ画面を開く

2. 左ナビゲーションの 「プロジェクトの設定(歯車アイコン)」 をクリック

3. ページ下部の 「Google Cloud Platform (GCP) プロジェクト」 にある「プロジェクトを変更」をクリック

4. コピーした プロジェクト番号 を貼り付け、「プロジェクトを設定」をクリック
(補足)「OAuth の同意画面が構成されていません」と出た場合
- Google Cloud コンソールの左メニューから 「API とサービス」 > 「OAuth 同意画面」 を開く
- User Type(ユーザーの種類)の選択
- 組織のアカウント(Google Workspace)の場合: 「内部(Internal)」(審査不要で社内ユーザー全員が利用可)
- 個人のアカウント(@gmail.com)の場合: 「外部(External)」
- アプリ情報の入力(最低限で OK)
- アプリ名: 任意(例:
GAS Vertex AI Integration) - ユーザーサポートメール: 自分のメール
- デベロッパーの連絡先情報: 自分のメール
- アプリ名: 任意(例:
- スコープ(Scopes)
- 何も追加せず「保存して次へ」で OK
5. 認証の実装(アクセストークン取得)と appsscript.json の設定
GAS から Vertex AI(GCP)にアクセスするために、ScriptApp.getOAuthToken() を使って一時的なアクセストークンを取得します。さらに GAS 側に「Google Cloud を操作する権限」を与えるため、マニフェスト(appsscript.json)にスコープを追加します。
5-1. appsscript.json の編集
- GAS エディタの左メニュー「プロジェクトの設定(歯車アイコン)」を開く
- 「『appsscript.json』マニフェスト ファイルをエディタで表示する」 にチェック
-
appsscript.jsonにoauthScopesを追記
{
"timeZone": "Asia/Tokyo",
"dependencies": {},
"exceptionLogging": "STACKDRIVER",
"runtimeVersion": "V8",
"oauthScopes": [
"https://www.googleapis.com/auth/cloud-platform",
"https://www.googleapis.com/auth/script.external_request",
"https://www.googleapis.com/auth/spreadsheets"
]
}
6. 動作確認(Hello World)
以下の最小コードを コード.gs に貼り付けて実行します。
function testVertexAI() {
const PROJECT_ID = 'ご自身のプロジェクトID'; // ※プロジェクト番号ではなくIDを指定
const LOCATION = 'asia-northeast1'; //
const MODEL = 'gemini-3.5-flash'; // 利用するモデル
const url = `https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/publishers/google/models/${MODEL}:generateContent`;
const payload = {
contents: [{
role: "user",
parts: [{ text: "こんにちは!自己紹介を1文でしてください。" }]
}]
};
const options = {
method: "post",
contentType: "application/json",
headers: {
Authorization: "Bearer " + ScriptApp.getOAuthToken()
},
payload: JSON.stringify(payload),
muteHttpExceptions: true
};
const response = UrlFetchApp.fetch(url, options);
const json = JSON.parse(response.getContentText());
Logger.log(json.candidates?.[0]?.content?.parts?.[0]?.text);
}
手順
-
PROJECT_IDをご自身の GCP プロジェクト ID に書き換え - 関数選択で
testVertexAIを選び、「実行」 - 初回実行時は承認が必要なので、指示に従って許可
- 実行ログに Gemini からの返答が表示されれば 接続成功 です
7. スプレッドシート連携
パターン①:カスタム関数(=GEMINI(セル))として呼び出す
=SUM() や =VLOOKUP() のように、セルに直接式を書いて AI の回答を表示します。GAS に以下のコードを貼り付けます(PROJECT_ID はご自身のものに変更)。
/**
* セルのテキストをGeminiに渡して結果を返すカスタム関数
* @param {string} text 対象のテキストやプロンプト
* @return {string}
* @customfunction
*/
function GEMINI(text) {
if (!text) return "";
const PROJECT_ID = 'ご自身のプロジェクトID';
const LOCATION = 'asia-northeast1';
const MODEL = 'gemini-3.5-flash';
const url = `https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/publishers/google/models/${MODEL}:generateContent`;
const payload = {
contents: [{
role: "user",
parts: [{ text: "以下のテキストを短く要約してください:\n" + text }]
}]
};
const options = {
method: "post",
contentType: "application/json",
headers: {
Authorization: "Bearer " + ScriptApp.getOAuthToken()
},
payload: JSON.stringify(payload),
muteHttpExceptions: true
};
try {
const response = UrlFetchApp.fetch(url, options);
const json = JSON.parse(response.getContentText());
return json.candidates?.[0]?.content?.parts?.[0]?.text ?? "";
} catch (e) {
return "エラー: " + e.toString();
}
}
スプレッドシート側の使い方
B2 セルに =GEMINI(A2) と入力すると、A2 の長文を要約して B2 に出力します。
パターン②:独自メニューで一括処理(おすすめ)
カスタム関数は「セルを編集するたび」に再計算が走り、無駄な API コストが発生するリスクがあります。実業務では「ボタンを押したときだけ A 列をまとめて B 列に要約出力する」方式が安全です。
// スプレッドシートを開いた時に独自メニューを追加する
function onOpen() {
SpreadsheetApp.getUi()
.createMenu('✨ AI自動化')
.addItem('A列の文章をB列に要約', 'processBatch')
.addToUi();
}
// A列の値を読み込んでGeminiに投げ、結果をB列に書く
function processBatch() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const lastRow = sheet.getLastRow();
// 2行目から最終行までループ処理
for (let r = 2; r <= lastRow; r++) {
const inputText = sheet.getRange(r, 1).getValue(); // A列
const currentResult = sheet.getRange(r, 2).getValue(); // B列(既存)
// すでにB列に結果が入っている場合はスキップ(API節約)
if (inputText && !currentResult) {
const resultText = GEMINI(inputText);
sheet.getRange(r, 2).setValue(resultText);
}
}
}
使い方
スプレッドシートをリロードすると、上部メニューに「✨ AI自動化」が追加されます。そこから「A列の文章をB列に要約」をクリックするだけで、一括で要約できます。
8. 【応用】Gmail の重要メールだけを要約して Slack に通知する
8-1. Slack の準備(Webhook URL の取得)
Slack の特定チャンネルに投稿するために、Incoming Webhook の URL を用意します。(取得手順は Slack 公式ドキュメントをご参照ください)
例: https://hooks.slack.com/services/XXXX/YYYY/ZZZZ
8-2. appsscript.json に Gmail 権限(スコープ)を追加
スプレッドシートと同様に、今回は「Gmail を読み書きする権限」が必要です。oauthScopes に Gmail の権限を 1 行追記します。
{
"timeZone": "Asia/Tokyo",
"dependencies": {},
"exceptionLogging": "STACKDRIVER",
"runtimeVersion": "V8",
"oauthScopes": [
"https://www.googleapis.com/auth/cloud-platform",
"https://www.googleapis.com/auth/script.external_request",
"https://www.googleapis.com/auth/spreadsheets",
"https://mail.google.com/"
]
}
8-3. メール要約& Slack 通知スクリプト
新しいファイル(例: gmail_to_slack.gs)を追加して、以下を貼り付けます。
function checkAndSummarizeEmails() {
// 過去24時間以内の未読メールを取得(条件は適宜変更)
// 例: 特定ラベルや送信者に絞る場合: 'is:unread newer_than:1d label:important'
const threads = GmailApp.search('is:unread newer_than:1d');
if (threads.length === 0) {
Logger.log("新しい未読メールはありません。");
return;
}
// 取得した Slack の Webhook URL をここに貼る
const SLACK_WEBHOOK_URL = 'https://hooks.slack.com/services/XXXX/YYYY/ZZZZ';
for (let i = 0; i < threads.length; i++) {
const messages = threads[i].getMessages();
const latestMessage = messages[messages.length - 1];
const subject = latestMessage.getSubject();
const from = latestMessage.getFrom();
const body = latestMessage.getPlainBody().substring(0, 1000); // トークン節約
const prompt =
"あなたは優秀な秘書です。以下のメール本文を読み、以下の条件で出力してください。\n" +
"1. 重要度を【高・中・低】で判定\n" +
"2. 内容を3行の箇条書きで要約\n\n" +
`【件名】${subject}\n` +
`【送信者】${from}\n` +
"【本文】\n" +
body;
// 既存の GEMINI 関数を流用
const aiResponse = GEMINI(prompt);
// 重要度が【高】または【中】の場合だけ Slack に通知
if (aiResponse.includes('【高】') || aiResponse.includes('【中】')) {
const slackPayload = {
text:
"*📧 重要な新着メールがあります*\n" +
`*送信者:* ${from}\n` +
`*件名:* ${subject}\n\n` +
"*AI要約:*\n" +
aiResponse
};
UrlFetchApp.fetch(SLACK_WEBHOOK_URL, {
method: 'post',
contentType: 'application/json',
payload: JSON.stringify(slackPayload)
});
}
// 処理済みは既読化
threads[i].markRead();
}
}
8-4. GAS のトリガー(定期実行)を設定
- GAS エディタ左メニュー「トリガー(時計アイコン)」をクリック
- 右下「トリガーを追加」
- 例:以下で設定して保存
- 実行する関数:
checkAndSummarizeEmails - イベントのソース:
時間主導型 - 時間のベースのトリガータイプ:
日付ベース - 時刻:
午前8時〜9時(または任意の時間)
- 実行する関数:
これで、重要なメールが届いたときに AI が要約して Slack に通知してくれるようになります。




