【GAS】フォルダを再帰的に見て24H以内に更新されたファイルがあればSlackに通知を送る【Googleドライブ】

きっかけ

サイレント修正が憎い

やりたいこと

folder1 > folder1-1 > folder1-1-1 ...のようにフォルダが存在する限り各階層のファイルを探索したい

.
├── folder1
│   ├── folder1-1
│   └── folder1-2
│       └── folder-1-2-1
├── folder2
│   └── folder2-1
└── folder3

コード

1. フォルダーを再帰的に探索して24H以内に更新されたファイル情報を返却する

function recursiveUpdatedFolder(folderId, values = []) {
  const tmp = values;
  const folder = DriveApp.getFolderById(folderId);
  // フォルダー内のファイルを取得
  const files = folder.getFiles();

  while (files.hasNext()) {
    const file = files.next();
    // ファイルの最終更新日時
    const dt = new Date(file.getLastUpdated());
    const diff = new Date() - dt;
    // 最終更新日が24H以内のフォルダをチェックする
    if ((diff / 1000 / 60 / 60) <= 24) {
      // Slack の通知で使いたい情報
      tmp.push({
        name: file.getName(),
        url: file.getUrl(),
        lastUpdated: dt,
        updatedAt: `${dt.getFullYear()}/${dt.getMonth() + 1}/${dt.getDate()} ${dt.getHours()}:${dt.getMinutes()}`,
        created: file.getDateCreated(),
        folder: folder.getName(),
      });
    }
  }

  const folders = folder.getFolders();
  // フォルダーがあれば再帰処理
  while (folders.hasNext()) {
    const next = folders.next();
    recursiveUpdatedFolder(next.getId(), tmp);
  }

  return tmp;
}

2. 更新情報をSlackに送る

// Slack の attachments 用にフォーマット
const title = "24H以内に以下のファイルに更新がありました。";
const color = "#33cccc"; // 任意のカラーコード
const fields = [];
files.forEach((file) => {
  fields.push({
    value: `<${file.url}|${file.name}(更新日時: ${file.updatedAt})>`,
    short: false,
  });
});
const messages = [{ title: title, fields: fields, color: color }];

const SLACK_TOKEN = "xoxb-xxxxx"; // Slack Bot のトークン
const CHANNEL = "#channel"; // チャンネル名
// Slack 通知を送る
UrlFetchApp.fetch("https://api.slack.com/api/chat.postMessage", {
  method: "post",
  payload: {
    token: SLACK_TOKEN,
    channel: CHANNEL,
    icon_emoji: ":emoji:", // Slack Bot に表示したいアイコン
    username: "username", // Slack Bot に表示したい名前
    attachments: JSON.stringify(messages),
  },
});

iliiliiiliili.hatenablog.jp

↓こんな感じでSlackに通知が表示されればOK

コード全文


株式会社エイルシステムでは Web エンジニア・モバイルアプリエンジニアを募集しています。
実務経験がなくても OK です。ご興味のある方は弊社 HP よりご連絡ください。