You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求编写Google Apps Script:特定Shared Drive新建文件时写入Google Sheet

Google Shared Drive 文件创建日志脚本方案

核心逻辑

通过定时触发器每隔指定分钟扫描目标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;
}

使用步骤

  1. 打开日志表格,点击「扩展程序」→「Apps Script」进入脚本编辑器
  2. 替换代码中CONFIG区块的参数为你的实际信息
  3. 点击运行setupTrigger函数,首次运行需完成权限授权(若提示「未验证应用」,点击「高级」→「转到脚本」继续授权)
  4. 左侧点击「触发器」图标,确认已创建对应间隔的定时触发器

注意事项

  • 配额限制:若监控的Drive文件量极大,建议适当延长扫描间隔,避免触发Google服务配额限制
  • 权限范围:脚本需要Drive读写、Sheet读写权限,授权时确保勾选对应权限
  • 历史补扫:若需要补扫更早的文件,可手动修改lastScanTime的初始值为目标时间

内容的提问来源于stack exchange,提问作者Exeter Trees

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 05:44:52