首页 > 解决方案 > createTextFinder 总是在不应该的第一行中找到匹配项

问题描述

我在使用 createTextFinder 函数时遇到问题。它总是在不应该的情况下在工作表的第一行中找到匹配项。

我想要做的是找出数组中的数据是否在工作表中,如果是,则将匹配的行复制到另一张工作表并将其从原始工作表中删除。但是,最重要的是我只需要转移第一个匹配项,即如果工作表中有两个元素出现在搜索数组中,我只需删除其中一个,然后将它们从原始工作表转移一次到新的那一个。

我正在运行的代码是:

function moveData(){
  let dataToSearch = [22, 10, 12];
  const date = new Date();
  dataToSearch.forEach(data => {
      let dataFinder = sheet.createTextFinder(data.toString());
      let result = dataFinder.findAll();
      if(result.length>0){
          let matchValues = sheet.getRange(result[0].getRow(), 1, 1, 5).getValues();
          for (let value in matchValues){
              found.appendRow([date, "user", matchValues[value][0], matchValues[value][1], matchValues[value][2], matchValues[value][3], matchValues[value][4]]);
              sheet.deleteRow(result[0].getRow());
          }
      }
  })
}

这将是不执行代码的工作表: 在此处输入图像描述

预期输出: 在此处输入图像描述

正如您在图像中看到的,只有 id 22、10 和 12 的第一个条目已被删除,其余的留在工作表上。

知道为什么即使它不在数组中,它也会占用工作表的第一个元素吗?

标签: javascriptgoogle-apps-scriptgoogle-sheets

解决方案


解释:

当我执行您的代码时,我会得到您的屏幕截图所示的预期输出。

  • 但是,由于您只想删除第一个匹配项,因此无需使用该内部for (let value in matchValues)循环,因为您只想删除/移动一个匹配项。

  • 此外,迭代使用也不是一个好主意,appendRow而是将数据附加到数组中,然后用于setValues复制数据。

修改脚本:

function moveData(){
  let dataToSearch = [22, 10, 12];     
  const ss = SpreadsheetApp.getActive();
  const sheet = ss.getSheetByName('Sheet1'); // change that to your case
  const found = ss.getSheetByName('found'); // change that to your case
  const date = new Date();
  const found_data = [];
  dataToSearch.forEach(data => {
      let dataFinder = sheet.createTextFinder(data.toString());
      let result = dataFinder.findAll();
      if(result.length>0){
          let matchValues = sheet.getRange(result[0].getRow(), 1, 1, 5).getValues();
          found_data.push([date, "user", ...matchValues.flat()]);
          sheet.deleteRow(result[0].getRow());
      }
  });
  found.getRange(found.getLastRow()+1,1,found_data.length,found_data[0].length).setValues(found_data);
}

推荐阅读