首先,我是新手,不是开发人员.

我正在try 将数据从一个文件夹中的多个Excel文件复制到Google Sheets的一个工作表中.我使用的是EXCELJS和Google Sheet API.问题是,尽管我使用的是"Append"而不是"UPDATE"方法,但它会覆盖数据.我想这是因为它的功能是异步的.这就是原因吗?

以下是代码的部分内容:

client.authorize(function (err, tokens) {
    if (err) {
        console.log(err);
        return;
    } else {
        console.log('Connected');
        gsrun();
        fs.readdir(folder, (err, files) => {
            files.forEach(file => {
                gsheetsUpload(file);
            });
        });
    };
});
function gsrun() {
    const clearOptions = {
        spreadsheetId: sID,
        range: 'Sheet1!A2:AB1000',
    };

    let resRemove = gsapi.spreadsheets.values.clear(clearOptions);
};
async function gsheetsUpload(f) {
    let filename = folder + f
    let wb = new Excel.Workbook();
    let excelFile = await wb.xlsx.readFile(filename);
    let ws = excelFile.getWorksheet('Some worksheet');
    let data = ws.getSheetValues();
    let prefix = ws.getCell('D6').value;
    let dataArray = [];

    data = data.map(function (r) {
        if (r[1] == 'Some cell value') {
            dataArray.push([r[2]]);
        };
    });

    const updateOptions = {
        spreadsheetId: sID,
        range: 'Sheet1!A2',
        valueInputOption: 'USER_ENTERED',
        resource: { values: dataArray }
    };

    console.log(dataArray);
    let resUpload = await gsapi.spreadsheets.values.append(updateOptions);
};

我阅读了关于promise 的内容,并try 使用它们.我也试过设置超时,但也没有用.如何让脚本在下一次迭代开始之前等待每个迭代结束?

推荐答案

在您的显示脚本中,如何进行以下修改?

修改后的脚本:

在此修改中,从XLSX文件中检索所有值,并将检索到的值放入Electron 表格中.通过这种方式,Sheets API被调用一次以放置值.

client.authorize(async function (err, tokens) {
  if (err) {
    console.log(err);
    return;
  } else {
    console.log('Connected');
    await gsrun();
    fs.readdir(folder, async (err, files) => {
      let dataArray = [];
      for (let i = 0; i < files.length; i++) {
        const res = await gsheetsUpload(files[i]);
        dataArray = [...dataArray, ...res];
      }
      if (dataArray.length > 0) {
        const updateOptions = {
          spreadsheetId: sID,
          range: "Sheet1!A2",
          valueInputOption: "USER_ENTERED",
          resource: { values: dataArray },
        };
        let resUpload = await gsapi.spreadsheets.values.append(updateOptions);
      }
    });
  };
});

async function gsrun() {
  const clearOptions = {
    spreadsheetId: sID,
    range: "Sheet1!A2:AB1000",
  };
  let resRemove = await gsapi.spreadsheets.values.clear(clearOptions);
}

async function gsheetsUpload(f) {
  let filename = folder + f;
  let wb = new Excel.Workbook();
  let excelFile = await wb.xlsx.readFile(filename);
  let ws = excelFile.getWorksheet("Some worksheet");
  let data = ws.getSheetValues();
  //   let prefix = ws.getCell("D6").value; // It seems that this is not used.
  let dataArray = [];
  data.forEach(function (r) {
    if (r[1] == 'Some cell value') {
      dataArray.push([r[2]]);
    };
  });
  return dataArray;
}
  • 我以为在这次修改中,await gsapi.spreadsheets.values.append(updateOptions);可能可以修改为await gsapi.spreadsheets.values.update(updateOptions);.

注:

  • 在该修改中,假设值gsapisIDfilename、片名和r[1] == 'Some cell value'Some cell value是有效值.请注意这一点.

参考资料:

Javascript相关问答推荐

Promise.all立即跳到那时,而不是调用所有Promise

添加/删除时React图像上传重新渲染上传的图像

在JS中获取名字和姓氏的首字母

JS、C++和C#给出不同的Base 64 Guid编码结果

可以的.是否可以在不预编译的情况下使用嵌套 Select 器?

React:未调用useState变量在调试器的事件处理程序中不可用

深嵌套的ng-container元素仍然可以在Angular 布局组件中正确渲染内容吗?

如何将连续的十六进制字符串拆分为以空间分隔的十六进制块,每个十六进制块包含32个二元组?

基于变量切换隐藏文本

PrivateRoute不是路由组件错误

将字符串UTC Date转换为ngx—counting leftTime配置值的数字

当作为表达式调用时,如何解析方法decorator 的签名?

在服务器上放置了Create Reaction App Build之后的空白页面

如何在Vue 3中创建自定义 Select 组件,并将选项作为HTML而不是props 传递?

用JS从平面文件构建树形 struct 的JSON

Reaction Redux&Quot;在派单错误中检测到状态Mutations

使每个<;li>;元素的 colored颜色 与随机生成的 colored颜色 列表不同(不重复

在D3条形图中对具有相同X值的多条记录进行分组

构建器模式与参数对象输入

我为什么要使用回调而不是等待?