【GAS】チャットワークで作る翻訳チャットに例外コマンドでエラーが出たときの処理を追加

exception

photo credit: Solo via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

Google Apps Scriptでチャットワーク上に翻訳チャットを作成しています。

ベースのスクリプトはこちらの記事でできていまして

Google Apps Scriptでチャットワーク上に翻訳チャットを作る
Google Apps ScriptとチャットワークAPIを使って翻訳チャットを作る方法です。Google翻訳の機能をGASで扱うtranslateメソッドを使って、まずは最低限のシステムを目指します。

仕込んだチャット「翻訳さん」上で、 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); //チャットワークにメッセージを送る
    }
}

流れとしては

  1. fetchMessageでチャットワークから未取得メッセージを取得
  2. 取得したメッセージ全てについて
    1. セミコロンでsplitして言語コードと本文に分割
    2. LanguageApp.translateメソッドで翻訳
    3. チャットワークに返すテキストを生成
    4. sendMessageでチャットワークに送る

という流れになります。

fetchMessage,sendMessageに関してはチャットワークAPIを使ってメッセージの送受信をする独自の関数ですので、以下の記事をご覧くださいね。

【GAS】チャットワークのメッセージを取り出す関数とメッセージを送る関数
Google Apps Scriptを活用してチャットワークにおみくじチャットを作成しています。今回はチャットワークからメッセージを取り出す、メッセージを送る処理を関数化して全体のコードをスッキリさせます。

エラーが発生したときの分岐処理のおさらい

チャットワークから受け取ったメッセージがルール以外のものだった場合、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がエラー検証の対象になっていて、エラーがない場合はそのまま翻訳結果をログ出力、エラーだった場合はエラーの内容をログ出力する仕組みです。

詳細はこちらの記事をどうぞ。

Google Apps Scriptでエラーが発生したときに処理を分ける方法
Google Apps Scriptでtry~catch文でエラー処理をしていきます。チャットワークの翻訳チャットを例にエラーが発生したかどうかを判定して、エラーによって処理を分ける方法をお伝えします。

エラー処理を追加した翻訳チャットのスクリプト

上記二つのスクリプトを組み合わせて、翻訳チャットにエラー処理を追加したスクリプトがこちらです。

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では

if(!条件){
//処理
}

エクスクラメーションマークを付けた場合は、条件の結果を反転させます。ですから条件が満たなかった場合に処理を行うということになります。

matchですが、正規表現というパターンマッチングをする際に用いる表記法を用いて、「取得したメッセージ本文が”[rp aid=”で始まるものでないか」ということを判定しています。

チャットワークのメッセージが「返信」である場合に該当をします。

なぜ「返信」を除外しているのでしょうか?

「返信」を除外しないと、通訳さん自身がチャットワークに「返信」にて送ったメッセージを拾ってきてしまいます。

それを読み取ると、当然翻訳ルールにのっとっていませんので、「翻訳できませんでした」と「返信」をします。

さらにまたその返信を通訳さんが拾ってきてしまい…

というエンドレスなループができてしまいます。

それを避けるために、返信を除外したというわけです。

ちなみに、正規表現を使ったマッチングについては

文字列.match(正規表現)

を使用していますが、今回は正規表現についての詳細については割愛をしますので、詳しく知りたい場合は以下記事を参照ください。

参考:正規表現(RegExp)

実行結果

では実行してみましょう。

en;翻訳をお願いします。

とメッセージを送った場合は

翻訳チャットで正しいメッセージを送った場合

zz;翻訳して下さい。

と送った場合は

翻訳チャットでエラーになるメッセージを送った場合

となります。ちゃんとリンクをクリックするとWikipediaの言語コードのページに遷移します。

まとめ

Google Apps Scriptで作成したチャットワーク上の翻訳チャットにエラー処理を追加しました。

具体的にはtry~catchによるエラーによる分岐処理と、正規表現を用いたエンドレスループの回避を行いました。

このところチャットをインターフェースとしたシステムが注目を集めていますね。しかしながら、人が入力する内容ですから、色々なパターンが出てきてしまうものです。

想定していない例外の処理が発生したときも、面白おかしい返事が返せると、楽しくお仕事ができるようになるかもしれませんね。

翻訳チャットについては今回でシリーズ終了となりますが、また便利なツールについてアイデアありましたら紹介したいと思います。

どうぞお楽しみに!

連載目次:GASとチャットワークAPIで翻訳チャットを作る

おみくじチャットの仕組みを利用して翻訳チャットを作ります。Google Apps ScirptでGoogle翻訳を操作する方法、チャットからの入力がルール外だった場合のエラー処理など少し発展的な内容を学ぶことができますよ。
  1. Google Apps Scriptでチャットワーク上に翻訳チャットを作る
  2. Google Apps Scriptでエラーが発生したときに処理を分ける方法
  3. 【GAS】チャットワークで作る翻訳チャットに例外コマンドでエラーが出たときの処理を追加
タイトルとURLをコピーしました