読者です 読者をやめる 読者になる 読者になる

山pの楽しいお勉強生活

勉強の成果を垂れ流していきます

Googleドライブにファイルが追加されたらメール通知する

背景

子どもの写真をGoogleドライブで親達に共有しているのですが、遠方に住む義父から通知来ないといつ見ればいいかわからん!と連絡が。 さらに要望を聞くと、写真はフォルダ管理してるのですが、どのフォルダが更新されたかも教えて欲しいとのこと。

通知機能くらいGoogleドライブにあるだろと思って調べたが、そんな機能はなかったのでGoogle Apps Scriptで実装してみました。

実装

前回メールした時から更新されていた場合にメールを送る必要があるため、前回メール時の更新日時はスプレッドシートで保存することにします。

  1. Googleドライブの写真フォルダ配下から最終更新日時を取得。
    • フォルダ分けして管理していたため。
  2. 更新日時を管理しているスプレッドシートから前回メール送信時の各フォルダの更新日時を取得。
  3. スプレッドシートに保存していた最終更新日時より現在のフォルダの最終更新日時が新しかったらメールを送信。

って、ここまでblogに書いて気づいた。 毎日スクリプトを動かすんだから、前日に更新があったフォルダをメールすればよかったのでは!? その場合、スプレッドシートもいらないし、もっと簡単な実装になりますねw

まぁ、GASの練習になったので、GASのメモとして記録します。。。

コード

var PHOTO_FOLDER_ID = "xxxxxxxxxx";
var UPDATE_SHEET_ID = "yyyyyyyyyy";
var UPDATE_SHEET_NAME = "更新日時";
var SEND_MAIL_ADDRESS = ["example1@example.com", "example2@example.com"]

function updateCheck() {
  var photoFolder = DriveApp.getFolderById(PHOTO_FOLDER_ID);
  var folders = photoFolder.getFolders();
  
  // 写真フォルダ配下の最終更新日時を取得。
  var lastUpdateMap = {};
  while (folders.hasNext()) {
    var folder = folders.next();
    lastUpdateMap[folder.getName()] = folder.getLastUpdated();
  }

  // スプレッドシートに記載されているフォルダ名と更新日時を取得。
  var spreadsheet = SpreadsheetApp.openById(UPDATE_SHEET_ID);
  var sheet = spreadsheet.getSheetByName(UPDATE_SHEET_NAME);
  var data = sheet.getDataRange().getValues();

  // 取得したデータをMapに変換。
  var sheetData = {};
  // 説明とヘッダを記載しているため2からstart。
  for (var i = 2; i < data.length; i++) {
    sheetData[data[i][0]] = {name : data[i][0], lastUpdate : data[i][1], rowNo : i + 1};
  }

  // 実際のフォルダとスプレッドシート情報を比較。
  var updateFolderList = [];
  for (key in lastUpdateMap) {
    if(key in sheetData) {
      // フォルダ名がシートに存在する場合。
      if(lastUpdateMap[key] > sheetData[key].lastUpdate) {
        // フォルダが更新されている場合。
        sheet.getRange(sheetData[key].rowNo, 2).setValue(lastUpdateMap[key]);
        updateFolderList.push(key);
      }
    } else {
      // フォルダ名がシートに存在しない場合。
      sheet.getRange(sheet.getLastRow() + 1, 1).setValue(key);
      sheet.getRange(sheet.getLastRow(), 2).setValue(lastUpdateMap[key]);
      updateFolderList.push(key);
    }
  }

  // 新規及び更新された情報をメール送信。
  if (updateFolderList.length != 0) {
    SEND_MAIL_ADDRESS.forEach(function(o,i) {
      MailApp.sendEmail(SEND_MAIL_ADDRESS[i],"写真更新連絡通知",
                        "写真が更新されました。" + "\n" +
                        "更新されたフォルダは以下の通り。" + "\n" +
                        updateFolderList.join("\n") + "\n\n" +
                        "URLはこちら↓" + "\n" +
                        photoFolder.getUrl() + "\n\n" +
                        "このメールに返信しても見れませんので返信しないでください。"
                        );
    });
  }
}