请求编写Google Apps Script:特定Shared Drive新建文件时写入Google Sheet
核心逻辑
通过定时触发器每隔指定分钟扫描目标Shared Drives,对比上次扫描时间筛选新增文件,将文件关键信息批量写入指定Google Sheet。
前置准备
- 新建一个Google Sheet作为日志表,表头设置为:创建时间戳、文件名、文件位置、用户邮箱
- 收集所有需要监控的Shared Drive ID(从Drive的URL中提取,格式类似
1AbCdeFgHiJkLmNoPqRsTuVwXyZ)
完整脚本代码
// 配置参数,根据实际情况修改 const CONFIG = { SHEET_ID: "你的日志表格ID", // 替换为你的Google Sheet ID SHEET_NAME: "文件创建日志", // 日志表内的工作表名称 SHARED_DRIVE_IDS: ["DriveID1", "DriveID2"], // 填入要监控的Shared Drive ID列表 SCAN_INTERVAL: 5, // 与触发器间隔分钟数保持一致 LAST_SCAN_KEY: "lastScanTimestamp" // 存储上次扫描时间的标识,无需修改 }; // 创建定时触发器 function setupTrigger() { // 清除已有同名触发器,避免重复执行 const existingTriggers = ScriptApp.getProjectTriggers(); existingTriggers.forEach(trigger => { if (trigger.getHandlerFunction() === "scanNewFiles") { ScriptApp.deleteTrigger(trigger); } }); // 创建新触发器 ScriptApp.newTrigger("scanNewFiles") .timeBased() .everyMinutes(CONFIG.SCAN_INTERVAL) .create(); console.log(`触发器已创建,每隔${CONFIG.SCAN_INTERVAL}分钟执行一次`); } // 扫描新增文件并写入日志 function scanNewFiles() { const sheet = SpreadsheetApp.openById(CONFIG.SHEET_ID).getSheetByName(CONFIG.SHEET_NAME); if (!sheet) { console.error("未找到指定的日志工作表"); return; } // 获取上次扫描时间,首次执行默认扫描过去1小时的文件 const props = PropertiesService.getScriptProperties(); let lastScanTime = props.getProperty(CONFIG.LAST_SCAN_KEY); lastScanTime = lastScanTime ? new Date(lastScanTime) : new Date(Date.now() - 3600000); const currentTime = new Date(); // 遍历所有目标Shared Drive for (const driveId of CONFIG.SHARED_DRIVE_IDS) { try { // 查询扫描间隔内创建的文件 const files = DriveApp.getFolderById(driveId).searchFiles( `createdDate > '${formatQueryDate(lastScanTime)}'` ); const logData = []; while (files.hasNext()) { const file = files.next(); const ownerEmail = file.getOwner() ? file.getOwner().getEmail() : "无所有者"; const driveName = DriveApp.getFolderById(driveId).getName(); const folderPath = `${driveName} > ${getParentPath(file)}`; logData.push([ file.getDateCreated(), file.getName(), folderPath, ownerEmail ]); } // 批量写入日志,提升效率 if (logData.length > 0) { sheet.getRange(sheet.getLastRow() + 1, 1, logData.length, 4).setValues(logData); console.log(`已写入${logData.length}条日志记录`); } } catch (err) { console.error(`扫描Drive ${driveId}失败: ${err.message}`); } } // 更新上次扫描时间 props.setProperty(CONFIG.LAST_SCAN_KEY, currentTime.toISOString()); } // 辅助函数:格式化日期为Drive查询支持的格式 function formatQueryDate(date) { return Utilities.formatDate(date, Session.getScriptTimeZone(), "yyyy-MM-dd'T'HH:mm:ss'Z'"); } // 辅助函数:获取文件的上级文件夹路径 function getParentPath(file) { const parents = file.getParents(); if (!parents.hasNext()) return "根目录"; let path = parents.next().getName(); let currentParent = parents.next().getParents(); while (currentParent.hasNext()) { const folder = currentParent.next(); path = `${folder.getName()} > ${path}`; currentParent = folder.getParents(); } return path; }
使用步骤
- 打开日志表格,点击「扩展程序」→「Apps Script」进入脚本编辑器
- 替换代码中
CONFIG区块的参数为你的实际信息 - 点击运行
setupTrigger函数,首次运行需完成权限授权(若提示「未验证应用」,点击「高级」→「转到脚本」继续授权) - 左侧点击「触发器」图标,确认已创建对应间隔的定时触发器
注意事项
- 配额限制:若监控的Drive文件量极大,建议适当延长扫描间隔,避免触发Google服务配额限制
- 权限范围:脚本需要Drive读写、Sheet读写权限,授权时确保勾选对应权限
- 历史补扫:若需要补扫更早的文件,可手动修改
lastScanTime的初始值为目标时间
内容的提问来源于stack exchange,提问作者Exeter Trees
相关产品推荐
相关产品推荐

