見出し画像

【GAS】自動受付&仕分け&台帳作成システム(5)~投稿作品を保管するフォルダとフォルダへのリンクを自動作成する(その2)~

いつ来るか分からない、誰が送ってくるか分からないものについて、投稿先を掲示して何らかの提出物を受け付けるシステムのご紹介です。

システムとしては少し複雑で、

Googleフォームで投稿フォームを作成し、
 →投稿フォームから申し込み
 →受け付け番号を自動生成し、申し込み者に返信

投稿者は受信したメールに添付して投稿物を応募します。
(Googleフォームに添付ファイル機能があれば済む話なのですが)

さて、待っている間に、投稿物を保存するための準備をします。
 →Googleドライブ上に受け付け番号毎のフォルダを作成

ここまでをご紹介しました。その時の記事は以下になります。

今回の記事は、上記の続きで、受け付け台帳となっているスプレッドシートに、作成した投稿物保存用のフォルダへのリンクを追加するところの説明です。

この記事は主にGASの「スクリプト」について説明しています

新規作成したフォルダ(前回できたところまで)


先回までで、受け付け台帳であるGoogleスプレッドシートにある受け付け番号(記事では”C00005”など:Cはコンテンツの意味で使っています)に応じて、以下の様な、受け付け番号を名称としたサブフォルダを自動作成しました。

受け付け番号が名称になったサブフォルダ

・・・さて、ここまで出来たら、このフォルダに簡単にアクセスできる様に、ここへのリンクを受け付け台帳に反映させてみましょう。


受け付け台帳に、出来たサブフォルダのリンクを追加する

では、出来たサブフォルダのURLを取得して、スプレッドシートに書き込みましょう。

ところが、Googleドライブ上のフォルダに与えられるURLは、出鱈目な番号に基づいているので、これを特定するためには結局フォルダにアクセスして調べるしかありません。(名称などからは推定できません)

そこで以下の様なアプローチを取ります。

・ルート下の全サブフォルダを1つずつ選択する
・受け付け番号と一致する名称のサブフォルダを特定する
・特定したフォルダのURLを取得する
・取得結果をGoogleスプレッドシートに記載

全サブフォルダを順次選択する

全サブフォルダの順次選択は以下の様におこないます。

①まず、特定の親フォルダ下の子フォルダ群を、
 子フォルダ群 = 親フォルダ.getFolders( ) 
で取得します。

          // ルートフォルダ内のフォルダを一括取得(Foldersオブジェクト)
          const 「子フォルダ群」 =「親フォルダ」.getFolders();

②次に、子フォルダ群に含まれるメンバー1つずつをループ処理によって調査します。1つづつ当たるには以下の関数を利用します。

「子フォルダ群」に含まれるメンバーを調べる関数
   
「子フォルダ群」.next( ) 「次の」子メンバーを取得
   
「子フォルダ群」.hasNext( ) 「次の」子メンバーの有無を調査

上記の関数を用いてすべての子メンバーを順に選択できますす。

フォルダの名称を確認し、目的のフォルダのURLを取得する


③サブフォルダを順次選択する都度、その名前とURLを以下の関数により取得します。

フォルダの情報を取得する関数
  フォルダ.getName( ) フォルダの名前を取得
  フォルダ.getURL( ) フォルダのリンク先を取得


③最後に、名称が受け付け番号と合致したフォルダについて得られたURLを、スプレッドシートのURLを台帳となってるスプレッドシートに転記します。

ここまでのコード


ここまでをコードにすると以下となります。

              while (「子フォルダ群」.hasNext()) {
            
                const フォルダ = 「子フォルダ群」.next();
                const フォルダ名 = フォルダ.getName();
                const フォルダURL = フォルダ.getUrl();
    
                if(フォルダ名==受け付け番号){
                    //該当行の受付番号と一致する名前があれば、そのフォルダのリンクを記入
                   スプレッドシート.getRange(当該行,当該列).setValue(フォルダURL);
                }
              } 


正しく転記されると以下の様に、自然とリンクが張られて、台帳からアクセスできる様になります。

後の処理


URLを記載したら、今後の二重処理を避けるために「作成済」のフラグを自動記入しておきます。(コードの説明は省略します)

今後、投稿作品が増えて、受け付け台帳の行が追加され、再びサブフォルダ作成を実行する場合、もう対応した行は処理を省くための目印とするのに利用します。

以上までで、特定の受け付け番号専用のサブフォルダを作成し、そのRULをスプレッドシートに反映させるまでが自動化されました!

フォルダー作成スクリプトの実行 

最後に、以上のスクリプトを実行させるため、「トリガー」へ登録して自動実行される様にしましょう。

それには、まず、スクリプトエディタの左上にある「時計マーク」をクリックします。


すると、トリガーの設定画面になります。


ここで、上図の右下に見える「トリガーを追加」ボタンをクリックして、最上段に関数名(ここではmkSFolder)を入れます。

トリガーのタイミング

ここで、どういうタイミングでこのサブフォルダ作成を行うか一考します。

本当は、フォームから作品のエントリーがあって、スプレッドシートに行が追加されたら、そのたびに行うのがベストです。

ところが、スプレッドシートやGoogleドライブの処理を行う際にタイムラグが生じるためか、フォームを受け付けたタイミングですべてを行おうとすると、処理が済んだ事になっているはずの前提で行われる処理が、実際は行われていない状態で進められる事がありました。

そこで、今回は、Googleフォームの投稿とは切り離し、定期的にスプレッドシートを調査して、サブフォルダの作成済みかどうかを調べて、これらの処理を行うことにしました。

この場合、実行タイプには今回は「時間手動型」を選択します。後はデフォルトでかまいません。

最後に実行間隔を選びます。ここでは1時間としました。


繰り返しになりますが、このサブフォルダ作成モジュールのトリガについては、

・「フォームの受け付け」のタイミング
・「スプレッドシート編集」のタイミング

以上などにした方が良い様に思えますが、実行タイミングによっては、スプレッドシートの台帳の更新がされない内にフォルダを作ってしまうなどの不具合があった為、時間設定型にしています。(タイムラグがある代わり、誤りは基本的にありません)

トリガーは頻度はあまり高すぎると、Googleのサービスで決められたスクリプトの実行時間枠をオーバーしてしまうので、ほどほどの頻度にしておきましょう。

以上で、投稿物保存用のサブフォルダの作成、台帳へのリンク張りまでが終わりました。

次は、Gメールが返信されたら、添付ファイルを抽出して所定のサブフォルダに保存するまでをご説明する予定です。



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