【问题标题】:Wait for Google translate api before writing to excel sheet在写入 excel 表之前等待 Google 翻译 api
【发布时间】:2020-12-09 17:42:54
【问题描述】:

我不知道如何让我的代码在尝试写入 Excel 表之前等待谷歌翻译。在控制台中我可以看到翻译后的数据,但在 excel 文档中它仍然是原始语言。我知道我做错了,但我想不通。

下面的代码中没有显示,但一开始我从 .csv 文件中读取数据。仅获取我需要的数据并将其存储为每个案例的对象数组。然后我遍历该数组并将每个案例/对象写到一个 excel 文件中。

有一个叫做逐字逐句的道具,这是我在将其写入 excel 文件之前尝试翻译成英文的文本。但它不起作用。

  cases.push({
    caseid: row['[CALLERNO_EMAIL_SOCIAL]'],
    caseorigine: row['[CASE_ORIGINE]'],
    emailaddress: row['[EMAIL]'],
    agent: row['[AGENT]'],
    region: row['[REGION2]'],
    csat: parseInt(row['Satisfaction note'], 10),
    fcr: fcr,
    phone: row['[PHONE]'],
    sentDate: row.date_envoi.slice(0, 10),
    receivedDate: row.date_reponse.slice(0, 10),
    verbatim: row['Verbatim experience'],
    tally1: row['[TALLY_1]'],
    tally2: row['[TALLY_2]'],
  });

const filter = {
  'Email entrant': 'emailentrant',
  'Email Sortant': 'emailsortant',
  'Appel Entrant': 'appelentrant',
  'Appel Sortant': 'appelsortant',
  Chat: 'chat',
};

function filterArray(array, filter) {
  return array.filter((item) => {
    if (filters.includes(filter[item.caseorigine])) {
      if (!filters.includes('includecsat5')) {
        if (parseInt(item.csat, 10) !== 5) return item;
      } else {
        return item;
      }
    }
  });
}
const filteredCases = await filterArray(cases, filter);

// translate verbatim value to english
async function translateTextWithModel() {
  filteredCases.forEach(async (item) => {
    const options = {
      to: target,
      model: model,
    };
    if (item.verbatim !== '') {
      let [verbatim] = await translate.translate(item.verbatim, options);
      console.log(verbatim);
      item.verbatim = verbatim;
    }
  });
}

await translateTextWithModel();

// write data to excel
filteredCases.forEach(async (item) => {
  worksheet.getRow(rowNum).getCell(1).value = item.caseid;
  worksheet.getRow(rowNum).getCell(2).value = item.caseorigine;
  worksheet.getRow(rowNum).getCell(3).value = item.emailaddress;
  worksheet.getRow(rowNum).getCell(4).value = item.agent;
  worksheet.getRow(rowNum).getCell(5).value = item.region;
  worksheet.getRow(rowNum).getCell(6).value = item.csat;
  worksheet.getRow(rowNum).getCell(7).value = item.fcr;
  worksheet.getRow(rowNum).getCell(8).value = item.phone;
  worksheet.getRow(rowNum).getCell(9).value = item.sentDate;
  worksheet.getRow(rowNum).getCell(10).value = item.receivedDate;
  worksheet.getRow(rowNum).getCell(11).value = item.verbatim;
  worksheet.getRow(rowNum).getCell(12).value = item.tally1;
  worksheet.getRow(rowNum).getCell(13).value = item.tally2;
  worksheet.getRow(rowNum).commit();
  rowNum += 1;
});

const outFile = `${destination}/${shortid.generate()}.xlsx`;

await workbook.xlsx.writeFile(outFile).then(async function () {
  const file = new File({
    title,
    description,
    file_path: outFile,
    file_mimetype: mimetype,
  });
  await file.save().then(res.send('file uploaded successfully.'));
});

【问题讨论】:

  • 如果您可以确认已打印翻译文本(例如使用console.log(verbatim)),在我看来,翻译文本在到达 excel 指令之前已经丢失。您不认为let [verbatim] 中的let 会导致值消失吗?据我所知let 的范围是直接封闭块{},使用带有var 或至少在同一级别的数组定义的全局变量的结果是什么?跨度>
  • 它与 var 没有区别。翻译功能中的 console.log 显示文本正在被正确翻译。问题是 excel 部分在函数有时间完成之前正在运行。我在 translate 函数之外添加了另一个 console.log 来逐字检查数组中的内容,它会打印未翻译的文本,然后该函数将打印其文本。我不知道如何让代码先运行翻译。
  • 我用一个简单的代码替换了翻译部分,用“测试”替换了逐字部分,这很有效。所以问题实际上是其余代码首先运行并且不等待翻译
  • 我使用称为 p-iteration 的模块修复了它。虽然它现在运行良好,但我仍然想知道如何让它以普通方式运行
  • 我只能想到eliminates the waiting的NodeJS的本质,然后简单地继续下一个请求,也许如果excel语句包含在一个函数中你可以得到不同的结果,但不能完全确定.您能否发布如何解决该行为?详细信息可以帮助其他有同样问题的人。

标签: javascript node.js google-translate exceljs


【解决方案1】:

我使用名为 p-iteration 的模块修复了它

const { forEach } = require('p-iteration');


  await forEach(filteredCases, async (item) => {
          async function translateTextWithModel(text) {
            const options = {
              to: 'en',
              model: 'nmt',
            };
            if (text !== '') {
              var [verbatim] = await translate.translate(text, options);
              return verbatim;
            }
          }
          item.verbatim = await translateTextWithModel(item.verbatim);
          worksheet.getRow(rowNum).getCell(1).value = item.caseid;
          worksheet.getRow(rowNum).getCell(2).value = item.caseorigine;
          worksheet.getRow(rowNum).getCell(3).value = item.emailaddress;
          worksheet.getRow(rowNum).getCell(4).value = item.agent;
          worksheet.getRow(rowNum).getCell(5).value = item.region;
          worksheet.getRow(rowNum).getCell(6).value = item.csat;
          worksheet.getRow(rowNum).getCell(7).value = item.fcr;
          worksheet.getRow(rowNum).getCell(8).value = item.phone;
          worksheet.getRow(rowNum).getCell(9).value = item.sentDate;
          worksheet.getRow(rowNum).getCell(10).value = item.receivedDate;
          worksheet.getRow(rowNum).getCell(11).value = item.verbatim;
          worksheet.getRow(rowNum).getCell(12).value = item.tally1;
          worksheet.getRow(rowNum).getCell(13).value = item.tally2;
          worksheet.getRow(rowNum).commit();
          rowNum += 1;
        });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 2021-03-09
    相关资源
    最近更新 更多