みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
Google Apps Scriptでチャットワーク上に翻訳チャットを作成しています。
ベースのスクリプトはこちらの記事でできていまして
仕込んだチャット「翻訳さん」上で、 ISO639-1で登録されている言語コード(アルファベット2文字)を指定しつつ
と送信すれば翻訳結果が返ってくるという仕組みです。
しかし、上記のルールにのっとっていないコマンドを送ってしまったときは、Google Apps Script側でエラーが起きて何にも返事が返って来ないケースがありました。
今回はそれを解消すべく、Google Apps Scriptで作った翻訳チャットのスクリプトにエラー処理を搭載していきます。
これまでのおさらい
翻訳チャットのスクリプトのおさらい
まず翻訳チャットのベースとなるスクリプト、以前作成したものはこちらです。
function translateChat() { var token = 'APIトークン'; //チャットワークAPIトークン var room_id = XXXXXX; //翻訳さんのルームID var json = fetchMessage(token,room_id); //翻訳さんグループチャットのメッセージを取得 /* 各メッセージについて 繰り返す */ for each(var obj in json){ var arr = obj.body.split(';'); //セミコロンでsplitして配列に格納 var result = LanguageApp.translate(arr[1], "", arr[0]); //翻訳 var body = "[rp aid=" + obj.account.account_id + " to=" + room_id + "-" + obj.message_id + "] " + obj.account.name + "さん[info]翻訳結果:" + result + "[/info]"; //チャットワークに送るテキスト sendMessage(token,room_id,body); //チャットワークにメッセージを送る } }
流れとしては
- fetchMessageでチャットワークから未取得メッセージを取得
- 取得したメッセージ全てについて
- セミコロンでsplitして言語コードと本文に分割
- LanguageApp.translateメソッドで翻訳
- チャットワークに返すテキストを生成
- sendMessageでチャットワークに送る
という流れになります。
fetchMessage,sendMessageに関してはチャットワークAPIを使ってメッセージの送受信をする独自の関数ですので、以下の記事をご覧くださいね。
エラーが発生したときの分岐処理のおさらい
チャットワークから受け取ったメッセージがルール以外のものだった場合、LanguageApp.translateメソッドがエラーを起こしてしまいます。
その場合のエラーをキャッチするサンプルスクリプトがコチラです。
function translateTest(){ var strTest = "翻訳をして下さい"; //テスト用文字列 var arr = strTest.split(';'); //セミコロンでsplitして配列に格納 try{ var result = LanguageApp.translate(arr[1], "", arr[0]); //翻訳 }catch(e){ result = "エラーの内容:" + e; } Logger.log(result); }
try~catch文により、LanguageApp.translateがエラー検証の対象になっていて、エラーがない場合はそのまま翻訳結果をログ出力、エラーだった場合はエラーの内容をログ出力する仕組みです。
詳細はこちらの記事をどうぞ。
エラー処理を追加した翻訳チャットのスクリプト
上記二つのスクリプトを組み合わせて、翻訳チャットにエラー処理を追加したスクリプトがこちらです。
function translateChat() { var token = 'APIトークン'; //チャットワークAPIトークン var room_id = XXXXXX; //通訳さんのルームID var json = fetchMessage(token,room_id); //通訳さんグループチャットのメッセージを取得 /* 各メッセージについて 繰り返す */ for each(var obj in json){ /* 返信に対しては翻訳をしないように正規表現で[rp aid=で始まるメッセージを除外 */ if(!obj.body.match(/^[rp aid=/)){ var body = "[rp aid=" + obj.account.account_id + " to=" + room_id + "-" + obj.message_id + "] " + obj.account.name + "さん"; var arr = obj.body.split(';'); //セミコロンでsplitして配列に格納 /* translateメソッドでエラーを検証、結果により生成するメッセージを分岐 */ try{ var result = LanguageApp.translate(arr[1], "", arr[0]); //翻訳 body = body + "[info]翻訳結果:" + result + "[/info]"; //チャットワークに送るテキスト }catch(e){ body = body + "[info][title]翻訳できませんでした[/title]通訳さんのルール:n" + "翻訳後の言語コード;本文n" + "https://ja.wikipedia.org/wiki/ISO_639-1%E3%82%B3%E3%83%BC%E3%83%89%E4%B8%80%E8%A6%A7[/info]"; //チャットワークに送るテキスト } sendMessage(token,room_id,body); } } }
以下解説をしていきますね。
translateメソッドのエラー検証結果による分岐
20~30行目ですが、try~catch文を使ってLanguageApp.translateメソッドでのエラーを検証しています。
エラーが発生しなかった場合は規定通りの翻訳結果により返すテキストを生成します。
エラーが発生しなかった場合は「翻訳できませんでした」というメッセージとともに、そのルールと言語コードの参考URLを生成します。
返信に対して翻訳処理をしない
12行目のif文が新たに追加されたのに気付きましたでしょうか?
JavaScriptでは
//処理
}
とエクスクラメーションマークを付けた場合は、条件の結果を反転させます。ですから条件が満たなかった場合に処理を行うということになります。
matchですが、正規表現というパターンマッチングをする際に用いる表記法を用いて、「取得したメッセージ本文が”[rp aid=”で始まるものでないか」ということを判定しています。
チャットワークのメッセージが「返信」である場合に該当をします。
なぜ「返信」を除外しているのでしょうか?
「返信」を除外しないと、通訳さん自身がチャットワークに「返信」にて送ったメッセージを拾ってきてしまいます。
それを読み取ると、当然翻訳ルールにのっとっていませんので、「翻訳できませんでした」と「返信」をします。
さらにまたその返信を通訳さんが拾ってきてしまい…
というエンドレスなループができてしまいます。
それを避けるために、返信を除外したというわけです。
ちなみに、正規表現を使ったマッチングについては
を使用していますが、今回は正規表現についての詳細については割愛をしますので、詳しく知りたい場合は以下記事を参照ください。
参考:正規表現(RegExp)
実行結果
では実行してみましょう。
とメッセージを送った場合は
と送った場合は
となります。ちゃんとリンクをクリックするとWikipediaの言語コードのページに遷移します。
まとめ
Google Apps Scriptで作成したチャットワーク上の翻訳チャットにエラー処理を追加しました。
具体的にはtry~catchによるエラーによる分岐処理と、正規表現を用いたエンドレスループの回避を行いました。
このところチャットをインターフェースとしたシステムが注目を集めていますね。しかしながら、人が入力する内容ですから、色々なパターンが出てきてしまうものです。
想定していない例外の処理が発生したときも、面白おかしい返事が返せると、楽しくお仕事ができるようになるかもしれませんね。
翻訳チャットについては今回でシリーズ終了となりますが、また便利なツールについてアイデアありましたら紹介したいと思います。
どうぞお楽しみに!