きっかけ
サイレント修正が憎い
やりたいこと
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), }, });
↓こんな感じでSlackに通知が表示されればOK
コード全文
株式会社エイルシステムでは Web エンジニア・モバイルアプリエンジニアを募集しています。
実務経験がなくても OK です。ご興味のある方は弊社 HP よりご連絡ください。