OutlookVBAでGeminiAPIを呼び出し、メールの採点をしてもらおう!

こんにちは、くのへです!
OutlookVBAでGeminiAPIを呼び出し、メールを採点してもらうマクロを作ったのですが、これがすごく良い感じです。

ちょっと採点基準が「ん!?」と思う点もあったりしますが、結構 的確なアドバイスももらえます。

ということで、これを記事化しました。
OutlookVBA使いの皆様、是非こちらを試してみて下さい。

1. 動作はこちら

メールを作ってから、メール採点ボタンを押してプログラムを呼び出します。
このメール文章をGeminiに送信し、採点結果が返ってきてmsgboxで表示される、という仕組みです。

2. コード

以下がこのコードです。Outlook VBAエディタに貼り付けてください。
GeminiAPIキーの部分はご自身のGeminiAPIキーに書き換えて下さい。

使い方は3項をご覧ください。

なお、OutlookVBAが全く分からないという方は、是非こちらのリンク先の本に詳しく書いてますよ!!(ステマ)
ファーストゲートにも講座がありますので、ご参加頂ければと思います。
なお、GeminiAPIキーはこちらの記事に取得方法を記載しましたので、ご参照ください。

Sub メール採点()
    
    Dim objSelectMail As Object
    Set objSelectMail = ActiveInspector.CurrentItem
    
    Dim message As String
    Dim GeminiReply As String
    
    message = objSelectMail.body
    GeminiReply = メール採点GeminiAPI(message)
        
    MsgBox (GeminiReply)
    
End Sub


Function メール採点GeminiAPI(ByVal message As String) As String
         
    Dim url As String
    Dim APIkey As String
    Dim role As String
    Dim prompt As String
    
    APIkey = "あなたのGeminiAPIキー"
    url = "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-latest:generateContent?key=" & APIkey
 
    role = "メール文章の敏腕アドバイザーであり、優しい癒しのお姉さんです。"
    prompt = "次のメール文章を100点を最高得点として採点してください。簡素に修正アドバイスを加え254文字以内でまとめつつ、癒しの一言をお願いします。ただし絵文字のような環境依存文字は使わないでください。" & _
             "返信元や転送元のメール文章は無視してください。文章はプレーンテキスト形式でお願いします" & vbCrLf
    
    
    Dim http As Object
    Set http = CreateObject("MSXML2.XMLHTTP.6.0")

     
    Dim body As String
    body = "{""contents"":[" & _
               " {""role"": ""model"", " & _
                  """parts"": [{" & _
                     """text"": """ & role & """}]}," & _
               " {""role"": ""user"", " & _
                  """parts"": [{" & _
                     """text"": """ & prompt & message & """}]} " & _
            "]}"
     
    With http
        Call .Open("POST", url, False)
        Call .setRequestHeader("Content-Type", "application/json")
        Call .Send(body)
         

    End With
    
    Dim strReturnText As String
    strReturnText = extractText(http.responseText)
    strReturnText = exchangeText(strReturnText)
    
    メール採点BOT = strReturnText
  
End Function

Function extractText(ByVal str As String) As String

  Dim temp As String
  Dim startPos As Integer
  Dim endPos As Integer
  
  startPos = InStr(str, """text"": """) + 9
  endPos = InStr(startPos, str, """")

  temp = Mid(str, startPos, endPos - startPos)

  extractText = temp

End Function


Function exchangeText(ByVal str As String) As String

  Dim temp As String

  temp = Replace(str, "\n", vbCrLf)
  temp = Replace(temp, "*", "")

  exchangeText = temp

End Function

3. 使い方とコード解説

このコードは、メール作成ウィンドウ(:ポップアウトした状態のメールウィンドウ)で、プログラム「メール採点」を実行すると、メール本文がGeminiにて採点され、その点数とアドバイスが返るようになっています。

下図のように、Outlookの基本ウィンドウに手作成中のメールには動作しませんのでご注意ください。

上記のコードについて解説します。

まず、以下のコードがメイン部です。現在のインスペクター(メールウィンドウ)のメールアイテムをobjSelectMailにセットし、body(本文)を変数messageとしてセットしています。
そして、「メール採点GeminiAPI」というプログラムにメール本文(message)を与え、返ってきた値をGeminiReplyにセットしてMsgBoxにて表示しています。

Sub メール採点()
    
    Dim objSelectMail As Object
    Set objSelectMail = ActiveInspector.CurrentItem
    
    Dim message As String
    Dim GeminiReply As String
    
    message = objSelectMail.body
    GeminiReply = メール採点GeminiAPI(message)
        
    MsgBox (GeminiReply)
    
End Sub

ここは全然難しくないですね。

次に、以下のコードが本丸です。MSXML2.XMLHTTP.6.0ライブラリを使って、PostリクエストをGeminiAPIに送っています。
Postリクエストの基本構造はこの記事と同じですので、このコードを詳しく知りたい方は、その記事をご参照下さい。

Function メール採点GeminiAPI(ByVal message As String) As String
         
    Dim url As String
    Dim APIkey As String
    Dim role As String
    Dim prompt As String
    
    APIkey = "あなたのGeminiAPIキー"
    url = "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-latest:generateContent?key=" & APIkey
 
    role = "メール文章の敏腕アドバイザーであり、優しい癒しのお姉さんです。"
    prompt = "次のメール文章を100点を最高得点として採点してください。簡素に修正アドバイスを加え254文字以内でまとめつつ、癒しの一言をお願いします。ただし絵文字のような環境依存文字は使わないでください。" & _
             "返信元や転送元のメール文章は無視してください。文章はプレーンテキスト形式でお願いします" & vbCrLf
    
    
    Dim http As Object
    Set http = CreateObject("MSXML2.XMLHTTP.6.0")

     
    Dim body As String
    body = "{""contents"":[" & _
               " {""role"": ""model"", " & _
                  """parts"": [{" & _
                     """text"": """ & role & """}]}," & _
               " {""role"": ""user"", " & _
                  """parts"": [{" & _
                     """text"": """ & prompt & message & """}]} " & _
            "]}"
     
    With http
        Call .Open("POST", url, False)
        Call .setRequestHeader("Content-Type", "application/json")
        Call .Send(body)
         

    End With
    
    Dim strReturnText As String
    strReturnText = extractText(http.responseText)
    strReturnText = exchangeText(strReturnText)
    
    メール採点BOT = strReturnText
  
End Function

上記のコードの最後に次の部分があります

    Dim strReturnText As String
    strReturnText = extractText(http.responseText)
    strReturnText = exchangeText(strReturnText)
    
    メール採点BOT = strReturnText

この「extractText」は次のコードであり、GeminiAPIから返ってくる文字列はJSON形式で返ってくるので、必要な部分だけ抽出している関数になります。これもこちらの記事でほぼ同じ仕組みを解説していますので、詳しく知りたい方はこちらの記事を御参照ください。

Function extractText(ByVal str As String) As String

  Dim temp As String
  Dim startPos As Integer
  Dim endPos As Integer
  
  startPos = InStr(str, """text"": """) + 9
  endPos = InStr(startPos, str, """")

  temp = Mid(str, startPos, endPos - startPos)

  extractText = temp

End Function

先ほどのコードの最後に「exchangeText」という処理も行っていますね。これはこちらのプログラムです。
promptで「プレーンテキスト形式でお願いします」と書いているのにも関わらず、だいたい返ってくるのはmd形式の文章で返ってきます。md形式というのはマークダウン形式の略で、\nで改行したり、*と*で挟むことで太文字にするフォーマットなのですが、マークダウン形式を読めるエディタでなければ、太文字になったりはしてくれません。
msgboxでは当然ながらマークダウン形式はサポートしていないので、読みにくいだけです。
そこで、md形式の特殊文字を、読みやすい文字に変換しているのです。

Function exchangeText(ByVal str As String) As String

  Dim temp As String

  temp = Replace(str, "\n", vbCrLf)
  temp = Replace(temp, "*", "")

  exchangeText = temp

End Function

ということで、ザッとした解説でしたが、Geminiを使って採点してくれるシステムの出来上がりです。


4. 注意事項

以下の2点について、利用前にご確認ください。

1.表示内容の制限
このVBAコードでは採点結果をMsgBoxで表示しますが、MsgBoxの仕様上、約250文字までしか表示されません。採点内容が長い場合は途中で切れてしまうため、重要な内容は表示されないことがあります。
プロンプトで文字数を指示していますが、よくGeminiはこれを破りますw
ですので、採点文章が途中で切れてしまうことがよくあります。
より良いプロンプトを作った方は、是非教えて頂きたいと思います。

2.Gemini APIの利用に関する注意
Gemini APIを使用してメールの内容を送信するため、社外に送信することになります。
そのため、企業機密や個人情報を含むメールにはこのコードを使用しないようにしてください。
情報漏えいのリスクを防ぐため、機密性のある内容はGemini APIで採点しないようにしましょう。

おわりに

Outlookと生成AIの組み合わせは以前から絶対に相性がいいと思っていました。
メール文章を採点してくれると、どんどんメールが上手くなっていきます。
新入社員の教育にも非常に良い効果があると思います。

更にこの仕組みを発展させると、メールを修正してくれたり、より良い文章に直してくれる仕組みも作ることが出来ますね。
これは、本当に助かると思います。
さらに、キーワードを打ち込んだらメールの下書きを作成することも出来ますね。
本当にOutlookと生成AIって相性が抜群だと思います。

これからももっとOutlookVBA×Geminiで面白いものを開発していきたいと思います。

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
Contents