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

使用ExcelJS+Google Sheets API合并多Excel至谷歌表格,解决数据覆盖问题

解决多个Excel文件顺序上传到Google Sheets避免覆盖的问题

核心问题原因

你遇到的覆盖问题本质是异步操作并行执行:forEach会一次性触发所有gsheetsUpload调用,这些异步请求几乎同时发送到Google Sheets,每个请求都认为工作表当前的起始追加行是A2,导致后续请求覆盖之前的数据。

解决方案:改成顺序执行异步操作

通过以下修改实现逐个文件上传,等待当前文件上传完成后再处理下一个:

  1. 修改清除工作表函数为异步并等待完成
    原来的gsrun没有等待清除操作完成就开始上传,可能导致上传和清除操作冲突,改成异步函数并等待执行:

    async function gsrun() {
        const clearOptions = {
            spreadsheetId: sID,
            range: 'Sheet1!A2:AB1000',
        };
        // 等待清除操作完成再继续
        await gsapi.spreadsheets.values.clear(clearOptions);
    };
    
  2. 替换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('所有文件上传完成');
        };
    });
    
  3. 优化数据处理逻辑(可选)
    原来的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_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 22:05:59