![見出し画像](https://assets.st-note.com/production/uploads/images/97644773/rectangle_large_type_2_b8f3ae50bdb1e6dec739af97e2250999.png?width=800)
#80 画像ファイルをメールで送信すると、翻訳して返信
先日の #78 に対する
フォームをトリガーではなく、メールで送られた写真を、OCRして返信になれば、
送信すればOCRして返ってくる簡易アプリができますかね?
・手書きで書いた英語をOCRして翻訳してくれる謎装置ができるかも…
というコメントが面白そうだったので、プログラムにしてみました。
今回のプログラムは、記事タイトルにもあるように、メールに画像ファイルを添付して送信すると、画像ファイル中にあるテキスト情報を抽出し、それを日本語に翻訳したものをメールで返送するものです。
「Google Lens があれば要らないんじゃないの?」とは言わないようにお願いします。
プログラムの使い方
作成したプログラムを埋め込んだ Google スプレッドシートは、以下の URL にアクセスすることで、自身の Google ドライブにコピーを作成できます。
https://docs.google.com/spreadsheets/d/1KPKFRryzZuRcucT0aAvLG53Wkb5UJRGrDzqNvqbfAwk/copy
今回のプログラGoogle スプレッドシートに対して、何か処理するものではありませんが、
GAS のプログラムだけを配布しにくい。
Google スプレッドシートであれば、上記のように /copy のリンクによって、簡単にコピーを作成できるが、GAS 単体のファイルでは /copy が利用できない。GAS のプログラムをコピペ(コピー & 貼り付け)してもらった場合、サービスの追加やトリガーの設定、などを手作業で行ってもらわなければならない。Google スプレッドシートであれば、追加のメニューを設定でき、トリガー設定を行える。
といった理由から、Google スプレッドシートに GAS のプログラムを埋め込んであります。
自身の Google ドライブにコピーされた Google スプレッドシートには、一見すると何も保存されていないように見えます。メニューに追加されている「トリガー関数」→「トリガー関数を設定する」を選択してください。
![](https://assets.st-note.com/img/1675955773195-mCJLxOsQcx.png?width=800)
トリガー関数を設定しようとすると、実行するアカウントによる確認作業が必要になります。詳しくは以下の投稿をご覧ください。
確認作業が終了したら、トリガー関数を設定したら、もう一度、「トリガー関数」→「トリガー関数を設定する」を選択してください。これで、トリガー関数が設定されました。
1回目の「トリガー関数を設定する」では、権限の確認が行われただけで、トリガー関数が設定されていません。
2回目の「トリガー関数を設定する」でトリガー関数が設定されます。
更に「トリガー関数を設定する」を実行しても、重複してトリガー関数が設定されることはありません。
トリガー関数は 5分間隔で実行されるように設定されているので、メールを送信しても最大で 5分間程度は応答が届かない可能性があります。
翻訳対象のメールを送信する
(1)サンプルデータ
外務省のプレスリリースを、スクリーンショットしたものをサンプルデータとして使用しました。 ※外務省のサイトに特別な意図はありません。公的なサイトなので、スクリーンショットを利用しても問題が生じないだろうと考えたからです。
![](https://assets.st-note.com/img/1675956319470-M4aUcT0KAC.png?width=800)
この画像をメールに添付して、トリガー関数を設定した Google アカウントのメールアドレスに対して送信します。
(2)メールの送信
メールを送信するときには、以下の点に留意してください。
件名には「OCR Request」と設定します。
メール本文は、翻訳処理の対象にはなりません。また、プログラムの動作や翻訳に対する指示は、プログラム中で定義しています。メール本文はプログラム中でも参照していないため、何も記載しなくて構いません。
翻訳処理の対象になるのは、添付されている画像ファイルだけで、画像ファイル以外のファイルが添付されていても、処理対象にはなりません。
※画像ファイルであるかは、mimetype が「image/jpeg」などと image で始まっているかで判定しています。1つのメールに複数の画像ファイルを添付しても構いません。
(3)翻訳メールの返信
送信したメールに対して翻訳処理が行われると、下図のようなメールが返送されます。
![](https://assets.st-note.com/img/1675981041042-qyoJcMi4ez.png?width=800)
![](https://assets.st-note.com/img/1675957324004-lkGx7ziVIR.png?width=800)
上図のように、添付されていた画像ファイルから取得したテキスト情報(「返送メール ①」の部分)と、そのテキスト情報を日本語に翻訳したテキスト(「返送メール ②」の部分)がメールで送信されます。
翻訳そりについては、以下のブログ記事を参考にさせていただき、Class LanguageApp を用いて行っています。
ちなみに、英語以外の翻訳にも対応しており、下図のようなスペイン語で表記されたページのスクリーンショットを送信すると、
![](https://assets.st-note.com/img/1675959474918-mD2oKye8NN.png?width=800)
以下のように、日本語に翻訳してくれます。
![](https://assets.st-note.com/img/1675981059104-3VvPtl3xfz.png?width=800)
(4)処理済のメール
翻訳処理を行ったメールは、スター(★)を付けています。スターが付いているものは、翻訳処理の対象になりません。処理済のメールが不要であれば、適宜削除してください。
この辺りのプログラムの流れは、以下のブログ記事を参考にさせていただきました。LINE に通知するのではなく、その部分に翻訳処理を行うように変更しています。
(5)チェックする間隔
GAS のプログラムでは、Gmail がメールを受信したことをトリガーに処理することができません。そのため、指定した間隔でトリガー関数を実行して、新たに受信したメールがないかをチェックし、対象となるメールがあれば処理するようにしています。
指定した間隔でのトリガー関数の実行は、プログラム中では以下 URL で説明されている everyMinutes(n) によって行っています。
設定できる値は、1、5、10、15、30、に限られるため、今回のプログラムでは 5分間隔でチェックするようにしています。
Specifies to run the trigger every n minutes. n must be 1, 5, 10, 15 or 30.
1分間隔で実行してもレスポンスがいいのかもしれませんが、一日に実行できるトリガー関数の時間制限が設定されているので、やみくもに実行するのもトラブルの原因になる気がします。
その辺りも考慮して、5分という値を設定しています。
![](https://assets.st-note.com/img/1675984241907-gAXZKjYKCI.png?width=800)
実際のプログラム
作成したプログラムは、以下のような感じです。
プログラムの動作については、冒頭の定数で設定します。
![](https://assets.st-note.com/img/1675957643440-ANN5GpFvi0.png?width=800)
SUBJECT_TITLE
→ 処理対象となるメールの件名RESPONSE_TITLE
→ 返信メールの件名RETURN_MAIL
→ 返信先のメールアドレス
空欄であれば、送信元に返信
指定されていればそのアドレスに返信DELETE_IMAGE
→ 処理後に画像ファイルを削除する ※true なら削除DELETE_DOCS
→ 処理後に Google ドキュメントを削除する ※true なら削除TRANSLATE_LANG
→ 翻訳対象となる言語 'ja' : 日本語BCC2ME
→自身に BCC で送信するか? ※true なら BCC: で送信
これらの定数を変更することで、多くにニーズに応えられるのではないか、と思います。
この定数によって動作をカスタマイズできるようにしたことで、プログラムに余計な判断が追加されている部分があるかと思います。コメントなどを記載しておいたので、どのような処理を行っているのかは、理解してもらえるのではないかと思います。
最後に
今回のプログラムは、#78 を焼き直した感じとなっています。前述したように Google Lens が利用できているのであれば、即時性の面からも使う必要のないものかもしれません。
とは言え、アイディア次第で応用すれば GAS のプログラムによっていろんなことが自動化できそうな感じがしませんか?👍
最後に、お決まりのフレーズなどを書いておきます。
一応の動作確認は行っているものの、不慮のトラブルによって損害等が生じても、責任はとれませんので予めご了承ください。
コメントを含めても 180行あまりのスクリプトであり、実行に際して目的外の場所への書き出しや収集などは行っていません。
特別なエラー処理は行っていないので、意図しないケースでエラーが発生してしまうかもしれません。どうにもならない場合には、ご連絡ください。
わたし自身にしてみると、このような「スクリプトを作ること」が目的になっているような感じですが、このスクリプトが何かの役に立てば幸いです。
「スキ ♡」を押してもらえると、このようなプログラム作成の励みになります。😍
この記事が気に入ったらサポートをしてみませんか?