前回に引き続き、文書ドキュメントの翻訳スクリプトを紹介する。今回は、選択範囲が、文章の一部か複数段落かあるいは文書全体かに関わらず、その内容を翻訳して文書内に挿入するというものだ。

また、選択した日本語文章を英語に翻訳するという内容は前回とほぼ同じだが、内容比較がしやすいように訳文をもとの文章に挿入し、段落ごとに「もとの文章 : 【翻訳した文章】」となるようにしている。

文書アプリで作成した日本語文書

文書内の選択した部分を英語に翻訳して、本文に挿入

なお、参考までにGoogle Appsの文書アプリには、もともと翻訳機能が用意されている。これは表示している文書全体を翻訳して別の文書として保存するもので、「ツール」→「ドキュメントを翻訳」から利用できる。今回のスクリプトは、翻訳文を同じ文書内に挿入するという少し違った動作としている。

「ツール」→「ドキュメントを翻訳」を使用すると、文書全体を指定した言語に翻訳できる。翻訳後の文書は別のファイルとして保存される

まず、スクリプトの内容を紹介しよう。スクリプト全文は以下の通り。

function Honyaku() {
  var selection = DocumentApp.getActiveDocument().getSelection();
  if (!selection) {
    DocumentApp.getUi().alert(" テキストが選択されていません ");
  }
  else {
    var elements = selection.getSelectedElements();
    for (var i = 0; i < elements.length; i++) {
      if (elements[i].isPartial()) {
        var element = elements[i].getElement().asText();
        var startIndex = elements[i].getStartOffset();
        var endIndex = elements[i].getEndOffsetInclusive();

        var text = element.getText().substring(startIndex, endIndex + 1);
        var translatedText = LanguageApp.translate(text, 'ja', 'en'); 
        element.insertText(endIndex + 1, " 【" + translatedText + "】 ");
      } else {
        var element = elements[i].getElement();
        if (element.editAsText) {
          var text = element.asText().getText();
          var translatedText = LanguageApp.translate(text, 'ja', 'en'); 
          element.asText().setText(text + " 【" + translatedText + "】 ");
        }
      }
    }
  }
}

今回のスクリプトのポイントは、文書内のどの部分が選択されていても対応できるように、段落の一部を選択しているか段落全体を選択しているかで、処理を分岐している点だ。

順を追って見ていくと、冒頭の、文書の選択領域を取得して変数「selection」に格納する処理と、if文でこの「selection」の値が「null」かどうか(文章が選択されているかどうか)を判断する処理は前回と同様だ。

次に、「getSelectedElements()」メソッドで、選択範囲の段落要素(Element)を配列変数「elements」に格納し、この段落要素をfor文でひとつずつ処理していく。for文中のif文では「isPartial()」メソッドを使用して抜き出した段落要素が、「段落全体」なのかそれとも「段落内の一部(Part)」なのかをチェックしている。

段落内の一部の文章の場合には、選択範囲がその段落内の何文字目から始まり何文字目で終わるのかを調べてから、その部分のみ抜き出してを翻訳を行い、最後に「insertText()」メソッドで、選択範囲の最後の文字+1文字目に翻訳文を挿入している。

選択範囲が段落全体の場合には、段落内容をテキスト形式で取得し変数「text」に格納。翻訳を実行した後、こちらは「setText()」メソッドで、段落全体の内容を、もとの文章を格納した変数「text」と翻訳文を格納した変数「translatedText」で置き換えてるという処理だ。

以下は、段落内の一部を選択して実行した例と、複数段落を選択して実行した例になる。

段落内の一部分を選択して、翻訳スクリプトを実行した例

複数の段落を選択して、翻訳スクリプトを実行した例

なお、前回も紹介したが、翻訳もとや翻訳先の言語は言語ラベルの指定を変えるだけで、簡単に他の言語に変更できる。主要な言語ラベルは下表の通り。

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

スクリプト内で「translate(text, 'ja', 'en')」となっている2箇所(段落の一部か段落全体かで処理を分けたため)を、例えば、日本語から中国語であれば「translate(text, 'ja', 'zh-CN')」のようにすればよい。

画像左は日本語から中国語(簡体字)へ翻訳した例、右はドイツ語へ翻訳した例

さて、2回に渡って文書アプリの翻訳スクリプトを紹介したが、実際には文書ごとにスクリプトを作成して翻訳……というのはいかにも効率が悪い。Webページに入力ウインドウを用意し、そこに翻訳したい文章を入力して「翻訳」ボタンを押すと実行される、というのがよくあるサービスだろう。

次回は、このようなウィンドウやボタンなどの使用例を紹介する予定だ。