見出し画像

【GAS】Gメール投稿するだけでWEBページの掲載画像を更新できる、かんたん日報表示システム(5)~Gメールから投稿画像を収集してGドライブに保存するまで~

グループ内のメンバーに日課を画像で掲示するだけの、かんたんな日報ページをGAS(Google Apps Script)で作り、「かんたん日報表示システム」と名付けてみました。


無料のGoogleアプリとGASで作ったシステムであり、全体の概要はこちらの記事で解説しています。

ーーーーー

GASのコードについて、最初にユーザがログインするコードをちらで解説しました。

ログインフォームから送信したパスワードを認証する仕組みはこちらで解説しています。

今回の記事では、ログインしたタイミングで並行して行われる、Gメールで投稿された掲載画像を収集する部分について、ご説明します。


Gメールを検索して投稿画像をGドライブに保存する


本システムでは(1日1回程度とします)、WEBページに掲載する画像を、Gメールで「日報画像送信」という件名で送信することで、管理者の手間を掛けないでWEBページが自動更新されるようにしています。


投稿は任意のタイミングでされますので、このシステムではユーザがアクセスしたタイミングで毎回Gメールをチェックし、未収集の画像メールがあれば添付ファイルをGドライブに保存する様にしています。

ユーザの人数が少なく、日に1度程度しかアクセスされないことを前提として、この様に、都度チェックする仕組みにしました。

この機能は、ログイン画面を表示する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ドライブ内に蓄積されたデータを日報ページに反映する部分については、次の記事でご説明します。


前の記事はこちら


この記事が気に入ったらサポートをしてみませんか?