【问题标题】:Google sheet script - Filtering unique cell values - Pushing 2D array values into a single cell谷歌工作表脚本 - 过滤唯一单元格值 - 将二维数组值推送到单个单元格中
【发布时间】:2020-07-26 17:34:27
【问题描述】:

很抱歉再次打扰,但我要走神了.. 我只想过滤范围内每个单元格中的唯一字符串(字符串用分号分隔) 我不能推送所有的数组值,只有一个会超出结果。 非常感谢!

这是一个例子:https://docs.google.com/spreadsheets/d/12T5K9LovcFvmeBg82IS89p4ygtZ530mzpY9fIsZQa8w/edit?usp=sharing PS:我使用脚本是因为每个单元格中的字符串太多,无法按公式分割单元格

这是我的代码:

function FilterReferences(){

  var classeur = SpreadsheetApp.getActive();
  var feuille = classeur.getSheetByName('Feuille 1');
  var plage = feuille.getRange('A1:A');
  var plageValues = plage.getValues();
  var NbLignesTotal = plage.getLastRow();

  for (var i = 1; i < NbLignesTotal; i++){
    try {
       var valeurCellule = plageValues[i-1][0];
        if (valeurCellule != ""){
          var source = valeurCellule.split(";");
          var dest = [];
          dest.push(source[0]);

          for (var n = 0 ; n < source.length ; n++){
          if (dest.indexOf(source[n]) == -1){  dest.push(source[n])};   }


        var plageDest = feuille.getRange('B1:B');
        plageDest.getCell(i,1).setValue([dest]);

     }
    } catch (e) {   }
 }
}

【问题讨论】:

    标签: arrays google-apps-script google-sheets filtering unique


    【解决方案1】:
    • 您想要实现以下情况。每个值都放在一个单元格中。
      • AAA;BBB;AAA;BBB;CCCAAA;BBB;CCC
      • AAA;CCC;AAA;DDD;ZZZ;CCCAAA;CCC;DDD;ZZZ

    模式一:

    在这种模式下,您的脚本会被修改。

    修改脚本:

    请进行如下修改。

    从:
    plageDest.getCell(i,1).setValue([dest]);
    
    到:
    plageDest.getCell(i + 1, 1).setValue(dest.join(";"));
    
    • 在您的脚本中,dest 是一个数组。因此,为了将其转换为字符串,使用了join
      • plageDest.getCell(i,1).setValue([dest]); 运行时,第一个元素由setValue 放置。我认为这是您的问题的原因。
    • 为了放置第 2 行中的值,使用 i + 1 代替 i

    模式 2:

    在此模式中,您的脚本通过降低流程成本进行修改。

    修改脚本:

    function FilterReferences() {
      var classeur = SpreadsheetApp.getActive();
      var feuille = classeur.getSheetByName('Feuille 1');
      var plage = feuille.getRange('A2:A' + feuille.getLastRow());  // Modified
      var plageValues = plage.getValues();
    
      // I added below script.
      const res = plageValues.map(([e]) => 
        [Object.keys(e.split(";").reduce((o, e) =>
          Object.assign(o, {[e]: null})
        , {})).join(";")]
      );
      feuille.getRange(2, 2, res.length, 1).setValues(res);
    }
    
    • 在此脚本中,值是在循环中创建的。然后,使用setValues 将创建的值放入单元格中。

    参考资料:

    【讨论】:

    • 非常非常感谢您的提示和额外的解决方案,它现在就像一个魅力!生活祝福你
    • @Nad 感谢您的回复。很高兴您的问题得到解决。
    • 不太明白为什么需要转换为字符串,但我认为是理所当然的。再次感谢
    • @Nad 感谢您的回复。在您的情况下,转换后的值放在一个单元格中。所以我建议转换为字符串,并在模式1处使用setValue
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多