見出し画像

GoogleドキュメントでGASを使って特定の文字色(赤文字)の数をカウントしてみた。



1.今回作ったのはこれ

赤文字の数をカウントしたいのに、正確にカウントできる機能が備わっていなかったり、そもそも黒文字以外の色をカウントする機能がなかったりと、日頃から不便に感じていたので、この際、Google Apps Scriptで作成してみました。


2.なぜ作成しようと思ったか

Google Apps Script(以下GAS)を使ってGoogleスプレッドシートを操作する方法は検索すればたくさん出てきますが、Googleドキュメントを操作する方法はまだ数が少ないですよね。

私が所属する会社の社内業務の一つに記事制作があるのですが、その際にすでにある記事を修正する作業も存在します。このとき、追加した文字は赤文字で記載するというルールがあり、その追加した文字数を報告する義務がありました。

社内では共有のしやすさの観点からGoogleスプレッドシートやドキュメントを利用しており、記事制作においてはGoogleドキュメントを利用していました。

しかし、Googleドキュメントは文字数を表示させることは可能ですが、特定の文字色(ここでは赤文字)だけをカウントすることはできません。

Microsoft OfficeのWordを利用すれば特定の文字色をカウントすることはできなくはないですが、正確な文字数が表示されません。

ということでGoogleドキュメントでGASを使って特定の文字色(ここでは赤文字)をカウントできないかと考え、実際に作ってみました。

同じような境遇で困っている方や、業務を効率化したい方に参考にしてもらえたら幸いです。

それでは、用意するものから説明していきます。


3.用意するもの

誰でも無料で利用できるのでぜひ試してみてください。
用意するものは以下の2つです。

・Googleドキュメント
・スクリプトエディタ(GAS)

まずはGoogleドキュメントが必要なので、Googleのアカウントを取得していない方はこの際に取得しておきましょう。

スクリプトエディタとGoogleドキュメントはコンテナバインドという方法で開きます。つまりスクリプトエディタはGoogleドキュメントから開くことができるので、まずはGoogleドキュメントさえ開いていれば大丈夫ということです。

なお、Googleドキュメントやスクリプトエディタの使い方については検索すればすぐにわかるのでここでは割愛します。


4.機能ごとにソースコード紹介

コンテナバインドでスクリプトエディタを開いたら、早速コードを記述していきます。ここでは機能ごとにソースコードを紹介していきます。
まずはドキュメントと文字列を取得していきます。


4-1.ドキュメントと文字列の取得

// ドキュメントを取得
 const id = "ドキュメントID";
 const doc = DocumentApp.openById(id);
 
// Bodyセグメントを取得
 const body = doc.getBody();
 
// 文字列を取得
 let str = body.editAsText();
 let text = body.getText();

ドキュメントIDはコンテナバインド(Googleドキュメントとスクリプトエディタが紐付いている)しているGoogleドキュメントのURLに記載されているIDを使用してください。

もしくはコンテナバインドしているため、アクティブなドキュメントを取得する方法でも良いでしょう。その場合は以下の方法で取得可能です。

// ドキュメントを取得
 const doc = DocumentApp.getActivDocument();

また、文字列は通常getText()で取得して文字列を操作、編集していきますが、今回の場合、赤文字をカウントするためgetText()では対応しきれませんでした。getText()を利用した場合、文字の色は認識されなかったので、色を認識できるようにeditAsText()を利用します。
そのため、文字列を2パターンで取得しています。


4-2.文字列の空白やタブ、スペース、タグを削除

// 文字列内の空白やタブ、スペース等を削除
 let text_trim = text.trim();
 let text_r = text_trim.replace(/[\s\t\r\n]/g, "");
 
// 文字列内のタグを削除 
 let deltag = text_r.replace(/<("[^"]*"|'[^']*'|[^'">])*>/g, "");

4-1で取得した文字列textを利用して文字列に含まれる空白やタブ、スペースを削除していきます。
なぜ赤文字をカウントするだけなのに文字列の空白やタブ等を削除するのかというと、記事執筆者が無駄なスペース、空白文字を追加していたり、改行によってできる空白文字もすべて目に見えてない文字としてカウントされてしまうからです。

これらの目に見えていない文字を取り除くことで正確な文字数をカウントすることができるようになります。

文字を削除する方法はtrim()、replace()メソッドで正規表現を利用すれば簡単に一括で削除できます。
「\(バックスラッシュ)」はお使いの環境によっては「¥(半角の円マーク)」で表示されることもあるので注意してください。

必要に応じて「< >」などのタグも削除したい場合はreplace()メソッドと正規表現で削除しておきましょう。

また「NGワードは文字数としてカウントしたくない」といった場合もあると思います。そういった時にもreplace()メソッドが使えます。ぜひ使ってみてください。

ここまではグローバル変数およびグローバル定数を紹介しました。
次は機能ごとの関数について説明していきます。


4-3.赤文字をカウントして出力する関数

// 赤文字をカウントして出力する関数
 function count() {
// error処理をしつつ編集した文字列を出力し赤文字をカウント
 try {
   let i = 0;
   while (i < text.length) {
     if (str.getForegroundColor(i) == "#ff0000") {
       i++; 
     } else {
       str.deleteText(i,i);
     }
   }
 } catch(e) {
   
// 文字列内の空白やタブ、スペース等を削除
   let value = body.getText().trim().replace(/[\s\t\r\n]/g, "");

// ダイアログボックスを定義
   const ui = DocumentApp.getUi();
   const title = "赤文字の合計数";
   const prompt = value.length + "文字";
   console.log(value.length);

// ダイアログボックスを出力し赤文字の数をお知らせ
   ui.alert(title, prompt, ui.ButtonSet.OK);
 }
}

赤文字だけをカウントする関数を作成していきます。
ここではcount()という関数名にしています。関数名や変数名、定数名は適宜ご自身が利用しやすい名称に変更してください。

while文で文字列の長さ分ループを回し、1文字ずつ赤文字(#ff0000)かどうか判定していく処理をしています。赤文字以外でも判定することはもちろん可能です。
青文字なら#0000ff
黄文字なら#ffff00
緑文字なら#008000
といったようにカラーコードを指定すればカウントすることができます。

そしてここでは4-1で取得した2パターンの文字列、textとstrを使用しています。textは文字列の長さ、strは文字の色と削除する文字の位置を表しています。

4-1で説明したように変数textはgetText()メソッドで定義していますが、このgetText()メソッドは文字の色が認識できません。そのため文字の色を認識するeditAsText()メソッドで定義している変数strで赤文字を判定するように処理を書いています。

また、処理の都合上deleteText()で赤文字以外、つまり黒文字を削除しています。
これら一連の流れを実行すると、例外が発生し処理が止まってしまうため、処理を止めないためにtry catch文を利用して例外処理をし、最後まで実行するようにしています。

この時点で黒文字は削除され、赤文字だけが表示されるようになりますが、もうひと手間加えて、赤文字の数をダイアログボックスに表示させるようにします。

deleteText()で文字列を編集したので、trim()メソッドとreplace()メソッドで空白やスペース、タブ等を削除しておきます。

ダイアログボックスに出力する内容を定義し、正確な赤文字だけの合計数を出力します。
これで赤文字の数だけをカウントすることができました。

しかしこのままでは都度スクリプトエディタを開いて実行しなければならないので、Googleドキュメント上で実行できるように処理を追加します。


4-4.Googleドキュメント上で実行するための関数

// ドキュメント起動時、メニューバーに「Count」を表示
function onOpen() {
 const ui = DocumentApp.getUi();
 ui.createMenu("Count")
 .addItem("赤文字の数", "count")
 .addToUi();
}

onOpen()はGoogleドキュメントを起動した際に実行する関数です。
ドキュメントの
ファイル 編集 表示 ~~~ ヘルプ
と記載のあるメニューバーの「ヘルプ」の右側に赤文字をカウントするための実行ボタンを設置してみました。

ですが、おそらくこれだけではまだ実行ボタンは表示されないと思うので、もうひと手間だけ加えます。

スクリプトエディタで「トリガー」を追加します。

GoogleドキュメントでGASを使って特定の文字色の数をカウントしてみた。

上記のように設定し保存をクリックします。
これでドキュメントを一度更新してみて実行ボタンが表示されていればOKです。
そして実行ボタンがうまく機能しているかどうか確認してみてください。

赤文字の数だけカウントされていれば成功です。


5.一旦まとめ

ここまでのソースコードでGoogleドキュメントでGASを使って特定の文字色の数をカウントすることが可能です。

「調べてみたけどスプレッドシートとGASの方法ばかりでドキュメントとGASの使い方が載っていなかった」という方や「赤文字だけの数を数えたい」という方には参考になるのではないかと思っています。


ここで説明したソースコードをまとめたものは次の章以降で紹介します。
また、他にも使いやすいようにコードを追加しています。

・タグを除いたすべての文字数(文字色関係なく)をカウントする方法
・すべての文字を一括で削除する方法
・上記2つの実行ボタンの実装方法
・Googleドキュメント起動時に毎回「使い方」の説明を記載する方法

これらの情報を追加したソースコードをすべて公開しています。そのままコピー&ペーストするだけで利用可能です。

また、「プログラミングはよくわからない」という方はライブラリも作成しているので、このライブラリを利用するともっと簡単に赤文字の数をカウントすることが可能です。

ライブラリの利用方法についても以下で説明していますのでチェックしてみてください。


ここから先は以下の内容を紹介しています。

6.赤文字の数をカウントするソースコード
7.追加した機能とソースコード
7-1.タグを除いたすべての文字数をカウントする
7-2.すべての文字を一括で削除する
7-3.上記2つの実行ボタンの実装
7-4.Googlドキュメント起動時に毎回「使い方」の説明を記載する
8.全ソースコード公開
9.ライブラリを利用する方法
10.総まとめ

購入金額のアップ、記事の削除の可能性もあるため、気になる方は今のうちに購入をお願いします。

ここから先は

7,420字 / 3画像

¥ 980

期間限定 PayPay支払いすると抽選でお得に!

この記事が気に入ったらサポートをしてみませんか?