Excelでセルの日本語を関数をつかって英語に翻訳する

最近Excelに追加されたWEBSERVICE関数を使い、外部翻訳サービスのAPIを使って翻訳できないか試してみたところうまくいきましたので、紹介します。最近はファイルごとアップロードすると翻訳してくれるサービスがあったり、Excelにも標準で翻訳ツールはあるものの、複数のセルに入力されている英語を一発で隣のセルに日本語として表示したいような用途には向きません。そこでAPIの出番です。
さらにVBAを使用してオリジナルのDeepL関数化については、別途こちらの投稿をご覧ください。
注意事項
会社によっては、自社で作成した文章を外部サービスにアップロードして翻訳する等の行為を、情報流出防止の観点から制限している場合があります。社内で申請が必要だったり、話していたのに後でとがめられたりしては残念なので、あらかじめ偉い人の言質を取りましょう!(Excelという内部文書満載のプラットフォームで、使い方によっては情報駄々洩れになるWEBSERVICE関数が追加されていても、リスク評価やガイドライン作りを済ませているところって多くないのでは?あとで叱られないようにしましょう。)
WEBSERVICE関数とは
イントラまたは外部のウェブサービスのURLを引数として渡してやるだけで、なんと結果を表示してくれるという驚きの関数です。ためしに、 =WEBSERVICE(“https://google.co.jp") とA1セルに入力してやると、グーグルWEBサイトのソース(HTML)がそのまま表示されました。

ということは、引数に別のセルの値を参照すれば、次々にWEBサービスからの返信を表示してくれるというわけです。

そこで、この仕組みをつかって、こんな感じに英語を日本語に次々と変換してやりたいというのが、今回のテーマです。

APIとは?
API「Application Programming Interface」という仕組みがあります。プログラムどうしが、一定の決まりに従ってやり取りをするもので、ウェブサービスのなかにはWEBで利用できるサービスのほかに、その裏側で動いている仕組みをAPIとして公開し、使わせてくれるものがあります。
多くは事前の登録が必要ですが、無料で使えるものも多く、登録してシークレットと呼ばれるパスワードを取得して http://~ というおなじみのURLの中に要求と一緒に埋め込むことで、返事を返してくれます。
ということは、WEBSERVICE関数で、翻訳してほしい英語の文章を、そんなURLをAPIに埋め込んで渡してやると、日本語が返ってくるはず。
DeepL翻訳
あまりに自然な翻訳ができると一時期話題になったDeepLは利用している人も多いのでは?よく見るとAPIを公開しており、ビジネス向けの有償プランはもちろんですが、無料でつかえるプランが用意されています。
アカウント登録する

無料版では1か月に50万文字という制限がありますが、ちょっとした用途なら十分では?

早速登録してみます。基本的な情報と「クレジットカード」の登録が必要です。Pro版へ主導でアップグレードしない限りはクレジットカードへの課金は発生しません。

認証キーを確認する
ユーザー登録ができたら、アカウント情報のタブのなかに、APIのキーが表示されているはずです。ここに表示されている長い文字列が、APIを利用する際のパスワードのようなものになります。


翻訳したい文章と必要な情報をつないでURLにする
https://api-free.deepl.com/v2/translate?auth_key=ここにAPI認証キーを入力する&target_lang=JA&text=Hello
上記のURLをメモ帳にコピーして、「ここにAPI認証キーを入力する」の部分を、先ほど取得した自分のAPI認証キーに差し替えてください。
よく見ると、認証キーの前には「auth_key=」、翻訳したいのは日本語(JA)なので、「target_lang=JA」、翻訳したい英文が「text=Hello」のように記載されているのがわかります。それぞれの項目が「&」でつながっているだけです。
メモ帳で用意ができたら、それをブラウザのURL欄に貼り付けてエンターを押してみましょう。以下のような表示が出れば成功です。出なかった場合は、API認証キーが間違っていないか、前後に余分なスペースが入っていないかなどチェックしてみてください。

返信の中に「こんにちは」と記載されています。これは「text=Hello」というように指定した英語が日本語に翻訳されていることを表しています。とっても簡単ですね。
ExcelでできたURLを使う
いよいよExcelでWEBSERVICE関数にURLを与えてやりましょう。さきほどメモ帳で用意したURLをB1セルにWEBSERVICE関数に組み込んでやると、ブラウザと同じ結果がB2セルに表示されました。URLの前後には""で囲ってください。
=WEBSERVICE(“https://api-free.deepl.com/v2/translate?auth_key=ここにAPI認証キーを入力する&target_lang=JA&text=Hello")

hello部分を別セルから参照するように改造
このままだと、「hello」しか表示してくれないので、最後の英文の部分を他セル参照するように改造します。hello前の=のあとに「"」で区切り、「&A1」のようにすることで、A1に入力された英文を参照するようになります。
=WEBSERVICE(“https://api-free.deepl.com/v2/translate?auth_key=ここにAPI認証キーを入力する&target_lang=JA&text=" &A1)
長文も翻訳するにはエンコードが必要
ここまで出来たら長文にも挑戦したくなりますね?英語版のWikipediaから、エリザベス女王に関する記事の冒頭をA1セルに入力してみました。おや?エラーになりました。

文章には間にスペースが入っていたりするので、そのままではURLの一部として関数に渡してやることができません。そこで、A1の部分をENCODEURL関数で囲ってやります。
=WEBSERVICE(“https://api-free.deepl.com/v2/translate?auth_key=ここにAPI認証キーを入力する&target_lang=JA&text=" &ENCODEURL(A1))
今度はしっかり日本語に翻訳してくれました。文章として全く問題なさそうです。


必要な部分以外を取り除く
あとは日本語の翻訳テキスト部分以外を取り除いてやればよいだけです。ここはExcelでいろいろな方法があると思いますが、C1セルにB2から余分な部分を取り除くよう以下のような関数を入れてみました。もっと良い方法があるかもしれませんのでいろいろ試してください。
=LEFT(REPLACE(B1,1,58,""),LEN(REPLACE(B1,1,58,""))-4)

気になるAPI要求回数は?
上記のような方法で文字列をAPIに渡して日本語を得ることができるようになりましたが、すでに翻訳済みの文章まで毎回Excelファイルを開くたびにAPI要求をだしていないか心配です。無料のDeepLのAPIにも要求する文字数に制限がありますし、エコではないからです。
ちょうど気になる部分を検証していらっしゃる方がいました。
https://www.excelspeedup.com/webservice/ (経理・会計事務所向けExcelスピードアップ講座)
複数のセルに入力した異なるURLの要求は、その後保存、再読み込みしても再要求されていないようです。ただし、行の挿入を行うと要求済みの部分も再要求される模様。同時には10リクエストが上限のようですが、リクエスト数合計で料金が加算されるようなサービスの場合はちょっと気を付けないといけませんね。
おしまいに
というわけで、Excelのセルの文字を自動で日本語に翻訳が実現できました。もちろんtarget_lang=JA を変更すれば日本語ではなく他言語へ変えることもできますし応用は無限大です。
次回はPower Automateと結び付けて自動的に英語の元ネタを取得してくるような処理を組み合わせてみたいと思います。
ディスカッション
コメント一覧
まだ、コメントがありません