こんにちは、くのへです!
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で面白いものを開発していきたいと思います。