如何优化获取共享云端硬盘当年修改Google Docs的脚本以提速
优化Google Apps Script运行速度的方案
原脚本功能正常,但频繁的API交互和低效的文件遍历方式导致运行缓慢,以下是针对性的优化措施:
1. 批量写入Spreadsheet,减少API调用开销
原脚本每找到一个文件就执行一次setValues写入Sheets,每次API调用都有网络往返开销,累积后会大幅拖慢速度。优化方式是先把所有符合条件的文件数据收集到内存数组中,最后一次性写入Sheet。
2. 用Drive Advanced Service批量查询文件,替代递归遍历
递归遍历每个文件夹的方式需要多次发起Drive API请求,效率极低。改用Drive Advanced Service的files.list方法,通过查询条件一次性筛选出所有目标文件:
- 筛选Google Docs类型文件
- 限定最后修改时间在当年
- 指定共享驱动器ID
- 一次性获取所有需要的字段(文件名、修改时间、修改者、所属文件夹等)
3. 移除冗余的Sheet数据读取逻辑
原递归函数中每次都读取整个Sheet数据来构建folderFileNames,但主函数已经执行了clearContents()清空内容,此时Sheet中只有表头(或为空),这个去重逻辑完全多余,直接删除即可减少不必要的Sheets API调用。
4. 批量获取最后修改者信息,避免单独API调用
原脚本每个文件单独调用Drive.Revisions.list获取修改者,开销极大。在files.list的字段参数中直接指定lastModifyingUser(emailAddress),就能在批量查询时同步拿到修改者邮箱,无需额外API请求。
优化后的完整代码
function listGoogleDocsModifiedInCurrentYear() { const folderId = "SHARED FOLDER ID HERE"; const spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); const currentYear = new Date().getFullYear(); const startOfYear = new Date(currentYear, 0, 1).toISOString(); const endOfYear = new Date(currentYear, 11, 31, 23, 59, 59).toISOString(); // 获取或创建目标Sheet const sheetYear = getOrCreateSheet(spreadsheet, `${currentYear} Docs`); sheetYear.clearContents(); // 设置表头(如果不存在) const headers = ["Last Modified", "Title", "Type", "Link", "Last Modifier", "Folder Name"]; const headerRange = sheetYear.getRange(1, 1, 1, headers.length); if (headerRange.getValues()[0][0] !== headers[0]) { headerRange.setValues([headers]); headerRange.setFontWeight("bold").setHorizontalAlignment("left"); sheetYear.setFrozenRows(1); } // 批量查询符合条件的文件 const allFileData = []; let pageToken = null; do { const response = Drive.Files.list({ q: `mimeType='application/vnd.google-apps.document' and lastModifiedTime >= '${startOfYear}' and lastModifiedTime <= '${endOfYear}' and driveId='${folderId}' and trashed=false`, fields: "nextPageToken, files(id, name, lastModifiedTime, lastModifyingUser, parents)", driveId: folderId, includeItemsFromAllDrives: true, supportsAllDrives: true, pageToken: pageToken }); // 处理查询到的文件 if (response.files && response.files.length > 0) { for (const file of response.files) { // 获取所属文件夹名称 let folderName = ""; if (file.parents && file.parents.length > 0) { const parentFolder = Drive.Files.get(file.parents[0], { supportsAllDrives: true, fields: "name" }); folderName = parentFolder.name; } // 组装文件数据 allFileData.push([ new Date(file.lastModifiedTime), file.name, "Google Doc", `https://drive.google.com/file/d/${file.id}/view`, file.lastModifyingUser?.emailAddress || "No modifier", folderName ]); } } pageToken = response.nextPageToken; } while (pageToken); // 一次性写入所有数据 if (allFileData.length > 0) { sheetYear.getRange(2, 1, allFileData.length, allFileData[0].length).setValues(allFileData); } } function getOrCreateSheet(spreadsheet, sheetName) { let sheet = spreadsheet.getSheetByName(sheetName); if (!sheet) { sheet = spreadsheet.insertSheet(sheetName); } return sheet; }
额外优化提示
- 确保已启用Drive Advanced Service:在脚本编辑器中依次点击「资源」→「高级Google服务」,找到「Drive API」并启用。
- 如果共享驱动器文件数量极大(超过1000个),
files.list会自动分页,代码中已处理分页逻辑,无需额外修改。
内容的提问来源于stack exchange,提问作者user14915635
相关产品推荐
相关产品推荐

