Googleドキュメントにandroidで音声入力した後、「てん」や「まる」といった文字列を「、」や「。」に一括で置換するスクリプトをGoogle Apps Scriptで書いた

音声入力が実用に足るようになって久しい。そこで、本の内容をいちいちメモに取ったり、キーボードで入力する手間を省くべく、音声入力を使い始めた。
私が持っている入力デバイスは、XperiaZ5とiPad miniである。XperiaではEdvoiceというアプリを使っている。少し使ってみたところ、XperiaiPadの音声入力にはそれぞれ一長一短があることがわかった。

Xperia Z5 iPad mini
変換精度 良い やや悪い
句読点などを打てるか 流れのなかでは打てない 流れのなかでも打てる
持ち運び 軽い 重い

まず驚いたのはandroidの変換精度の高さだ。本の文章を一段落丸ごと読み上げてもほとんど変換ミスが見られない。一方iOSの方はミスがちらほら見られるため、修正が必要になる。
また、androidの方は句読点を打つことができない。「てん」や「まる」などと単体で、周りの文章と区切って言えば反応してくれるのだが、流れのなかではそのまま「てん」や「まる」などと入力してしまう。一方iOSの方は流れのなかでもしっかり句読点やカッコなどを入力してくれる。

f:id:armik:20180602221308p:plain
androidの入力例、「てん」や「まる」がそのまま入力されている

最後の持ち運びはOSというよりデバイスの問題なのだが、個人的には重要な問題である。
androidで句読点を打てないのは有名らしく、様々なブログで言及されている。

句読点の問題は、音声入力しながらキーボード入れるか、あるいはとりあえず「てん」とか「まる」とか言って、後でまとめて置換する方法で何とかなりそうです。 katsumakazuyo.hatenablog.com

これはGoogle音声入力の話なのだが、androidGoogle音声入力を使っている以上問題点としては同じだろう。

しかしながら、いちいち「てん」とか「まる」とか「かいぎょう」とか「かぎかっこ」とかを後でいちいち置換するのは面倒である。そのあたりは一括でやってほしい。 音声入力先はGoogleドキュメントを使っている。GoogleドキュメントはPC、スマホタブレットと全てのデバイスでアクセスできるため、扱いやすさが圧倒的であるためだ。調べてみると、自動置換という機能があることが分かった。

11)カスタムショートカットを作成する Googleドキュメントには多数のショートカットが用意されていますが、自分がよく入力する内容をショートカットに設定したい場合もあります。 カスタムショートカットを作成するには、「ツール」>「設定」>「自動置換」を選択します。すでにいくつか入力されているかもしれませんが(1/2を½を変更する等)、自由に独自のショートカットを追加することが可能です。 blog.hubspot.jp

これを試したところ、置換対象を全角文字としてしまうとなぜか反応しなかった。実はできたりするのだろうか?
置換先を全角にすることはできるようなので、適当な半角文字を句読点に対応させることで解決できそうだが、そうなると音声入力の際に面倒である。

便利なツールも見つからなかったので、Google Apps Script(GAS)で置換するスクリプトを書いた。単純なコードなのでわざわざ上げるまでもないのだが、話題になっていたGASを初めて触る機会となったので残しておく。

まず、Googleドキュメントを開き、「ツール」から「スクリプトエディタ」を開く。
するとGASの開発環境が開くので(GASを追加していない場合は 5分で始めるGoogle Apps Script などを参照のこと)、そこに以下のコードを貼り付ける。

function onOpen() {
    var ui = DocumentApp.getUi();
    var addon = ui.createAddonMenu();
    addon.addItem('実行', 'myFunction');
    addon.addToUi();
  }
  
  function onInstall() {
    onOpen();
  }
  
function myFunction() {

  
  //var docTest=DocumentApp.openById("1KLUqrx7usMALtVPky9Go_pcQCFCsdHuZ43uFC-bWv4A"); //ドキュメントをIDで取得
  var docTest=DocumentApp.getActiveDocument();    
  var docAdd=docTest.appendParagraph("");
  
  changelistbefore=["てん", "まる", "かいぎょう", " "]; //置換前
  changelistafter=["、", "。", "\n", ""]; //置換後
  if(changelistbefore.length != changelistafter.length){
    Logger.log("置換の前後の数が一致しません\n");
    return;
  }
  
  var p=docAdd.appendText(docTest.getBody().getText());
  for(var i=0;i<changelistbefore.length;i++)
    p.replaceText(changelistbefore[i], changelistafter[i]);
  
  //Logger.log(docTest.getName()); //ドキュメントタイトルをログに表示
  //Logger.log(docTest.getBody().getText()); //ドキュメントの内容をログに表示
  
}

このスクリプトに適当に名前を付けて保存し(この記事では「一斉置換」としている)、OnInstall()を実行する。 f:id:armik:20180602230237p:plain

すると、開いていたGoogleドキュメントの「アドオン」にアドオンが現れる。

f:id:armik:20180602225629p:plain

これを実行すると、現在のドキュメントにある文章をすべて読み込み、「てん」や「まる」を「、」や「。」に変換してくれる。

f:id:armik:20180602230045p:plain
置換後

置換したい文字列を増やしたい場合は、スクリプト内部の「changelistbefore」と「changelistafter」にそれぞれ置換前と置換後の文字を""で囲って追加すればよい。
この追加もドキュメント側でできればよいのだが、CSSやhtmlには疎く実装できていない(外見にあまり時間もかけたくないし)。
また、スクリプトを任意のドキュメントに適用できればもっとよいのだが、その方法が分からない。今まで述べてきた方法だと、別のドキュメントになった場合にまた同じ処理を繰り返す必要がある。
一つのドキュメントを入力用と割り切ってしまえばよいのだが、文章をいちいち消去するのも面倒だし、どうしたものか。 そもそもGoogleが句読点入力に対応すればこんなことを気にする必要はないのだが。

参考にしたもの:
初心者でも簡単!Google Apps Scriptでドキュメントを取得して表示する方法
Google スプレッドシートで使えるアドオンを作ってみよう | SiTest (サイテスト) ブログ
アドオン・プログラムを作ろう!(2/5):Google Apps Scriptプログラミング [中級編] - libro
google apps scriptの終了のさせ方 -google apps scripの初心者ですが- JavaScript | 教えて!goo
JavaScriptで配列の要素数を取得する方法【Array.length】