首页 > 解决方案 > 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

标签: javascriptgoogle-apps-scriptgoogle-sheets

解决方案


解释:

您不需要循环来为工作表设置值。实际上不推荐,请参阅最佳实践

您需要以下两个步骤:

  • 将您的行数组转换为列数组:

    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是恒定的。

如果您希望您的方法起作用,那么您需要iforEach循环中引入一个迭代器并使用它来迭代单元格:

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));
  }
}

但我真的向您推荐我提到的第一种方法。


推荐阅读