🔔

【GAS】指定したフォルダ内で24時間以内に更新されたファイルをメール通知させる

2024/02/25に公開

ファイルが更新されるたびに通知するコードはあちこちで公開されていますが、個人的には毎日1回通知してくれる程度で十分でした。

コード


const FOLDER_ID = "(ここにはフォルダIDを入れる)";
const MAIL_TO = "(通知を送るメールアドレスを入れる)";

// 指定したファイルに対して、そのファイルが含まれるフォルダ名を取得する関数
const getParent = (file) => {
  const stack = [];
  const parents = file.getParents();
  while (parents.hasNext()) {
    const f = parents.next();
    stack.push(f.getName());
  }
  return stack[0];
};

// 指定したフォルダに対して、再帰的にファイルを見ていって各種情報を取得する関数。
// 返り値はサブフォルダがあった場合に多次元配列になるので要注意(後述)
const getFilesInfo = (folder) => {
  const stack = [];
  const files = folder.getFiles();
  while (files.hasNext()) {
    const file = files.next();
    const name = file.getName();
    const fileID = file.getId();
    const timestamp = file.getLastUpdated();
    const dir = getParent(file);
    stack.push({
      name,
      fileID,
      timestamp,
      dir,
    });
  }
  const subFolders = folder.getFolders();
  while (subFolders.hasNext()) {
    const subFolder = subFolders.next();
    stack.push(getFilesInfo(subFolder));
  }
  return stack;
};

// メールタイトルと本文を指定してメール送信する関数
const sendMail = (sub, text) => {
  MailApp.sendEmail({
    to: MAIL_TO,
    subject: sub,
    body: text,
  });
};

// トリガーによって起動するメインの関数
const main = () => {
  const now = new Date();
  const folder = DriveApp.getFolderById(FOLDER_ID);
  // サブフォルダによって生じた多次元配列をflatメソッドの引数にInfinityを指定して1次元化
  const recent = getFilesInfo(folder)
    .flat(Infinity)
    .filter((x) => {
      const d = new Date(x.timestamp);
      const delta = now.getTime() - d.getTime();
      return delta < 1000 * 3600 * 24;
    });
  if (recent.length < 1) {
    return;
  }
  const folderName = folder.getName();
  const title = `【更新通知】on「${folderName}」フォルダ`;
  const msg = [
    `${folderName}」に24時間以内に更新されたファイルが${recent.length}件あります!`,
    "",
    recent
      .map((r) => {
        if (r.dir === folderName) {
          return `- ${r.name}`;
        }
        return `- ${r.name} (「${r.dir}」フォルダ内)`;
      })
      .join("\n"),
  ].join("\n");
  sendMail(title, msg);
};

トリガーを設定して、 main 関数を毎日指定した時刻に実行するようにします。

最終的にこのような形でメールが届きます。

件名:【更新通知】on「ほげほげ」フォルダ
本文:「ほげほげ」にに24時間以内に更新されたファイルが2件あります!

- てすと
- テスト2(「テスト」フォルダ内)

Discussion