GSP1301

概要
アドインは Google Workspace の機能を拡張し、Google Workspace ユーザーの生産性向上とワークフローの改善に役立ちます。このラボでは、Gemini と Vertex AI の機能を活用して Gmail の感情分析を行う Google Workspace アドオンを構築します。必要なクラウド リソース(Vertex AI API を含む)をセットアップし、Apps Script プロジェクトを構成して、アドオンをデプロイする。
このアドオンを使用すると、否定的なトーンのメールを自動的に識別してラベル付けできます。これを使用して、カスタマー サービス対応の優先順位付けや、機密性の高いメールの迅速な特定を行うことができます。
ラボを終了する頃には、ビジネス コンテキスト内で生産性とコミュニケーションを向上させるための AI の実用的な応用を示す、機能的なツールが完成しているでしょう。
学習内容
このラボでは、次のことを行います。
- Gmail の機能を拡張する Google Workspace アドオンを構築する。
- Vertex AI を Google Workspace と統合して、Gmail アドオン内で Gemini と Vertex AI の自然言語処理機能を使用する。
- OAuth2 認証を実装して、アドオンがユーザーデータにアクセスすることを安全に承認します。
- 感情分析を適用して、メール コンテンツをプログラムで分析し、感情のトーンを判断する。
- Apps Script を利用して、Gmail とのやり取り、ユーザー インターフェースの管理、外部 API への接続を行うコードを記述します。
セットアップと要件
[ラボを開始] ボタンをクリックする前に
こちらの説明をお読みください。ラボには時間制限があり、一時停止することはできません。タイマーは、Google Cloud のリソースを利用できる時間を示しており、[ラボを開始] をクリックするとスタートします。
このハンズオンラボでは、シミュレーションやデモ環境ではなく実際のクラウド環境を使って、ラボのアクティビティを行います。そのため、ラボの受講中に Google Cloud にログインおよびアクセスするための、新しい一時的な認証情報が提供されます。
このラボを完了するためには、下記が必要です。
- 標準的なインターネット ブラウザ(Chrome を推奨)
注: このラボの実行には、シークレット モード(推奨)またはシークレット ブラウジング ウィンドウを使用してください。これにより、個人アカウントと受講者アカウント間の競合を防ぎ、個人アカウントに追加料金が発生しないようにすることができます。
- ラボを完了するための時間(開始後は一時停止できません)
注: このラボでは、受講者アカウントのみを使用してください。別の Google Cloud アカウントを使用すると、そのアカウントに料金が発生する可能性があります。
ラボを開始して Google Cloud コンソールにログインする方法
-
[ラボを開始] ボタンをクリックします。ラボの料金をお支払いいただく必要がある場合は、表示されるダイアログでお支払い方法を選択してください。
左側の [ラボの詳細] ペインには、以下が表示されます。
- [Google Cloud コンソールを開く] ボタン
- 残り時間
- このラボで使用する必要がある一時的な認証情報
- このラボを行うために必要なその他の情報(ある場合)
-
[Google Cloud コンソールを開く] をクリックします(Chrome ブラウザを使用している場合は、右クリックして [シークレット ウィンドウで開く] を選択します)。
ラボでリソースがスピンアップし、別のタブで [ログイン] ページが表示されます。
ヒント: タブをそれぞれ別のウィンドウで開き、並べて表示しておきましょう。
注: [アカウントの選択] ダイアログが表示されたら、[別のアカウントを使用] をクリックします。
-
必要に応じて、下のユーザー名をコピーして、[ログイン] ダイアログに貼り付けます。
{{{user_0.username | "Username"}}}
[ラボの詳細] ペインでもユーザー名を確認できます。
-
[次へ] をクリックします。
-
以下のパスワードをコピーして、[ようこそ] ダイアログに貼り付けます。
{{{user_0.password | "Password"}}}
[ラボの詳細] ペインでもパスワードを確認できます。
-
[次へ] をクリックします。
重要: ラボで提供された認証情報を使用する必要があります。Google Cloud アカウントの認証情報は使用しないでください。
注: このラボでご自身の Google Cloud アカウントを使用すると、追加料金が発生する場合があります。
-
その後次のように進みます。
- 利用規約に同意してください。
- 一時的なアカウントなので、復元オプションや 2 要素認証プロセスは設定しないでください。
- 無料トライアルには登録しないでください。
その後、このタブで Google Cloud コンソールが開きます。
注: Google Cloud のプロダクトやサービスにアクセスするには、ナビゲーション メニューをクリックするか、[検索] フィールドにサービス名またはプロダクト名を入力します。
タスク 1. ラボ環境にアクセスする
Google Cloud コンソールにログインしました。Gmail にログインします。
- [Gmail を開く] をクリックして、Gmail のログインページを開きます。
ヒント: タブをそれぞれ別のウィンドウで開き、並べて表示しておきましょう。
-
ユーザー名 とパスワードを使用して Gmail にログインします。
注: これらの認証情報は、[ラボの詳細] ペインにも記載されており、Google Cloud コンソールへのログインに使用されています。
- Gmail にアクセスしたら、[利用開始] をクリックし、その他の情報ウィンドウを閉じます。これで、受信トレイが表示されます。
これでラボのアクティビティを開始する準備が整いました。
タスク 2. Google Cloud 環境を構成する
このタスクでは、Vertex AI API を有効にしてから、OAuth 同意画面を構成し、Google Workspace でユーザーに表示する内容を定義します。
Vertex AI API を有効にする
-
Google Cloud コンソールのナビゲーション メニューで、[API とサービス] > [ライブラリ] をクリックします。
-
[API とサービスを検索] ボックスに「Vertex AI API」と入力し、検索結果で [Vertex AI API] をクリックします。
-
[有効にする] をクリックして API を有効にします。
[API / サービスの詳細] ページが開きます。
OAuth 同意画面を構成する
-
左側のペインで、[OAuth 同意画面] をクリックします。
-
[利用開始] をクリックします。
-
[アプリ情報] で次の設定を行い、[次へ] をクリックします。
-
アプリ名: Gemini と Vertex AI を使用した Gmail の感情分析
-
ユーザー サポートメール:
- [対象] で [内部] を選択し、[次へ] をクリックします。
- [連絡先情報] で、[メールアドレス] を に設定し、[次へ] をクリックします。
- [完了] で、Google API サービス: ユーザーデータに関するポリシーに同意し、[続行] をクリックします。
- [作成] をクリックします。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
OAuth 同意画面を構成する。
タスク 3. Apps Script プロジェクトをセットアップする
このタスクでは、アドオンを Apps Script プロジェクトとして作成して構成します。
Google Cloud プロジェクト番号を取得します。
Apps Script プロジェクトを作成するときに使用する Google Cloud プロジェクト番号を取得するには、次の手順を行います。
-
ナビゲーション メニュー(
)で、[Cloud の概要] > [ダッシュボード] をクリックします。
-
[プロジェクト情報] セクションで、このラボで後で使用するプロジェクト番号を記録します。
Apps Script プロジェクトを作成する
-
[受講者用リソース] ペインで、script.google.com/ のリンクをクリックして Apps Script ページを開きます。
-
[新しいプロジェクト] をクリックして、Apps Script プロジェクトを作成します。
-
プロジェクトに名前を付けます。
- 左上の [無題のプロジェクト] をクリックします。
- プロジェクトに「Gmail Sentiment Analysis with Gemini and Vertex AI」という名前を付け、[名前を変更] をクリックします。
-
マニフェスト ファイルを表示します。
- 左側のペインで、[プロジェクト設定] をクリックします(
)。
- [「appsscript.json」マニフェスト ファイルをエディタで表示する] を選択します。
-
Google Cloud Platform プロジェクトを変更します。
- さらに下へスクロールして [Google Cloud Platform(GCP)プロジェクト] セクションに移動し、[プロジェクトを変更] をクリックします。
- [GCP プロジェクト番号] を、先ほど記録したプロジェクト番号に設定します。
- [プロジェクトを設定] をクリックします。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
Apps Script プロジェクトを作成する。
タスク 4. コードファイルに入力する
- 左側のペインで、[エディタ](
)をクリックしてエディタ ウィンドウを開きます。
次の手順に沿って、サンプルコードでプロジェクトを更新します。
appsscript.json
-
appsscript.json
を開き、ファイルの内容を次のように置き換えます。
{
"timeZone": "America/Toronto",
"oauthScopes": [
"https://www.googleapis.com/auth/cloud-platform",
"https://www.googleapis.com/auth/gmail.addons.execute",
"https://www.googleapis.com/auth/gmail.labels",
"https://www.googleapis.com/auth/gmail.modify",
"https://www.googleapis.com/auth/script.external_request",
"https://www.googleapis.com/auth/userinfo.email"
],
"addOns": {
"common": {
"name": "Sentiment Analysis",
"logoUrl": "https://fonts.gstatic.com/s/i/googlematerialicons/sentiment_extremely_dissatisfied/v6/black-24dp/1x/gm_sentiment_extremely_dissatisfied_black_24dp.png"
},
"gmail": {
"homepageTrigger": {
"runFunction": "onHomepageTrigger",
"enabled": true
}
}
},
"exceptionLogging": "STACKDRIVER",
"runtimeVersion": "V8"
}
- [保存]
をクリックしてプロジェクトを保存します。
Code.gs
- コード.gs を開き、その内容を次のように置き換えます。
/*
Copyright 2024-2025 Google LLC
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// プロジェクト ID に置き換える
const PROJECT_ID = '{{{project_0.project_id | Project ID}}}';
// Vertex AI モデルのロケーション
const VERTEX_AI_LOCATION = 'us-east4';
// 感情分析に使用するモデル ID
const MODEL_ID = 'gemini-2.0-flash';
/**
* Triggered when the add-on is opened from the Gmail homepage.
*
* @param {Object} e - イベント オブジェクト。
* @returns {Card} - ホームページのカード。
*/
function onHomepageTrigger(e) {
return buildHomepageCard();
}
/**
* Builds the main card displayed on the Gmail homepage.
*
* @returns {Card} - The homepage card.
*/
function buildHomepageCard() {
// 新しいカードビルダーを作成する
const cardBuilder = CardService.newCardBuilder();
// カードヘッダーを作成する
const cardHeader = CardService.newCardHeader();
cardHeader.setImageUrl('https://fonts.gstatic.com/s/i/googlematerialicons/mail/v6/black-24dp/1x/gm_mail_black_24dp.png');
cardHeader.setImageStyle(CardService.ImageStyle.CIRCLE);
cardHeader.setTitle("Analyze your Gmail");
// ヘッダーをカードに追加する
cardBuilder.setHeader(cardHeader);
// カードセクションを作成する
const cardSection = CardService.newCardSection();
// サンプルメールの生成と感情分析のボタンを作成する
const buttonSet = CardService.newButtonSet();
// [サンプルメールを生成] ボタンを作成する
const generateButton = createFilledButton('サンプルメールを生成', 'generateSampleEmails', '#34A853');
buttonSet.addButton(generateButton);
// [メールを分析] ボタンを作成する
const analyzeButton = createFilledButton('メールを分析', 'analyzeSentiment', '#FF0000');
buttonSet.addButton(analyzeButton);
// ボタンセットをセクションに追加する
cardSection.addWidget(buttonSet);
// セクションをカードに追加する
cardBuilder.addSection(cardSection);
// カードをビルドして返す
return cardBuilder.build();
}
/**
* Creates a filled text button with the specified text, function, and color.
*
* @param {string} text - ボタンに表示するテキスト。
* @param {string} functionName - ボタンがクリックされたときに呼び出す関数の名前。
* @param {string} color - ボタンの背景色。
* @returns {TextButton} - 作成されたテキストボタン。
*/
function createFilledButton(text, functionName, color) {
// Create a new text button
const textButton = CardService.newTextButton();
// Set the button text
textButton.setText(text);
// Set the action to perform when the button is clicked
const action = CardService.newAction();
action.setFunctionName(functionName);
textButton.setOnClickAction(action);
// Set the button style to filled
textButton.setTextButtonStyle(CardService.TextButtonStyle.FILLED);
// Set the background color
textButton.setBackgroundColor(color);
return textButton;
}
/**
* Creates a notification response with the specified text.
*
* @param {string} notificationText - 通知に表示するテキスト。
* @returns {ActionResponse} - 作成されたアクション レスポンス。
*/
function buildNotificationResponse(notificationText) {
// 新しい通知を作成する
const notification = CardService.newNotification();
notification.setText(notificationText);
// 新しいアクション レスポンス ビルダーを作成する
const actionResponseBuilder = CardService.newActionResponseBuilder();
// アクション レスポンスの通知を設定する
actionResponseBuilder.setNotification(notification);
// アクション レスポンスをビルドして返す
return actionResponseBuilder.build();
}
/**
* Generates sample emails for testing the sentiment analysis.
*
* @returns {ActionResponse} - メール生成を確認する通知。
*/
function generateSampleEmails() {
// Get the current user's email address
const userEmail = Session.getActiveUser().getEmail();
// Define sample emails
const sampleEmails = [
{
subject: 'Thank you for amazing service!',
body: 'こんにちは。一緒に仕事ができてとても楽しかったです。今後ともどうぞよろしくお願いいたします。name: 'Customer A'
},
{
subject: 'Request for information',
body: 'Hello, I need more information on your recent product launch. ありがとうございましたname: 'Customer B'
},
{
subject: 'Complaint!',
body: '',
htmlBody: `こんにちは。また納期が遅れています。
サブスクリプションをキャンセルする前に、できるだけ早くご連絡ください。
`,
name: 'Customer C'
}
];
// Send each sample email
for (const email of sampleEmails) {
GmailApp.sendEmail(userEmail, email.subject, email.body, {
name: email.name,
htmlBody: email.htmlBody
});
}
// Return a notification
return buildNotificationResponse("Successfully generated sample emails");
}
/**
* Analyzes the sentiment of the first 10 threads in the inbox
* and labels them accordingly.
*
* @returns {ActionResponse} - 完了を確認する通知。
*/
function analyzeSentiment() {
// Analyze and label emails
analyzeAndLabelEmailSentiment();
// Return a notification
return buildNotificationResponse("Successfully completed sentiment analysis");
}
/**
* Analyzes the sentiment of emails and applies appropriate labels.
*/
function analyzeAndLabelEmailSentiment() {
// ラベル名を定義する
const labelNames = ["HAPPY TONE 😊", "NEUTRAL TONE 😐", "UPSET TONE 😡"];
// 各感情のラベルを取得または作成する
const positiveLabel = GmailApp.getUserLabelByName(labelNames[0]) || GmailApp.createLabel(labelNames[0]);
const neutralLabel = GmailApp.getUserLabelByName(labelNames[1]) || GmailApp.createLabel(labelNames[1]);
const negativeLabel = GmailApp.getUserLabelByName(labelNames[2]) || GmailApp.createLabel(labelNames[2]);
// 受信トレイの最初の 10 件のスレッドを取得する
const threads = GmailApp.getInboxThreads(0, 10);
// 各スレッドを反復処理する
for (const thread of threads) {
// スレッド内の各メッセージを反復処理する
const messages = thread.getMessages();
for (const message of messages) {
// メッセージのプレーン テキストの本文を取得する
const emailBody = message.getPlainBody();
// メール本文の感情を分析する
const sentiment = processSentiment(emailBody);
// 感情に基づいて適切なラベルを適用する
if (sentiment === 'positive') {
thread.addLabel(positiveLabel);
} else if (sentiment === 'neutral') {
thread.addLabel(neutralLabel);
} else if (sentiment === 'negative') {
thread.addLabel(negativeLabel);
}
}
}
}
/**
* Sends the email text to Vertex AI for sentiment analysis.
*
* @param {string} emailText - 分析するメールのテキスト。
* @returns {string} - メールに対する感情('positive'、'negative'、'neutral')。
*/
function processSentiment(emailText) {
// API エンドポイントの URL を構築する
const apiUrl = `https://${VERTEX_AI_LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${VERTEX_AI_LOCATION}/publishers/google/models/${MODEL_ID}:generateContent`;
// リクエスト ペイロードを準備する
const payload = {
contents: [
{
role: "user",
parts: [
{
text: `Analyze the sentiment of the following message: ${emailText}`
}
]
}
],
generationConfig: {
temperature: 0.9,
maxOutputTokens: 1024,
responseMimeType: "application/json",
// Expected response format for simpler parsing.
responseSchema: {
type: "object",
properties: {
response: {
type: "string",
enum: ["positive", "negative", "neutral"]
}
}
}
}
};
// リクエスト オプションを準備する
const options = {
method: 'POST',
headers: {
'Authorization': `Bearer ${ScriptApp.getOAuthToken()}`
},
contentType: 'application/json',
muteHttpExceptions: true, // エラー レスポンスを検査する場合は true に設定する
payload: JSON.stringify(payload)
};
// API リクエストを行う
const response = UrlFetchApp.fetch(apiUrl, options);
// レスポンスを解析する。解析する JSON レスポンスには 2 つのレベルがあります。
const parsedResponse = JSON.parse(response.getContentText());
const sentimentResponse = JSON.parse(parsedResponse.candidates[0].content.parts[0].text).response;
// Return the sentiment
return sentimentResponse;
}
[保存]
をクリックしてプロジェクトを保存します。
タスク 5. アドオンをデプロイする
このタスクでは、アドオンをデプロイし、その後インストールを確認します。
アドオンをデプロイする
-
タイトルバーで、[デプロイ] > [デプロイをテスト] をクリックします。
-
[アプリケーション] に [Gmail] が表示されていることを確認し、[インストール] をクリックします。
-
[完了] をクリックします。
インストールを確認する
-
Gmail タブを更新します。右側のペインにアイコン
が表示されます。
トラブルシューティング
アドオンがリストに表示されない場合は、ブラウザ ウィンドウを更新してください。
それでもアドオンが表示されない場合は、Apps Script プロジェクトに戻り、[デプロイをテスト] ウィンドウからアドオンをアンインストールして再インストールしてください。
タスク 6. アドオンを実行する
これでアドオンを実行する準備が整いました。このタスクでは、アドオンを開いて承認し、メールを生成して分析が機能することを確認します。
-
Gmail の右側のペインで、[感情分析](
)をクリックします。
-
サイドパネルが開いたら、[アクセスを承認] をクリックして、アドオンの実行権限を付与します。
同意画面が開きます。メールアドレス()を選択し、画面を順にクリックしてアクセスを許可します。
同意すると、右側に [感情分析] ペインが開きます。
- [感情分析] ペインで、[サンプルメールを生成] をクリックします。
アドオンで、分析をテストするためのサンプルメールが生成されるようになりました。生成が完了するとメッセージが表示されます。生成には数秒しかかかりません。
-
サンプルメールが受信トレイに表示されるまで待ちます。新しいメールを表示するには、受信トレイを更新する必要がある場合があります。
-
サンプルメールが受信トレイに届いたら、[感情分析] ペインで [メールを分析] をクリックします。
アドオン画面の下部に、分析が完了したことを示すメッセージが表示されます。
注:メールの分析には時間がかかることがあります。ページを更新すると、適用されたラベルのステータスを確認できます。
このアドオンはメールを分析し、受信トレイのメッセージに適切なラベル(「HAPPY TONE 😊」
、「UPSET TONE 😡」
、「NEUTRAL TONE 😐」
)を適用します。
ラベルが適用されたことを確認するには、Gmail を更新する必要がある場合があります。
- 実験を続ける
ラボの Gmail から別のラボの Gmail アカウントに、さまざまな感情(ポジティブ、ネガティブ、ニュートラル)のメールを送信して、アドオンをテストできます。外部メールは許可されていません。アドオンが各メールを分析してラベル付けする様子を確認します。
注: このコードでは、受信トレイから最新の 10 件のメールのみが取得されますが、この値は変更できます。
-
アドオンを閉じる:
アドオンの操作が完了したら、サイドパネルの右上にある [X] をクリックしてアドオンを閉じます。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
感情分析を適用する。
お疲れさまでした
これで、「Gemini と Vertex AI を使用した Gmail の感情分析」ラボが完了しました。
このラボでは、次の操作について学習しました。
-
Google Workspace アドオンを構築する: Gmail の機能を拡張する実用的なツールを開発する。
-
Vertex AI と Google Workspace の統合: Gmail アドオン内で Gemini と Vertex AI の自然言語処理機能を使用する。
-
OAuth2 認証を実装する: アドオンがユーザーデータに安全にアクセスできるようにする。
-
感情分析の適用: プログラムでメール コンテンツを分析し、感情のトーンを判断する。
-
Apps Script を活用する: Gmail とのやり取り、ユーザー インターフェースの管理、外部 API への接続を行うコードを記述する。
これで、メールの優先順位付けやワークフローの改善に役立つ、機能的な Gmail アドオンが完成しました。アドオンをさらに試して、感情分析をカスタマイズしたり、新しい機能を追加したりしてみましょう。
Google Cloud トレーニングと認定資格
Google Cloud トレーニングと認定資格を通して、Google Cloud 技術を最大限に活用できるようになります。必要な技術スキルとベスト プラクティスについて取り扱うクラスでは、学習を継続的に進めることができます。トレーニングは基礎レベルから上級レベルまであり、オンデマンド、ライブ、バーチャル参加など、多忙なスケジュールにも対応できるオプションが用意されています。認定資格を取得することで、Google Cloud テクノロジーに関するスキルと知識を証明できます。
マニュアルの最終更新日: 2025 年 3 月 25 日
ラボの最終テスト日: 2025 年 2 月 25 日
Copyright 2025 Google LLC. All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。