在Google Apps Script的if-else中无法正常运行do-while循环的问题
问题解决:Google Apps Script 导入最新CSV并追加数据
原代码核心问题
- 获取最新文件逻辑错误:仅取文件夹中第一个文件,未按修改时间排序,无法定位最新CSV。
- 循环判断逻辑混乱:用表格行数与CSV行数的大小关系决定覆盖/追加,完全不符合需求;else块重复解析CSV,循环条件错误易引发死循环。
- 逐行写入效率极低:每次循环写入一行数据,大幅拖慢执行速度。
- 变量与函数嵌套冗余:
files变量重复赋值,多层嵌套函数降低代码可读性。
修正后的完整代码
function importLatestCsv() { // 获取目标文件夹 const folderIterator = DriveApp.getFoldersByName("Printer CSVs"); if (!folderIterator.hasNext()) { console.log("未找到名为'Printer CSVs'的文件夹"); return; } const folder = folderIterator.next(); // 获取文件夹中所有CSV文件,并按修改时间降序排序,取最新文件 const csvFiles = folder.getFilesByType(MimeType.CSV); const fileList = []; while (csvFiles.hasNext()) { const file = csvFiles.next(); fileList.push({file: file, lastModified: file.getLastModified()}); } if (fileList.length === 0) { console.log("文件夹中无CSV文件"); return; } // 按修改时间从新到旧排序,取第一个 fileList.sort((a, b) => b.lastModified - a.lastModified); const latestFile = fileList[0].file; // 解析CSV数据 const csvContent = latestFile.getBlob().getDataAsString(); let csvData = Utilities.parseCsv(csvContent); if (csvData.length === 0) { console.log("CSV文件为空"); return; } // 定位目标表格 const ss = SpreadsheetApp.getActive(); const sheet = ss.getSheetByName('Sheet1'); const lastWorkingRow = sheet.getLastRow(); // 处理表头:如果表格已有数据,移除CSV的第一行 if (lastWorkingRow > 0) { csvData.shift(); // 删除表头行 if (csvData.length === 0) { console.log("CSV文件仅含表头,无数据可追加"); return; } } // 批量写入/追加数据 const targetRange = sheet.getRange(lastWorkingRow + 1, 1, csvData.length, csvData[0].length); targetRange.setValues(csvData); console.log(`成功导入${csvData.length}行数据`); }
关键逻辑说明
- 获取最新文件:遍历文件夹中所有CSV文件,记录每个文件的修改时间,排序后取最新的一个,确保每次处理的是最新上传的文件。
- 表头处理:通过判断表格已有行数(
lastWorkingRow > 0)决定是否移除CSV表头,满足"后续上传文件移除表头"的需求。 - 批量写入:直接计算目标写入范围,用
setValues一次性写入所有数据,避免逐行写入的低效问题,同时确保新数据追加到现有数据下方。
内容的提问来源于stack exchange,提问作者Divyesh Valand
相关产品推荐
相关产品推荐

