Google App Script 按文件名筛选文件并提取属性录入表格咨询
代码优化方案
- 取消冗余的数组转换步骤,遍历临时文件夹时直接保留文件对象,避免后续重复调用Drive API搜索文件
- 已登记文件名转Set结构,大幅提升大数量下的比对效率
- 批量构建新增行数据,一次性写入表格,减少Spreadsheet API调用次数,提升运行速度
- 原代码需要额外实现的
SearchFiles搜索逻辑已整合到主流程,降低函数联动复杂度
优化后完整代码
const invoiceLog = SpreadsheetApp.openById('SPREADSHEETID').getSheetByName('invoicedata'); const tempInvoiceFolder = DriveApp.getFolderById('TEMPFOLDERID'); // 未用到的全局常量可以先注释/删除,避免冗余API调用 // const invoiceDispatcherLog = SpreadsheetApp.openById('SPREADSHEETID').getSheetByName('invoicedispatcherlog'); // const invoiceFolder2021 = DriveApp.getFolderById('INVOICEFOLDERID'); function invoiceLogger () { // 1. 读取临时文件夹所有文件,同时存储文件名和文件对象 const tempFiles = []; const fileIterator = tempInvoiceFolder.getFiles(); while (fileIterator.hasNext()) { const file = fileIterator.next(); tempFiles.push({ name: file.getName(), obj: file }); } // 2. 读取已登记文件名,转Set提升比对效率 const existingNames = new Set( invoiceLog.getRange('A2:A').getValues() .flat() .filter(item => item) // 过滤表格空行 ); // 3. 筛选未登记的文件,无新文件直接退出 const newFiles = tempFiles.filter(file => !existingNames.has(file.name)); if (newFiles.length === 0) return; // 4. 构建待写入的行数据,可根据实际表格列顺序调整属性排列 // 当前默认列顺序:文件名、文件大小、修改日期、文件ID、文件URL const rowsToAdd = newFiles.map(file => { const f = file.obj; return [ f.getName(), f.getSize(), f.getLastUpdated(), f.getId(), f.getUrl() ]; }); // 5. 批量写入表格 invoiceLog.getRange( invoiceLog.getLastRow() + 1, // 从已有数据的下一行开始写入 1, // 从第一列开始写入 rowsToAdd.length, // 写入行数 rowsToAdd[0].length // 写入列数 ).setValues(rowsToAdd); }
关键逻辑说明
- Set比对优势:如果表格已有上千条记录,
Array.includes每次比对都要遍历整个数组,Set.has直接哈希匹配,速度可提升数十倍 - 批量写入优势:如果有100个新文件,逐行调用
appendRow需要调用100次API,一次性写入仅需1次,运行速度更快,还不容易触发API调用限额 - 可选优化:如果存在重名文件的可能,可以在比对时增加文件大小+修改日期的双重校验,避免漏登记或重复登记
内容的提问来源于stack exchange,提问作者mohammadalha
相关产品推荐
相关产品推荐

