2013年12月31日

Google スプレッドシートを使って自動で翻訳する英単語帳を作成する

英単語の日本語訳を調べるときに色々な Webサービスを利用していますが、自分の検索履歴を残したりとパーソナライズできたらいいなと思い、Google Spreadsheet を使って自分好みのサービスを作ってみることにしました。

Google Apps Script の勉強を兼ねて。

まずは第一弾として、Google Spreadsheet に英単語を入れると自動的に日本語訳を隣のセルに入力する仕組みを作ってみました。はじめは外部の翻訳サイトの API を使うことを考えましたが、今日現在無料で使えて API を公開しているサービスがありませんでした。ところが、Google Apps Script の中で Google Translate が Languageサービスとして使えることがわかりましたので、そちらを利用します。
Google Spreadsheet には、Excel でいうところのマクロと同じような機能が提供されていて、それが Google Apps Script です。

Google Apps Script は JavaScript で記述しますが、一般的な JavaScript の使われ方と異なり、Google Apps Script はブラウザ上で実行されるのではなく、サーバーサイドで実行されます。そのため、一般的な JavaScript でできること以上に、いろいろな Google 上のデータに簡単にアクセスできます。

では早速作ってみましょう。

まずは Google Drive で新規にスプレッドシートを作成し、適当に名前をつけます。例えば英単語帳とでもしておきましょう。

新規作成したスプレッドシートには1つのシートができているので、そのシートを「単語帳」とリネームしておきます。あとでこのシート名をスクリプトの中で使用します。

シートの1行目に項目のタイトルとして、1列目は「英単語」、2列目は「和訳」としておきます。

シートの準備ができたので、次は Google Apps Script を作っていきます。

上部メニューから「ツール」- 「スクリプトエディタ」を開きます。ここで新規プロジェクトを作成します。プロジェクト名は「A-Tango」とでもしておきましょう。

それでは関数を作っていきます。

今回の機能としては、
1.ユーザが1列目に英単語を入力する
2.自動的に2列目に和訳を挿入する
という動きにします。

そこで、セルへの入力をトリガーに翻訳を開始する処理を作成するため、Google Apps Script で用意されている onEdit() を利用します。

function onEdit(event){
var ss = event.source.getActiveSheet();
// Do nothing if it is not "単語帳" sheet
Logger.log("event is called from sheet " + ss.getName());
if (ss.getName() != "単語帳"){
return;
}
var rng = event.source.getActiveRange();
// exit this function if it is not colum 1 and larger than row 2
var rw = rng.getRow();
var cl = rng.getColumn();
if ((rw == 1) || (cl != 1)){
return;
}

Logger.log("source string is " + rng.getValue());
writeTranslation(rw,2,ss,rng.getValue());

}


まず、onEdit() はスプレッドシート全体でのセルへの編集が行われた時に呼ばれるので、はじめに「シート」とセル範囲で処理を縛ります。「単語帳」というシート名の場合だけ処理を続け、また入力されたセルが1列目かつ2行目以上のときだけ処理するようにしています。

それをパスしたら、ようやく翻訳を行うカスタム関数 writeTranslation() を呼び出します。

function writeTranslation(rw,col,sht, enstring) {
// Check rw is a number
if(typeof rw != "number"){
throw "1st argument must be a number";
}
if(typeof col != "number")
throw "2nd argument must be a number";

Logger.log("Translate '" + enstring + "' to Row " + rw + " Column " + col);

var jpstring = LanguageApp.translate(enstring, 'en', 'ja');

var targetrng = sht.getRange(rw, col);
targetrng.setValue(jpstring);
}


この関数では、LanguageApp サービスの translate 関数を呼び出し、Google Translate を使い、引数で渡された英単語(英文も可)を翻訳させます。

翻訳結果の文字列を、引数で渡されたシートの、指定された行、列に setValue() を使って書き込みます。

これでひとまずは英単語を入力し Enter を押すと翻訳結果が第2列に書き込まれるという基本機能は完成です。

これで、都度どこかの Webサイトを開いて調べていく必要はなくなります。ただ、同じ単語をいつも調べてしまうとか、過去の翻訳履歴を利用できませんので、次はその辺りを改善してきたいと思います。
posted by daisuky at 09:58 | Comment(0) | Google Apps Script
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※半角英数字のみのコメントは投稿できません。
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。