今回はGoogle Appsで提供されているツールの中から、文書アプリでのGoogle Apps Scriptの使用例を紹介する。とはいえ、スプレッドシート(表計算)のような数式計算やデータレポートとは違い、文書の作成では自動化できる作業はそれほど多くない。取り上げるのは、文書内の文を選択して、Googleの翻訳サービスを使って英語などの他言語に翻訳するスクリプトだ。

まずは、文章アプリではなくスプレッドシートで、翻訳を行うスクリプトの内容を見ておこう。文書アプリの例なのに、スプレッドシートから始めることになってしまうが、分かりやすい内容なので簡単に触れておく。

ここでは、スプレッドシートで使用できる翻訳を行うカスタム関数(スクリプト)を作成する。スクリプトの作成方法はこの連載の第1回を、カスタム関数の作成については第2回を参考にしてほしい。

作成する翻訳関数は、セルに入力された言葉や文を翻訳して表示するという単純な内容だ。スクリプト内容は下記の通り。ここではLanguageAppクラスの「translate()メソッド」を覚えておいてほしい。

function honyaku(msg) {  
  var result= LanguageApp.translate(msg, "en", "ja");
  return result;
}

非常にシンプルで、翻訳したい文章を渡し、2行目の「en」と「ja」で翻訳したい文章の言語ラベル(ここではen : 英語)と、翻訳先の文章の言語ラベル(ja : 日本語)を指定する。この部分を変更すれば、たとえば日本語からイタリア語へ、フランス語から日本語へといった翻訳も行えるわけだ。代表的な言語ラベルを下記に紹介する。

日本語 ja フランス語 fr スペイン語 es ポルトガル語 pt 韓国語 ko
英語 en イタリア語 it ドイツ語 de ロシア語 ru 中国語 zh-CN

作成したカスタム関数をセルに入力

引数に指定したセルの内容が翻訳されて表示される

さて、本題の文書アプリの内容に進もう。ここでは、文書上の日本語テキストを選択して実行すると、その文章を翻訳した内容をポップアップで表示するというスクリプトを作成する。翻訳する言語は、上述の通り、言語ラベルで自由に変更できる。

スクリプトの内容は下記の通り。文書アプリでもスプレッドシートと同じように、「ツール」メニューの「スクリプトエディタ」からスクリプトの作成が行える。

function myTransrate() {
  var mySelection = DocumentApp.getActiveDocument().getSelection();
  var myTransrate = "";

  if (!mySelection) {
    myTransrate = " テキストが選択されていません ";
  }
  else {
    var myElements = mySelection.getSelectedElements();
    if (myElements.length > 1){
      myTransrate = " 段落をひとつだけ選んでください ";
    }
    else {
      var myElement = myElements[0].getElement();
      var startOffset = myElements[0].getStartOffset();
      var endOffset = myElements[0].getEndOffsetInclusive();
      var myTransrate = myElement.asText().getText();
      if (myElements[0].isPartial()) myTransrate = myTransrate.substring(startOffset,endOffset+1);

      myTransrate = LanguageApp.translate(myTransrate, "ja", "en");
    }
  }
  DocumentApp.getUi().alert(myTransrate);
}

文書アプリでも、スクリプトの作成はスプレッドシートの場合と同様に行える

まず最初に表示している文書の選択領域を取得し、変数「mySelection」に格納する。「getSelection()」メソッドで取得できる値は、表示している文書の"選択範囲"だ。もしかすると直感的に、選択した文章がそのまま取得できそうに思えるかもしれないが、そうではないことに注意が必要だ。

「myTransrate」変数は、翻訳結果を格納するために使用するもので、最初は空文字を入力している。

続いて、if文を使って、選択領域から取得した値で動作を分岐していく。まず、mySelectionの値が「null」かどうか(文章が選択されているかどうか)を判断し、何も選択されていない場合には「テキストが選択されていません」というメッセージを代入し、最後のメッセージ表示行へと移る。

次に、複数の段落を選択しているかどうかを確認する。「getSelectedElements()」メソッドで、選択範囲の段落などの要素(Element)を配列変数「myElements」に格納し、この変数の要素数が1より大きい場合は、「段落をひとつだけ選択してください」として同様にメッセージ表示行へと移るようにしている。実際のところは複数の段落を選択していても、配列から順々に文章を取り出せばいいのだが、話を単純にするためにここでは翻訳する文章を一段落に限定している。

さて、やっとメインの文章内容を取得する部分だ。getSelectedElements()メソッドで取得した値から、配列の0番目の要素(最初の段落)を読み出す。「myElements[0]」がその部分だ。段落の文章と選択している範囲が異なる場合もあるので、段落内の「○文字目から」「○文字目まで」を選択しているかを調べ、選択範囲が段落の一部の場合には、その範囲だけを「substring()」メソッドで抜き出してmyTransrateに代入している。段落全体を選択している場合には、そのまま、段落全体の文章をmyTransrateに代入するといった動作になる。

これで、選択した文章が変数myTransrateに格納されたので、あとは冒頭のtranrate()メソッドを利用し、翻訳結果をダイアログで表示するといった処理になる。

文書で翻訳したい部分を選択

スクリプトマネージャからスクリプトを実行

翻訳結果がポップアップで表示される

文章を選択していない場合は、そのことをメッセージで表示

複数の段落を選択している場合にも同様にメッセージを表示

次回は今回のスクリプトを、選択した段落を順番にすべて翻訳する内容に改良する予定だ。