Google Apps Scriptでは簡単に翻訳できる【GAS】

Googleのサービスの中で、他のサービス(特に国内)などを寄せ付けないほどに強力なのが、やはり言語系のサービス。Google HomeやAssistantの言語認識とそれを文字起こしするアプリ、音声からテキスト起こしするAPIなどは群を抜いています。

最近のニュースでは、Googleアシスタントで「同時通訳」などは、もはや音声認識関係の企業根こそぎ潰そうとしてるんじゃないかと思うくらい精度が高く、また無償で利用ができます。

そんな翻訳関係ですが、昔から実は簡単にGoogleスプレッドシートとGoogle Apps Scriptでは使えたりします。今回はそんな小ネタを。

今回使用するシート等

今回は、スプレッドシート関数であるgoogletranslate関数と、Google Apps Scriptで使えるLanguageAppを使った手法で、データを簡単に翻訳してみたいと思います。

実際に翻訳させてみる

スプレッドシートの関数として

標準で利用が可能な関数にgoogletranslate関数があり、使い方も非常に簡単。

数式 説明
=GoogleTranslate(A2, "en", "ja") 英語を日本語に翻訳します
=GoogleTranslate(A3, "auto", "en") 言語を自動認識して、英語に翻訳します
=GoogleTranslate(A4, "auto") 言語を自動認識して、既定の言語に翻訳します
  • autoで自動認識してくれます。
  • autoのみの場合、システムの言語に自動で翻訳を行います。
  • LanguageAppとは翻訳精度が異なりちょっと弱い。すごく機械翻訳感あり。
  • 翻訳先等は、言語コードを持って指定する。Wikipediaのページによるとalpha2のコードがそれになる。

図:システムの既定の言語の設定

Google Apps Scriptにて

Google Apps Scriptで利用されている翻訳システムは、本来は有料のCloud Translation APIのもののようで、googletranslateよりも翻訳精度は上です。Google翻訳も同じものかな?

少しgoogletranslate関数と異なる点があります。

//列を翻訳する
function transman() {
  //シートを取得する
  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("翻訳");
  
  //言語指定で翻訳する
  var tempword = ss.getRange("A2").getValue();
  var trans = LanguageApp.translate(tempword,"en","ja");
  ss.getRange("B2").setValue(trans);
  
  //自動認識で英語に翻訳する
  var tempword = ss.getRange("A3").getValue();
  var trans = LanguageApp.translate(tempword,"","en");
  ss.getRange("B3").setValue(trans);
  
  //HTMLごと翻訳する
  var tempword = ss.getRange("A5").getValue();
  var trans = LanguageApp.translate(tempword,"","ja",{contentType: 'html'});
  ss.getRange("B5").setValue(trans); 
  
}
  • LanguageAppの場合、システムの既定の言語で翻訳ができません。必ず翻訳先言語の指定が必要になります。
  • LanguageAppの場合、自動認識の場合は空文字で指定すると認識してくれます。
  • googletranslateと違い、HTMLのタグ付き文字の場合、オプションとしてcontentTypeをhtmlで指定すると、タグ付きのまま翻訳してくれます。デフォルトはtextですが省略可能。
  • RSSリーダースクリプトなどで、これを利用して自動翻訳してあげるなど、地味ながら使いみちは非常に広いです。

図:翻訳の精度に結構差がある

RSSデータを取得して翻訳させてみる

RSSリーダーなどを作る際に、XmlServiceを用いてparseしたデータに対して翻訳を実施し、それをRSSリーダーに表示するといった事が主な使い方になるかと思います。文字数も少ないので、通常使用であるならばLimitに達することはないでしょう。

//RSS1.0データを処理する
function rss10conv() {
  //teratailのフィード
  var feedURL = "https://9to5google.com/feed/";

  //翻訳する場合はtrue
  var transflg = true;

  //RSSデータを取得する
  var rssdata = []
  var response = UrlFetchApp.fetch(feedURL).getContentText();

  //XMLを取得する
  var xml = XmlService.parse(response);
  var items = xml.getRootElement().getChildren('channel')[0].getChildren('item');

  for (var i = 0; i < items.length; i++) {
    //一時配列を用意
    var temparray = [];
    
    //サイト名をpushする
    temparray.push("9to5google");
    
    //項目を取得
    var title = items[i].getChildText("title");
    var url = items[i].getChildText("link");
    
    //transflgがtrueの時、英訳する
    if(transflg == true){
      var title = LanguageApp.translate(title,"en","ja")
    }
    
    //タイトルとリンクをpushする
    temparray.push(title);
    temparray.push(url);
    
    //rssdataへpushする
    rssdata.push(temparray);

  }

  //値を返す
  return rssdata;
  
}

LanguageAppの制限

Google Cloud Translation APIは有償のサービスで、使用にはリミットがあります。

  • 1日あたりのモデル文字数
  • 100秒あたりのモデル文字数/1プロジェクト当たり
  • 100秒あたりのモデル文字数/1ユーザ・1プロジェクト当たり

毎日1度リミットがリセットされる仕組みのようですが、LanguageAppについては特に制限に関することがQuotasには記載がありません。しかし、どうやら表記はないもののTranslation API同様リミットがあるようで、

  1. 1日のtranslateの制限回数に達しました」といったエラーが出て、次の日まで使えないといった事が起きます。
  2. 連続してガンガンAPI叩くと、429エラーでストップすることがあるので、1回毎にUtilities.sleep(1000)を入れる必要がある。これはUrlfetchAppでも同様の事が起きます。
  3. 上記2.の制限により、スクリプトの連続稼働制限の6分のリミットに量によっては掛かる事があります(Basicの場合)。
  4. RSSリーダーなどで使う場合には、ロードするたびにLanguageApp呼び出すよりは、スプレッドシートに書き出したものを表示するように工夫する必要がありますね。

また、UrlfetchAppを利用して、Google翻訳に投げて取得するような荒業は以下の通り。ただしUrlfetchAppにはリミットがあるので、なんらかの非常時の一時的な利用向けですね。

//Google翻訳に投げて取得する
function googletrans(){
  //シートを取得する
  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("翻訳");
  
  //対象ワードを取得する
  var tempword = ss.getRange("A2").getValue();
  
  //対象言語と翻訳言語の指定
  var sourcelang = "auto";
  var targetlang = "ja";
  
  //Google翻訳に投げて取得する
  var url = "https://translate.googleapis.com/translate_a/single?client=gtx&sl="
            + sourcelang + "&tl=" + targetlang + "&dt=t&q=" + encodeURI(tempword);
  
  var result = JSON.parse(UrlFetchApp.fetch(url).getContentText());
  
  //翻訳ワードを取り出す
  var transword = result[0][0][0];
  
  //結果をUI.alertで返す
  SpreadsheetApp.getUi().alert(transword);

}

関連リンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)