javascript - 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 的第一个条目已被删除,其余的留在工作表上。
知道为什么即使它不在数组中,它也会占用工作表的第一个元素吗?
解决方案
解释:
当我执行您的代码时,我会得到您的屏幕截图所示的预期输出。
但是,由于您只想删除第一个匹配项,因此无需使用该内部
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);
}
推荐阅读
- java - 如何在 Weblogic 中使用 WLST 配置自定义 UserNameMapper?
- c# - 如何在 parallel.foreach 循环中使用 autofac
- javascript - 为什么使用 Webpack 代码拆分时我的 Vue 组件不显示?
- python - 如何删除 2019 年 7 月 1 日等字符串
- amazon-web-services - 由于 redis 内存使用,Redis cli 无法连接到 AWS ElastiCache,但应用程序仍然能够通信
- angular - 如何显示图标(onclick)并在 3 秒后删除?
- java - 为什么 ArrayList.add() 会修改添加的对象?
- ruby-on-rails - Rails 中的“Locales”字符串是否存在某种全局哈希?
- python - 哪种导入机制更快?
- google-chrome - 为什么这个 P5.js 网络摄像头运动检测代码会导致我的浏览器崩溃?