【GAS】Gメール投稿するだけでWEBページの掲載画像を更新できる、かんたん日報表示システム(5)~Gメールから投稿画像を収集してGドライブに保存するまで~
グループ内のメンバーに日課を画像で掲示するだけの、かんたんな日報ページをGAS(Google Apps Script)で作り、「かんたん日報表示システム」と名付けてみました。
無料のGoogleアプリとGASで作ったシステムであり、全体の概要はこちらの記事で解説しています。
ーーーーー
GASのコードについて、最初にユーザがログインするコードをちらで解説しました。
ログインフォームから送信したパスワードを認証する仕組みはこちらで解説しています。
今回の記事では、ログインしたタイミングで並行して行われる、Gメールで投稿された掲載画像を収集する部分について、ご説明します。
Gメールを検索して投稿画像をGドライブに保存する
本システムでは(1日1回程度とします)、WEBページに掲載する画像を、Gメールで「日報画像送信」という件名で送信することで、管理者の手間を掛けないでWEBページが自動更新されるようにしています。
投稿は任意のタイミングでされますので、このシステムではユーザがアクセスしたタイミングで毎回Gメールをチェックし、未収集の画像メールがあれば添付ファイルをGドライブに保存する様にしています。
この機能は、ログイン画面を表示するGスクリプトの中で、fetchFile_List() というユーザ定義関数を記述しておこなっています。
function doGet(e){
//投稿画像をGメールのスレッドから検索しリストを更新
fetchFile_List()
}
関数のコードそのものは、GASのプロジェクト内に「作品の抽出と保存」というモジュールを追加してそちらで記述しています
function fetchFile_List() {
・・・ここにコードを記述・・・
}
関数の具体的なコードについて、以下順を追ってご説明します。
GメールをGASで操作して検索する
Google社の提供するGAS(Google Apps Script)は、同社のさまざまなクラウドアプリをコントロールできますが、メールアプリである「Gメール」も、もちろんGASで操作することができます。
Gメール関係の関数群は、GmailAppというオブジェクト内に用意されていますので、ここから利用します。(Gメールのアドレスは、GASを編集しているユーザのIDになります)
受信メールから「日報画像送信」という件名のメールを見つけて、添付されている投稿画像を保存するにた、search()という関数を以下の様に使います。
検索結果=GmailApp.search(検索条件、開始番目、取得件数)
検索条件は、メールの件名で検索するので、以下の様に記述します。
'subject:' + '日報画像送信'
(続く引数の「開始番目」「取得件数」は、検索結果の範囲を取り込む時に指定するもので、今回は30までの件数で打ち切って保存する様にしています)
ここまでのコードは以下のようになります。
function fetchFile_List() {
・・・中略・・・
//Gメールのスレッドの検索
//検索条件を設定する |表題に受付番号を含む
const 検索条件 = 'subject:' + '日報画像送信';
//メールを検索条件で検索する |念のため結果の最大値を30としておく
const 検索結果 = GmailApp.search(検索条件, 開始番目, 取得件数);
・・・中略・・・
}
(「検索結果」という変数は、説明のためのもので、実際のコードでは英数字にします。以下同様です)
メール検索の結果を配列データとして格納する
関数search( )で取得した検索結果は、大きな1つのデータになっており、そのままでは利用困難です。そこで以下の様にgetMessagesForThreads()関数を使って各メールに切り分けた配列データに変換します。
各メール = GmailApp.getMessagesForThreads(検索結果)
こうして、検索結果が配列データとして格納されます。メッセージ本体部分は配列の孫要素として格納されています。
検索結果 ⇒ 子要素:スレッド群 ⇒ 孫要素:各メッセージ
各メッセージには、ループを二重に回して配列の孫要素としてアクセスします。
for(const スレッド群 of 各メール){
for(const 各メッセージ of スレッド群){
各メッセージの操作
}
}
メールから添付ファイル群を取得する
各メッセージに対しては、「スターマーク」(一度確認したメールにはスターマークを付ける様にしています)が無ければ、ここから添付ファイル群を抽出しています。
スターマークのチェックは各メッセージの子関数である、isStarred()を使って、添付ファイル群の抽出は同じく子関数の、getAttachments()を使って、以下のようなコードで行います。
if(!各メッセージ.isStarred()){
const 添付ファイル群 = 各メッセージ.getAttachments();
}
この処理が済んだメッセージには、関数star()を使ってスターマークを付け、今後は処理を省いて、重複して添付ファイルを保存しない様にします。コードは以下となります。
各メッセージ.star();
こうすることで、一度チェックし終えたメッセージは、Gメールの受信リストのスターマークが以下から・・・
・・・以下の様に変化します。
個々の添付ファイルをGドライブのフォルダ内に保存する
取得した添付ファイルは、Gドライブの所定のフォルダに保存します。
そこで、Gドライブ内に、保存用のフォルダを作り、これにアクセスする変数を定義しておきます。
const 保存フォルダ = DriveApp.getFolderById('★フォルダID★');
添付ファイル群を個々のファイルに切り分けて保存するには、Gドライブに関する関数creatFile()を使って、以下のようなループ文で記述します。
for(const 添付ファイル of 添付ファイル群){
保存フォルダ.createFile(添付ファイル);
}
ここまでの内容をまとめたものが以下のコードです。
・・・(前略)・・・
//保存フォルダを取得する|Googleドライブの★フォルダID★は各自のものを記入
const 保存フォルダ = DriveApp.getFolderById('★フォルダID★');
・・・(中略)・・・
//検索結果からメールを抽出する
const 各メール = GmailApp.getMessagesForThreads(検索結果);
//スターが無いスレッドからファイルを抽出しフォルダに保存する
//検索結果(2次元配列)からメッセージを抽出する
for(const スレッド群 of 各メール){
for(const 各メッセージ of スレッド群){
//スターがないメッセージのみ処理
if(!各メッセージ.isStarred()){
//メッセージ本体から添付ファイルを抽出する
const 添付ファイル群 = 各メッセージ.getAttachments();
//処理済みのメッセージにスターをつける
各メッセージ.star();
for(const 添付ファイル of 添付ファイル群){
保存フォルダ.createFile(添付ファイル);
}
}
}
}
・・・(後略)・・・
Gメールに関する関数、Gドライブに関する関数を使うことで、とても短いコードで一連の処理を実装できます。
一連の処理が終わると、Gドライブの所定のフォルダ内に、以下の様に画像データが蓄積されます。
Gドライブ内に蓄積されたデータを日報ページに反映する部分については、次の記事でご説明します。
←前の記事はこちら
次の記事はこちら⇒