【powershell】MS Word の書式の修正履歴だけ一括承諾する


はじまり

Microsoft Word で原稿をやり取りするときに多用される「変更履歴の記録」ですが、上図のような書式変更の履歴で右欄が埋もれてしまうという事態がよくあると思います。実際のところ加筆・削除の記録以外は必要性が皆無なので、こうした書式変更関連の履歴だけを一括承諾してスッキリさせようと思います。

事前準備

今回は対象の Word 文書を開いた状態でコンソールからコマンドレット実行して一括処理します。
下記記事で紹介したコマンドレットを $profile に書き込んでおくかドットソースで読み込んでおくなどして Get-ActiveDocument で powershell から現在開いている文書を操作できるようにしておきます。

powershell で Office を捕まえてターミナルとして操作する

コード

VBA とは異なり、各種組み込み定数の値を指定してやる必要があります。
(参考: Word VBA 組み込み定数の値一覧

function Approve-StyleRevisionOnActiveDocument {
    <#
        .SYNOPSIS
        現在アクティブなWord文書中の書式関連の変更履歴を一括で承認する
    #>

    $doc = Get-ActiveDocument
    if (-not $doc) {
        return
    }

    $wdRevisionProperty = 3
    $wdRevisionParagraphProperty = 10
    $wdRevisionSectionProperty = 12
    $wdRevisionStyleDefinition = 13

    $n = 0

    $revisions = $doc.Revisions
    foreach ($rev in $revisions) {
        if ($rev.Type -in @($wdRevisionProperty, $wdRevisionParagraphProperty, $wdRevisionSectionProperty, $wdRevisionStyleDefinition)) {
            Write-Host $rev.FormatDescription -NoNewline -ForegroundColor White -BackgroundColor Green
            Write-Host " by " -NoNewline -ForegroundColor DarkGray
            Write-Host  $rev.Author -ForegroundColor Cyan -NoNewline
            Write-Host " on:" -ForegroundColor DarkGray
            Write-Host ("{0}" -f $rev.Range.Text)
            $rev.Accept()
            $n++
        }
    }

    if ($n -gt 0) {
        Write-Host ("{0} style revisions are Accepted!" -f $n) -ForegroundColor Green
    }
}

コンソール上での結果表示のために行数が増えていますが、 変更の承諾だけであれば .Accept() のみで十分なのでコード自体はもっと簡素化できます。

実行イメージ

対象の Word 文書を開いた状態でコンソール上からコマンドレットを実行します。

実行後の文書↓

実行後に Ctrl+Z で元に戻すことができます。