javascript - forEach 仅发布一维数组 javascript 中的最后一个条目
问题描述
我正在尝试将一维数组中的所有条目发布到谷歌表格中的列中。该数组是过滤两个较大数组并返回未出现在两个列表中的名称的产物。
下面是生成数组的示例。
unPub = [fake name, test1, test2, test3]
这是我到目前为止编写的代码:
function unPublished(){
const q3 = SpreadsheetApp.openById("1111111111");
const packAllergies = q3.getSheetByName("PACK_ALLERGIES");
const packSrch = packAllergies.getRange("D5:D" + packAllergies.getLastRow()).getValues().flat();
const allergyNames = allergy.getRange("A2:A" + allergy.getLastRow()).getValues().flat();
var unPub = (packSrch.filter(e => !allergyNames.includes(e)));
var sRow = allergy.getLastRow()+1
if (unPub.length > 0){
unPub.forEach(e => allergy.getRange(sRow,1).setValue(e));
}
}
我尝试了一个 for 循环来遍历列表,forEach
并且仍然只获取unPub
数组的最后一个条目以发布在定义的范围内。
如何让数组中的每个元素发布到从 开始的列sRow
?
解决方案
解释:
您不需要循环来为工作表设置值。实际上不推荐,请参阅最佳实践。
您需要以下两个步骤:
将您的行数组转换为列数组:
unPub=unPub.map(v=>[v]);
因为您要将数据设置为列。
删除
forEach
循环并直接用一行传递值:allergy.getRange(sRow,1,unPub.length,1).setValues(unPub);
解决方案:
function unPublished(){
const q3 = SpreadsheetApp.openById("1111111111");
const packAllergies = q3.getSheetByName("PACK_ALLERGIES");
const packSrch = packAllergies.getRange("D5:D" + packAllergies.getLastRow()).getValues().flat();
const allergyNames = allergy.getRange("A2:A" + allergy.getLastRow()).getValues().flat();
var unPub = (packSrch.filter(e => !allergyNames.includes(e)));
var sRow = allergy.getLastRow()+1;
unPub=unPub.map(v=>[v]);
allergy.getRange(sRow,1,unPub.length,1).setValues(unPub);
}
您的方法存在问题:
除了我在解释部分中描述的性能问题之外,您的forEach
循环不起作用,因为您覆盖了同一单元格上的每个值。如果你看到,这部分allergy.getRange(sRow,1)
在 for 循环中不会改变,因为它sRow
是恒定的。
如果您希望您的方法起作用,那么您需要i
在forEach
循环中引入一个迭代器并使用它来迭代单元格:
unPub.forEach((e,i) => allergy.getRange(sRow+i,1).setValue(e));
function unPublished(){
const q3 = SpreadsheetApp.openById("1111111111");
const packAllergies = q3.getSheetByName("PACK_ALLERGIES");
const packSrch = packAllergies.getRange("D5:D" + packAllergies.getLastRow()).getValues().flat();
const allergyNames = allergy.getRange("A2:A" + allergy.getLastRow()).getValues().flat();
var unPub = (packSrch.filter(e => !allergyNames.includes(e)));
var sRow = allergy.getLastRow()+1
if (unPub.length > 0){
unPub.forEach((e,i) => allergy.getRange(sRow+i,1).setValue(e));
}
}
但我真的向您推荐我提到的第一种方法。
推荐阅读
- linux - 递归查找与字符串匹配的所有目录,并在新目录中符号链接文件夹
- c# - 当我尝试将字符串数组转换为字符数组时出错
- c++ - 比较 int = floor(sqrt(...)) 的 Fortran 和 C++ 汇编器
- java - 引导日历无法打开
- typescript - 无法汇总以将打字稿文件导入苗条
- reactjs - OnSelect 检查测试玩笑/酶
- r - R根据行中的值在列中重复
- dart - 在覆盖运算符时,Dart 中的 super 和 this 有什么区别?
- mysql - 为什么Mysql抛出重复异常
- linux - 如果使用 Find 或 Grep 命令在其中找到特定文件,则删除整个目录