この記事は、Google Apps Script Advent Calendar 2015、17日目の記事です。
こんにちは。コスゲと申します。
僕は現在、複数のIT系学校においてお仕事をさせていただいています。かつては学校の運営業務も行っていました。
学校の仕事をしていると、受講生さんが課題や宿題の提出等のためにデータをメールやその他何らかの形で送付する場面がよくあります。そして、そのデータを受け取った側にとっては、整理や管理が非常に大変です。
バージョン管理ツール等をうまく駆使すれば解決することももちろんあるのですが、取り扱う内容や学校の種類あるいは環境によっては、「メールなどに添付して課題や宿題を送付する」方法を取られるところも多いかと思います。
そんな時、メールの添付ファイルをいちいちダウンロード→指定フォルダに移動、なんてしていたら、提出人数が少ないならばまだしも、人数が多くなってくると、データの管理が非常に面倒で仕方がなくなりますよね。,/p>
ということで、Google Apps Scriptで何かできないかなと思い、Gmailの添付ファイルをGoogleDrive内の指定フォルダへ自動保存する仕組みを作ってみました。
目次
Google Apps ScriptでGmailの添付ファイルをGoogleDriveへ自動保存する仕組みについて
Google Apps Scriptには「トリガー」という仕組みがあります。「指定の時間になったらプログラムを実行する」といったように、特定の時間になったらGoogle Apps Scriptで定義したプログラムが実行されるような、いわば予約投稿のような仕組みを実現することができるのがトリガー
また、トリガーの設定内容としては、「Googleフォームからデータが送られた時」「Googleスプレッドシートが起動したらプログラムが実行される」「スプレッドシートのデータが編集された時」など、何かユーザーがアクションをしたタイミングでGoogel Apps Scriptを動かす、ということも可能です。
しかし!残念ながら、現時点(2016年7月)では、「Gmailに対して受信があったらGoogle Apps Scriptのプログラムが動く」というトリガーは用意されていません。
そこで代わりに、「1分ごとにGmailの受信箱を調べて、指定条件にあてはまったメールがあったら、その添付ファイルを自動的にGoogle Driveの指定フォルダに保存するプログラムを実行させる」という状況になったら、トリガーが発動するようにGoogle Apps Scriptをくみました。
Google Apps Scriptで実装するにあたり気をつけたことについて
1、Gmailの添付ファイルをGoogle Driveフォルダに自動保存をするしないの条件判別について
GoogleDriveに自動保存そをするための条件判別については何でも良かったのですが、とりあえず今回はわかりやすいように、『メールタイトルが「課題提出」となっているものがあったら、受信されたGmailの添付ファイルをGoogle Driveの指定フォルダに自動保存する』ことにしました。この辺はなんとでも変更できると思いますし、うまいことやれば、条件によって、保存するフォルダを複数に振り分けるなんてことも出来るかと思います。
2、抽出するGmailの数
「1分ごとにGmailの受信箱を調べる」というトリガーの設定にしたので(まあ1分ごとじゃなくてもいいかもですが…)、1分ごとに膨大な量のGmailを精査していたら、とてつもない負荷がかかってしまいます。
なので、ひとまず今回は「受信した時間が最新から6件」のメールを1分ごとに調べるようにしました。
3、GoogleDriveに自動保存したファイルが添付されているメールの状態を変更する
Google Driveの指定フォルダに自動保存したのはいいものの、プログラムの書き方によっては、1分後またプログラムが実行されたときに、また同じファイルがGoogle Driveに自動保存されてしまいます。
そのため、自動保存したファイルが添付されているメールは、保存後は状態を変更する記述を書いておきました。今回は「ゴミ箱に移動する」ように状態変更しましたが、そもそもメールの精査条件を「未読メールのみ」にして、保存終了後の状態変更を「未読→既読」にしてもいいのではないかなと思います。
Google Apps ScriptでGmailの添付ファイルをGoogleDriveに自動保存する参考プログラム
ということで、GoogleAppsScriptの参考プログラムは以下の通りです。汚いところもありますが、何かにご利用頂ければ幸いです。
function gmailFileUploader() {
var Threads = GmailApp.getInboxThreads();
for(var i=0;i<6;i++){
var status = Threads[i].isUnread();
if(status==true){
var subject = Threads[i].getMessages()[0].getSubject();
if(subject=="課題提出"){
var attachments = Threads[i].getMessages()[0].getAttachments();
var folders = DriveApp.getFoldersByName("testフォルダ");
while(folders.hasNext()){
var folder = folders.next();
for(var j = 0;j