1. はじめに
-
GoogleGEMINIで生成されたレポートの読みにくさ
当方、自治会役員を務めており、その業務の中で遭遇した生成AIが作成したレポートのすばらしさに感激し、これをもっと読みやすくしようとWordマクロを使用したツールを作成して見ました。その内容を皆様にお知らせし、様々なご意見を頂ければありがたいとの思いから、ツールを公開します。
Googleの生成AIツールであるGEMINIで作成された素晴らしいレポートですが、ダウンロードしてGoogleドキュメントやWordに変換してレポートを見た場合、引用番号と引用文献とがリンクされていないため、読みにくいのが難点と考えています。このことを当方が作成したレポートの一部を利用して具体的に説明します。生成AIでは、その根拠となる資料を確認することが必須であり、最も重要なことと考えています。レポートの読みやすさの観点から当方が認識している課題を以下に説明します。 -
課題1
上記のように、本文中の引用番号と引用文献のリストが離れているため、一々最後の引用文献のセクションにまで移動する必要があり読みにくいという難点があります。
-
課題2
引用文献において外部参照リンクをクリックして外部参照元にジャンプした後、本レポートに戻り最初の引用番号の位置に戻る際には、Wordの「戻る」ボタンは呼び出し元のデータがクリアされ機能しません。引用番号をクリックして引用文献にジャンプした後、外部リンクにジャンプしその内容を確認後、最初のクリック箇所に戻ることは、良くあること考えます。
-
Wordマクロによる課題への対応
そこで、引用番号と引用文献とをリンクさせる仕組み、および引用番号から引用文献さらに外部参照へジャンプした際最初の呼び出し元の文書番号に戻るための仕組みについてWordのマクロを使用して見ることにしました。具体的には以下に示すWordマクロツールを作成しました。課題1に対しては1.~3.の内容、課題2に対しては4.の内容が対応します。1. 引用番号にリンクを張り付けた後、誤りがあった場合等によりリンクを再作成する場合のために、張り付けたリンクを削除するツールを作成します。
2. 引用文献にリンクを張るため、参照文献毎にブックマークを設定します。ブックマーク名は、「引用文献」+「引用番号」(半角数字)とします。例えば、
引用文献
1.消防団への地域からの協力金問題と自治会の在り方、行政の消防分団への指導の在り方、 http://takechan-heiwa.cocolog-nifty.com/blog/2023/09/post-447f4c.html
この場合は、ブックマーク名を「引用文献1」とします。
3. 本文中の引用番号と対応する引用文献番号の引用文献との間に上記のブックマーク名を使用してリンクを張ります。
4. 「戻る」ボタンの代替機能を組み込みます。引用番号から引用文献にジャンプしさらにそこから外部リンクをクリックします。その後このレポート文書に戻った際、最初にクリックした引用場所へ戻るための仕組みを組み込みます。 -
ツール作成の前提
ツールの作成に当たっては、下記点を前提条件とします。また、使用したWordはOffice365のWordです。
1. 引用番号は上付き文字で表示され、上付き文字で表示されるものは他にありません。
2. 引用番号は上付き文字の数字で表示されており先頭に空白文字を1文字含みます。
3. 引用番号は最大2桁で、1か所の引用場所には1個の引用番号しか存在しないものとします。
4. 引用文献は、「引用文献」と表示した箇所以降に番号付き箇条書き項目のリストとして記載され、レポート文書の最後に配置されているものとします。
2. 作成ツールの詳細
-
張り付けたリンクを削除するツール
「引用文献」をキーワードとして、レポート全体を検索し、このキーワードより前方のリンクを削除します。なお、当該キーワードが複数存在する場合は、「引用文献」セクションを区別する別の方法を検討する必要がありますが、ここでは考えません。
削除対象のリンクオブジェクトをコレクションにて取得し、その後コレクションの各リンクオブジェクトを削除します。リンクオブジェクトは「引用文献」という行の前後で2種類存在して、前者は文書内で引用文献番号にリンクするもので削除対象、後者は引用文献の各項目に対応した外部参照のリンクで削除対象外す。前者を検出の都度削除すると、リンクフィールドが削除されることでそれ以降の文字位置が変更されるため、後者の外部参照のリンクまで削除してしまいます。そのため、まず削除対象のリンクオブジェクトをコレクションに格納した後、これらを順次削除しています。Sub DeleteHyperLinks() Dim cl As Collection Dim c As Hyperlink, s As Hyperlink Dim myRange As Range '検索用 Dim i As Long, k As Long, n As Long '参照文献セクションより前の本文におけるリンクをcl(Collection)として取得 'Collectionオブジェクトを削除することで、HyperLinkオブジェクトを個々に削除することの不具合(削除位置以降の文章に対する影響)を回避 Set myRange = ActiveDocument.Content myRange.Find.Execute FindText:="引用文献" n = myRange.Start Set cl = New Collection k = 0 For Each s In ActiveDocument.Hyperlinks If s.Range.Start < n Then cl.Add s Else k = k + 1 End If Next 'リンクの削除 For Each c In cl c.Delete Next Set cl = Nothing MsgBox "リンクは外部参照の" & ActiveDocument.Hyperlinks.Count & "個のみです。" End Sub
-
引用文献セクションにおいて、引用文献番号でブックマークを作成
「引用文献」以降の各文献番号に対応して上述したブックマークを作成します。Sub InsertBookmark() Dim myRange As Range Dim para As Variant Dim iStart As Long, iEnd As Long Dim i As Long, k As Long, n As Long Call DeleteBookmark Set myRange = ActiveDocument.Content myRange.Find.Execute FindText:="引用文献" n = myRange.End For Each para In ActiveDocument.ListParagraphs If para.Range.Start > n Then k = para.Range.ListFormat.ListValue iStart = para.Range.Start iEnd = para.Range.End End If With ActiveDocument.Bookmarks .Add Range:=ActiveDocument.Range(iStart, iEnd), Name:="参考文献" & Format(k) .DefaultSorting = wdSortByName .ShowHidden = False End With Next End Sub
-
引用番号と引用文献とのリンクを設定
引用番号と引用文献との間のリンクを引用文献番号のブックマークを使用して設定します。Sub SetHyperLinks() Dim myRange As Range '検索用 Dim i As Long, k As Long, n As Long Dim tmp As String Application.DisplayStatusBar = True Call DeleteHyperLinks n = ActiveDocument.Characters.Count Set myRange = ActiveDocument.Content myRange.Find.Execute FindText:="引用文献" n = myRange.Start i = n - 1: k = 1 'リンクを挿入すると、その後の文字位置が変更されるため、文末最後から文頭に向かって検索 Do If ActiveDocument.Range(i - 1, i).Font.Superscript Then '(_n)、(_nn)を検知 If ActiveDocument.Range(i - 2, i).Font.Superscript Then If ActiveDocument.Range(i - 3, i).Font.Superscript = -1 Then '2桁の参照番号の場合(_nn)、(_n)の場合9999999を返す k = 2 Else k = 1 End If Set myRange = ActiveDocument.Range(i - k, i) Else '表中データに引用番号直後、2改行のケースへの特別対応 k = 3 Set myRange = ActiveDocument.Range(i - k, i - k + 1) End If tmp = myRange.Text If Not IsNumeric(tmp) Then '引用番号直後に改行という表中データへの対応 If InStr(1, tmp, Chr(10)) <> 0 Or InStr(1, tmp, Chr(13)) Then MsgBox tmp & "には、改行が含まれています。改行を削除して作業を継続します。" Set myRange = ActiveDocument.Range(i - k - 1, i - 1) '1つ先頭よりのデータを追加した際に数字と判断できる場合は2桁引用番号 If Left(myRange.Text, 1) = " " Then Set myRange = ActiveDocument.Range(i - k, i - 1) '1桁の参照番号の場合のみmyRangeの範囲を変更 End If tmp = myRange.Text Else tmp = ActiveDocument.Range(i - 100, i + 100).Text '前後文章を表示させる MsgBox tmp & "をチェックしてください。数字ではないものが含まれているため、リンクは作成されていません。" tmp = "" 'リンクを設定しない End If End If If tmp <> "" Then '引用文献へのリンクを設定 ActiveDocument.Hyperlinks.Add Anchor:=myRange, Address:="", SubAddress:="参考文献" & tmp End If i = i - k - 1 Else i = i - 1 End If DoEvents Application.StatusBar = Str(n - i) & "/" & Str(n) Loop While i > 1 Application.StatusBar = False Set myRange = Nothing End Sub
-
引用番号に「戻る」機能を実装
WordアプリケーションオブジェクトのWindowsSelectionChangeイベントを使用し、選択場所が上付き文字の時のみに選択場所を記録し、「戻る」ボタン機能をクリックした際に、記録された場所に戻るような機能としました。
リンク先へジャンプする際、場所が選択されていることが前提になるため、引用番号を選択後、Ctrlキーを押しながら選択場所をクリックしてリンク先にジャンプという操作となります。したがって、カーソルを置いた状態でCtrlキーを押しながらクリックした場合、この機能は実行されません。このような場合も想定されるため今後対応が必要かもしれませんが、現状では引用番号を選択後Ctrlキーを押して引用番号をクリックしてジャンプすることを前提としています。
補足したイベント時に実施する操作を定義するため、クラスモジュールを利用します。クラスモジュールに以下の内容を記述し、これをClass1として定義します。Public WithEvents appWord As Word.Application Private Sub appWord_WindowSelectionChange(ByVal Sel As Selection) If Sel.Range.Font.Superscript Then ' 現在のカーソル位置を記録 Set LastPosition = Sel.Range ' MsgBox "カーソル位置を記録しました。" End If End Sub
Word起動時に、上記イベントを定義したアプリケーションとして登録します。ThisDocumentモジュールに以下のように記載し、Wordファイルを開いた時点でイベントハンドラーへの登録を実行します。
Private Sub Document_Open()
Call Register_Event_Handler
End Sub
標準モジュールに以下のように記載し、Regisiter_Event_Handlerサブを記述します。
Public LastPosition As Range
Dim X As New Class1
' イベントハンドラーへの登録
Sub Register_Event_Handler()
Set X.appWord = Word.Application
End Sub
「戻る」ボタン機能を組み込むため、以下のサブルーチンを標準モジュールに記述します。
' 記録した位置に戻る
Sub GoBackToLastPosition()
If Not LastPosition Is Nothing Then
LastPosition.Select
' MsgBox "記録した位置に戻りました。"
Else
' MsgBox "記録された位置がありません。"
End If
End Sub
引用番号を選択後、Ctrlキーを押しながら引用番号をクリックしても「戻る」機能が機能しない場合には、手動でRegister_Event_Handlerサブを起動してみて下さい。
3.追加の対応
-
相互参照機能の活用
Wordでリンクを張る場合に、相互参照の機能があります。この機能を利用して同様のツールを作成しました。
引用文献は、番号付き箇条書き項目として既に登録されていますので、これを活用します。
しかしながら、文書の最終行に空行が存在しない場合、最後の文献を相互参照する際に以下のエラーメッセージが表示されます。このエラーの原因は特定していませんが、空行を挿入することでこのエラーを回避することが出来ました。
-
相互参照によるリンクの設定
上記のSetHyperLinksサブの「引用文献へのリンクを設定」箇所を以下のように変更します。ActiveDocument.Hyperlinks.Add Anchor:=myRange, Address:="", SubAddress:="参考文献" & tmp
↓
myRange.InsertCrossReference ReferenceType:="番号付きの項目", ReferenceKind:=wdNumberRelativeContext, _ IncludePosition:=False, InsertAsHyperlink:=True, ReferenceItem:=tmp '相互参照を設定した場合、文字の上付きが外れるため再度設定 myRange.Words(1).Font.Superscript = True
-
2種類の方法によるリンク設定
引用番号と引用文献とをリンクする設定において、ハイパーリンクによる設定と相互参照による設定の2種類を用意して、それぞれ以下のようなサブルーチンで対応できるようにしました。「2.ツールの詳細」において示したSetHyperLinksサブはSetLinkToSuperscripts(flag As Integer)サブとして、引数flagに応じてハイパーリンクによる設定と相互参照による設定とに切り替えるようにしています。ハイパーリンクによるリンク設定
Sub SetHyperLinks() '上付き引用番号にハイパーリンクを設定する '現状の引用番号に設定されているハイパーリンクを一旦クリアする Call DeleteHyperLinks '引用文献毎にブックマークを設定 Call InsertBookmark '新たに引用番号に対してハイパーリンクを設定する Call SetLinkToSuperscripts(1) End Sub
相互参照によるリンク設定
Sub SetCrossReference() '上付き引用番号に相互参照を設定する '文章の最終行以下に1行を挿入→エラー対策 Call InsertLastRow '現状の引用番号に設定されている相互参照を一旦クリアする Call DeleteCrossReferences '新たに引用番号に対して相互参照を設定する Call SetLinkToSuperscripts(2) End Sub
-
作成したツールの内容
以上の機能を組み込んだWordマクロファイルを以下に示します。Google GEMINIが作成したGoogleドキュメントをダウンロードしWordファイルに変換後埋め込みフォントを削除して保存したファイル(.docxファイル)と、上記機能を組み込みマクロ実行後(ハイパーリンクによるリンク設定)のファイル(.docmファイル)を示します。なお、GoogleドキュメントをWordファイルに変換してそのまま保存すると、Googleドキュメントでは20KBのものが、4.8MBにもなりました。そこで、埋め込みフォントを削除して保存すると40KBまでサイズが小さくなりました。
GEMINIが作成したレポートをダウンロードしWordファイルに保存したファイル(埋め込みフォント削除済み)
https://1drv.ms/w/c/664a77b16b40cfba/EZL5sBONuSZHqRbnnAiV_dgB6_KFMP7rz4V1B9-P50R2zQ?e=3FcIoF
上述した機能を組み込んだWordマクロファイル(マクロを実行し引用文献へハイパーリンクによりリンク済み)
https://1drv.ms/w/c/664a77b16b40cfba/EZLikrLCtbNPocm1CvTrCX0BcG-5hCPL_-3ar0R4VPvL_A?e=JgdZBk
4. おわりに
- GoogleGEMINIにより作成されたレポートのWordマクロによる利便性改善
Google GEMINIが作成したレポートをダウンロードしましたが、レポートの内容を確認するためにも引用文献の確認が重要と考えます。しかしながら、現行の仕組みでは引用文献の確認を実施しにくいため、Wordマクロを使用してツールを作成して見ました。 - 引用番号へ戻る機能の不十分性
文書内でリンククリックによるジャンプをフォローするために作成した仕組みは、WordマクロのSelectionChangeイベントを使用しています。このため、ジャンプ前にSelectioon範囲が取得できない場合(カーソルを置いた状態でCtrlキーをクリック)、ジャンプ元へ戻るが機能しません。当方のノウハウ十分でないためこれ以上の対応が出来ませんが、もっと効率的で信頼性のある方法がありましたら、教えて下さい。 - 課題1の改善についてGEMINI側の対応
GEMINIがレポートを作成する際に引用番号と引用文献との間にリンクを設定してもらえないかと問いかけましたが、レポート上では[snippet-id]という形式で引用箇所との関連を記載しており、これと引用文献とを「リンク」させることまでは対応できないとのことでした。