Gemini ve Vertex AI ile Gmail iletilerini analiz etme ve etiketleme

5 dakikanız var mı?
Kısa bir online ankete katılarak Google Workspace belgelerini iyileştirmemize yardımcı olun.

Bu çözüm, Gmail iletilerini analiz etmek ve duygularına göre etiketlemek için Vertex AI ve Gemini'ı kullanır.

Kodlama düzeyi: Orta
Süre: 30 dakika
Proje türü: Google Workspace eklentisi

  • Gmail'i yan çubukta genişleten bir Google Workspace eklentisi.
    Şekil 1: Duygu Analizi eklentisi, Gmail'de bir kenar çubuğu gösterir. Bu kenar çubuğunda kullanıcılar, Gemini'dan duygulara göre iletileri analiz etmesini ve etiket uygulamasını isteyebilir.
  • Nötr duyguya sahip bir Gmail iletisi
    Şekil 2: Eklenti, bir Gmail iletisini NEUTRAL TONE 😐 etiketiyle etiketliyor.
  • Olumlu duygular içeren bir Gmail iletisi.
    Şekil 3: Eklenti, bir Gmail mesajını HAPPY TONE 😊 etiketiyle etiketliyor.
  • Üzgünlük içeren bir Gmail iletisi
    Şekil 4: Eklenti, bir Gmail iletisini ÜZGÜN TON 😡 etiketiyle etiketliyor.

Hedefler

  • Çözümün ne işe yaradığını anlayın.
  • Google hizmetlerinin çözümde ne gibi işlevleri olduğunu anlayın.
  • Ortamı ayarlayın.
  • Google Apps Komut Dosyası projesini oluşturun.
  • Komut dosyasını çalıştırın.

Bu çözüm hakkında

Yaklaşım Analizi Google Workspace eklentisinin ekran görüntüsü

Bu çözüm, Gmail iletilerinin duygusal durumuna göre etiket uygulayan bir Google Workspace eklentisidir. Eklenti, mesaj içeriğini analiz etmek için Gemini 2.5 Flash modeline istem göndermek ve aşağıdaki duygulardan birini döndürmek üzere Vertex AI'ı kullanır:

  • Olumlu
  • Olumsuz
  • Normal

Gemini'dan gelen yanıtla birlikte eklenti, iletiye ilgili Gmail etiketini uygular.

Bu eklenti, Vertex AI API'ye yapılan isteği sınırlamak için yalnızca Gmail kullanıcısının gelen kutusundaki en son 10 iletiyi analiz eder ve etiketler. Kotalar ve sınırlar hakkında daha fazla bilgi edinmek için Vertex AI belgelerini ziyaret edin.

İşleyiş şekli

Bu çözüm, Google Apps Komut Dosyası'nda oluşturulmuştur ve aşağıdaki Google hizmetlerini ve ürünlerini kullanır:

  • Vertex AI API: Gmail iletilerinin içeriğini analiz etmek ve yaklaşımı belirlemek için Gemini 2.5 Flash modeline istem gönderir.
  • Apps Komut Dosyası hizmetleri:

    • Gmail hizmeti: Gmail iletilerini alır ve etiketler. İsteğe bağlı olarak, eklentiyi test etmek için örnek mesajlar oluşturur.
    • Kart hizmeti: Eklentinin Gmail'de kenar çubuğu olarak görünen kullanıcı arayüzünü oluşturur.
    • URL getirme hizmeti: Yaklaşım analizi için Vertex AI API'ye bağlanır.
    • Script hizmeti: Vertex AI API'yi çağırmak için getOAuthToken yöntemini kullanarak eklenti için bir OAuth 2.0 erişim jetonu alır.

Ön koşullar

Ortamınızı ayarlama

Bu bölümde, Google Cloud Console ve Apps Komut Dosyası'nda ortamınızı nasıl yapılandırıp ayarlayacağınız açıklanmaktadır.

Google Cloud Console'da Cloud projenizi yapılandırma

Bu bölümde, Vertex AI API'yi nasıl etkinleştireceğiniz ve Cloud projenizde OAuth onay ekranını nasıl yapılandıracağınız gösterilmektedir.

Vertex AI API'yi etkinleştirme

  1. Google Cloud Console'da Google Cloud projenizi açın ve Vertex AI API'yi etkinleştirin:

    API'yi etkinleştirme

  2. API'yi doğru Cloud projesinde etkinleştirdiğinizi onaylayıp İleri'yi tıklayın.

  3. Doğru API'yi etkinleştirdiğinizi onaylayın ve Etkinleştir'i tıklayın.

OAuth onay ekranını yapılandırma

Google Workspace eklentileri için izin ekranı yapılandırması gerekir. Eklentinizin OAuth kullanıcı rızası ekranını yapılandırmak, Google'ın kullanıcılara ne göstereceğini tanımlar.

  1. Google Cloud Console'da Menü > > Markalama'ya gidin.

    Markalama'ya gidin

  2. özelliğini zaten yapılandırdıysanız Markalama, Kitle ve Veri Erişimi'nde aşağıdaki OAuth izin ekranı ayarlarını yapılandırabilirsiniz. henüz yapılandırılmadı mesajını görürseniz Başlayın'ı tıklayın:
    1. Uygulama Bilgileri bölümündeki Uygulama adı alanına uygulamanın adını girin.
    2. Kullanıcı destek e-postası bölümünde, kullanıcıların rızalarıyla ilgili soruları olduğunda sizinle iletişime geçebileceği bir destek e-posta adresi seçin.
    3. İleri'yi tıklayın.
    4. Kitle bölümünde Dahili'yi seçin.
    5. İleri'yi tıklayın.
    6. İletişim bilgileri bölümünde, projenizde yapılan değişikliklerle ilgili bildirim alabileceğiniz bir e-posta adresi girin.
    7. İleri'yi tıklayın.
    8. Bitir bölümünde Google API Hizmetleri Kullanıcı Verileri Politikası'nı inceleyin ve kabul ediyorsanız Google API Hizmetleri: Kullanıcı Verileri Politikası'nı kabul ediyorum'u seçin.
    9. Devam'ı tıklayın.
    10. Oluştur'u tıklayın.
  3. Şimdilik kapsam eklemeyi atlayabilirsiniz. Gelecekte Google Workspace kuruluşunuzun dışında kullanılacak bir uygulama oluşturduğunuzda Kullanıcı türü'nü Harici olarak değiştirmeniz gerekir. Ardından, uygulamanızın gerektirdiği yetkilendirme kapsamlarını ekleyin. Daha fazla bilgi için OAuth iznini yapılandırma başlıklı kılavuzun tamamını inceleyin.

Apps Komut Dosyası projenizi oluşturup ayarlama

Eklenti için Apps Komut Dosyası projenizi oluşturup ayarlamak üzere aşağıdaki adımları tamamlayın:

  1. Gmail Sentiment Analysis with Gemini and Vertex AI (Gemini ve Vertex AI ile Gmail'de Duygu Analizi) Apps Komut Dosyası projesini açmak için aşağıdaki düğmeyi tıklayın.
    Apps Komut Dosyası projesini açın

  2. Genel bakış tıklayın.

  3. Genel bakış sayfasında Kopyasını oluştur'u Kopya oluşturma simgesi tıklayın.

  4. Cloud projenizin numarasını alın:

    1. Google Cloud Console'da Menü > IAM & Admin > Ayarlar'a gidin.

      IAM ve Yönetici Ayarları'na gitme

    2. Proje numarası alanındaki değeri kopyalayın.
  5. Cloud projenizi Apps Komut Dosyası projenize bağlayın:

    1. Kopyaladığınız Apps Komut Dosyası projenizde Proje Ayarları'nı Proje ayarları simgesi tıklayın.
    2. Google Cloud Platform (GCP) Projesi bölümünde Projeyi değiştir'i tıklayın.
    3. GCP proje numarası bölümüne Cloud proje numarasını yapıştırın.
    4. Projeyi ayarla'yı tıklayın.

Eklentiyi test etme

Eklentiyi denemek için test dağıtımı yükleyin ve ardından Gmail'de eklentiyi açın:

  1. Apps Komut Dosyası test dağıtımı oluşturup yükleyin:
    1. Kopyaladığınız Apps Komut Dosyası projenizde Düzenleyici'yi tıklayın .
    2. Code.gs dosyasını açın ve Çalıştır'ı tıklayın. İstendiğinde komut dosyasını yetkilendirin.
    3. Dağıt > Test dağıtımları'nı tıklayın.
    4. Yükle > Bitti'yi tıklayın.
  2. Gmail'i açın.

    Gmail'e gidin.

  3. Sağ kenar çubuğunda eklentiyi açın: Sentiment Analysis.

  4. İstenirse eklentiyi yetkilendirin.

  5. İsteğe bağlı: Eklentinizle test etmek için iletiler oluşturmak istiyorsanız Örnek e-postalar oluştur'u tıklayın. Gelen kutunuzda üç ileti görünür. Bu seçenekleri görmüyorsanız sayfayı yenileyin.

  6. Etiket eklemek için E-postaları analiz et'i tıklayın.

Eklenti, gelen kutunuzdaki son 10 mesajı inceler ve mesaj içeriğine göre aşağıdaki etiketlerden birini uygular:

  • NEŞELİ ÜSLUP 😊
  • NEUTRAL TONE 😐
  • ÜZGÜN TON 😡

Kodu inceleme

Bu çözümün Apps Komut Dosyası kodunu inceleyin:

Kaynak kodu göster

Code.gs

gmail-sentiment-analysis/Code.gs
/*
Copyright 2024 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.
*/

/**
 * Triggered when the add-on is opened from the Gmail homepage.
 *
 * @param {Object} e - The event object.
 * @returns {Card} - The homepage card.
 */
function onHomepageTrigger(e) {
  return buildHomepageCard();
}

Cards.gs

gmail-sentiment-analysis/Cards.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.
*/

/**
 * Builds the main card displayed on the Gmail homepage.
 *
 * @returns {Card} - The homepage card.
 */
function buildHomepageCard() {
  // Create a new card builder
  const cardBuilder = CardService.newCardBuilder();

  // Create a card header
  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");

  // Add the header to the card
  cardBuilder.setHeader(cardHeader);

  // Create a card section
  const cardSection = CardService.newCardSection();

  // Create buttons for generating sample emails and analyzing sentiment
  const buttonSet = CardService.newButtonSet();

  // Create "Generate sample emails" button
  const generateButton = createFilledButton('Generate sample emails', 'generateSampleEmails', '#34A853');
  buttonSet.addButton(generateButton);

  // Create "Analyze emails" button
  const analyzeButton = createFilledButton('Analyze emails', 'analyzeSentiment', '#FF0000');
  buttonSet.addButton(analyzeButton);

  // Add the button set to the section
  cardSection.addWidget(buttonSet);

  // Add the section to the card
  cardBuilder.addSection(cardSection);

  // Build and return the card
  return cardBuilder.build();
}

/**
 * Creates a filled text button with the specified text, function, and color.
 *
 * @param {string} text - The text to display on the button.
 * @param {string} functionName - The name of the function to call when the button is clicked.
 * @param {string} color - The background color of the button.
 * @returns {TextButton} - The created text button.
 */
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 - The text to display in the notification.
 * @returns {ActionResponse} - The created action response.
 */
function buildNotificationResponse(notificationText) {
  // Create a new notification
  const notification = CardService.newNotification();
  notification.setText(notificationText);

  // Create a new action response builder
  const actionResponseBuilder = CardService.newActionResponseBuilder();

  // Set the notification for the action response
  actionResponseBuilder.setNotification(notification);

  // Build and return the action response
  return actionResponseBuilder.build();
}

Gmail.gs

gmail-sentiment-analysis/Gmail.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.
*/

/**
 * Analyzes the sentiment of the first 10 threads in the inbox
 * and labels them accordingly.
 *
 * @returns {ActionResponse} - A notification confirming completion.
 */
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() {
  // Define label names
  const labelNames = ["HAPPY TONE 😊", "NEUTRAL TONE 😐", "UPSET TONE 😡"];

  // Get or create labels for each sentiment
  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]);

  // Get the first 10 threads in the inbox
  const threads = GmailApp.getInboxThreads(0, 10);

  // Iterate through each thread
  for (const thread of threads) {
    // Iterate through each message in the thread
    const messages = thread.getMessages();
    for (const message of messages) {
      // Get the plain text body of the message
      const emailBody = message.getPlainBody();

      // Analyze the sentiment of the email body
      const sentiment = processSentiment(emailBody);

      // Apply the appropriate label based on the sentiment
      if (sentiment === 'positive') {
        thread.addLabel(positiveLabel);
      } else if (sentiment === 'neutral') {
        thread.addLabel(neutralLabel);
      } else if (sentiment === 'negative') {
        thread.addLabel(negativeLabel);
      }
    }
  }
}

/**
 * Generates sample emails for testing the sentiment analysis.
 *
 * @returns {ActionResponse} - A notification confirming email generation.
 */
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: 'Hi, I really enjoyed working with you. Thank you again!',
      name: 'Customer A'
    },
    {
      subject: 'Request for information',
      body: 'Hello, I need more information on your recent product launch. Thank you.',
      name: 'Customer B'
    },
    {
      subject: 'Complaint!',
      body: '',
      htmlBody: `<p>Hello, You are late in delivery, again.</p>
<p>Please contact me ASAP before I cancel our subscription.</p>`,
      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");
}

Vertex.gs

gmail-sentiment-analysis/Vertex.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.
*/

// Replace with your project ID
const PROJECT_ID = '[ADD YOUR GCP PROJECT ID HERE]';

// Location for your Vertex AI model
const VERTEX_AI_LOCATION = 'us-central1';

// Model ID to use for sentiment analysis
const MODEL_ID = 'gemini-2.5-flash';

/**
 * Sends the email text to Vertex AI for sentiment analysis.
 *
 * @param {string} emailText - The text of the email to analyze.
 * @returns {string} - The sentiment of the email ('positive', 'negative', or 'neutral').
 */
function processSentiment(emailText) {
  // Construct the API endpoint URL
  const apiUrl = `https://${VERTEX_AI_LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${VERTEX_AI_LOCATION}/publishers/google/models/${MODEL_ID}:generateContent`;

  // Prepare the request payload
  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"]
          }
        }
      }
    }
  };

  // Prepare the request options
  const options = {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${ScriptApp.getOAuthToken()}`
    },
    contentType: 'application/json',
    muteHttpExceptions: true, // Set to true to inspect the error response
    payload: JSON.stringify(payload)
  };

  // Make the API request
  const response = UrlFetchApp.fetch(apiUrl, options);

  // Parse the response. There are two levels of JSON responses to parse.
  const parsedResponse = JSON.parse(response.getContentText());
  const sentimentResponse = JSON.parse(parsedResponse.candidates[0].content.parts[0].text).response;

  // Return the sentiment
  return sentimentResponse;
}

appsscript.json

gmail-sentiment-analysis/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"
}

Temizleme

Bu eğitimde kullanılan kaynaklar için Google Cloud hesabınızın ücretlendirilmesini önlemek istiyorsanız Cloud projesini silmenizi öneririz.

  1. Google Cloud Console'da Kaynakları yönetin sayfasına gidin. Şunu tıklayın: Menü > IAM ve Yönetici > Kaynakları Yönetin.

    Resource Manager'a gitme

  2. Proje listesinde, silmek istediğiniz projeyi seçin ve Sil'i tıklayın.
  3. İletişim kutusunda proje kimliğini yazın ve ardından projeyi silmek için Kapat'ı tıklayın.

Sonraki adımlar