使用ExcelJS+Google Sheets API合并多Excel至谷歌表格,解决数据覆盖问题
解决多个Excel文件顺序上传到Google Sheets避免覆盖的问题
核心问题原因
你遇到的覆盖问题本质是异步操作并行执行:forEach会一次性触发所有gsheetsUpload调用,这些异步请求几乎同时发送到Google Sheets,每个请求都认为工作表当前的起始追加行是A2,导致后续请求覆盖之前的数据。
解决方案:改成顺序执行异步操作
通过以下修改实现逐个文件上传,等待当前文件上传完成后再处理下一个:
修改清除工作表函数为异步并等待完成
原来的gsrun没有等待清除操作完成就开始上传,可能导致上传和清除操作冲突,改成异步函数并等待执行:async function gsrun() { const clearOptions = { spreadsheetId: sID, range: 'Sheet1!A2:AB1000', }; // 等待清除操作完成再继续 await gsapi.spreadsheets.values.clear(clearOptions); };替换
fs.readdir回调为Promise版本,用for...of顺序遍历文件
放弃forEach改用for...of循环,配合await确保每个文件上传完成后再处理下一个:client.authorize(async function (err, tokens) { if (err) { console.log(err); return; } else { console.log('Connected'); // 先等待工作表清除完成 await gsrun(); // 使用Promise版readdir获取文件列表(避免回调嵌套) const files = await fs.promises.readdir(folder); // 顺序遍历每个文件,等待当前上传完成再处理下一个 for (const file of files) { await gsheetsUpload(file); console.log(`文件 ${file} 上传完成`); } console.log('所有文件上传完成'); }; });优化数据处理逻辑(可选)
原来的data.map会生成包含undefined的数组,改用forEach更高效:// 替换原代码中的data.map部分 data.forEach(function (r) { if (r[1] == 'Some cell value') { dataArray.push([r[2]]); }; });
原理说明
改成for...of配合await后,每个文件的读取、数据处理、Google Sheets追加操作都会串行执行:前一个文件的append请求完成后,工作表的最后一行已经更新,下一个append请求会基于最新的状态找到正确的空行,彻底避免并行请求导致的覆盖问题。
内容的提问来源于stack exchange,提问作者blw_
相关产品推荐
相关产品推荐

