【问题标题】:SpreadsheetApp how to return unique values from an arraySpreadsheetApp如何从数组中返回唯一值
【发布时间】:2017-12-04 02:37:56
【问题描述】:

这是我制作的功能。 var myArray 是一个名称列表。我无法从该数组中仅获取唯一值并将其设置到另一张纸上。我只想要名字一次。

function array() {          
      var app = SpreadsheetApp;
      var ss = app.getActiveSpreadsheet().getSheetByName("test");
      var destinationSheet = app.getActiveSpreadsheet().getSheetByName("test2");

      var myArray = ss.getRange(2,1,30).getValues();

      destinationSheet.getRange(2, 1, 30).setValues(myArray);   
}

有人可以帮我过滤这个数组吗?

【问题讨论】:

    标签: javascript arrays google-apps-script google-sheets


    【解决方案1】:

    这是另一种方法(用于 Google 脚本)

    function myArray() {
    var ss, s, a;
    ss = SpreadsheetApp.getActive();
    s = ss.getSheetByName("test").getRange(2, 1, 30).getValues();
    a = [];
    a.push(s[0]);
    for (var n = 1; n < s.length; n++) {
        if (a.join().indexOf(s[n].join()) == -1) {
            a.push(s[n])
        };
    }
    ss.getSheetByName("test2").getRange(2, 1, a.length, a[0].length).setValues(a);
    }
    

    【讨论】:

    • 这非常有用。如果你愿意,你能用 join() 和 indexOf() 快速解释 if 语句吗?我不确定我错过了这部分内容
    • @MaximeMorin-Gagnon。当然:join() 方法将数组转换为字符串。因此,数组 'a' 将被转换为字符串(包含推入其中的所有行),并且 indexOf 将检查通过 join() 方法转换为字符串的当前行(在循环中)是否是一部分那个“更大”的字符串(a)。
    • 如果这有帮助,请投票或接受给出的答案。
    【解决方案2】:

    Javascript 数组有 from 方法,您可以使用该方法从一组值创建一个数组,无论是 StringMap 还是 Set

    在你的代码中myArray的定义之后添加这个

    myArray = Array.from(new Set(myArray));
    

    您可以阅读更多关于它的信息here

    您可以使用简单的forEach 循环来过滤唯一值。

    假设您的数组仅包含名称,而getValues 返回二维数组,那么您的数组看起来类似于 - [['name1', 'name2', 'name3']]

    var newArray = [];
    myArray.forEach(function(x){
        if(newArray.indexOf(x[0]) === -1){
            newArray.push(x[0]);
        }                   
    });
    

    【讨论】:

    • 当我输入时收到此错误消息:TypeError: Fonction from introuvable dans l'objet function Array() { [native code for Array.Array, arity=1] }。看起来 google sheet 无法识别来自的方法
    • @MaximeMorin-Gagnon 你能复制并粘贴错误信息吗?我看不懂写的是什么。
    • TypeError: Fonction from introuvable dans l'objet function Array() { [native code for Array.Array, arity=1] }。 (第 9 行,更详细的“代码”)
    • 你能把变量myArray的初始值不使用from函数贴出来吗?
    • @MaximeMorin-Gagnon 请查看替代方法,希望对您有所帮助。
    【解决方案3】:

    添加到@JPV 的答案,这几乎是完美的,但没有考虑到“ab”跟随“abc”的情况。在这种情况下,代码不会将“ab”识别为新实例。为此,您需要将代码更改为以下内容:

    function countDistinct() {
    
    var sh = SpreadsheetApp.getActive();
    var ss = sh.getSheetByName('Sheet1');
    var length = ss.getLastRow()
    var data = ss.getRange(1,1,length,1).getValues();
    var a = [];
    var b = 0;
    
    for (var n = 0; n<length; n++) {
    
    if (a.indexOf(data[n].join()) == -1) {
    
      a.push(data[n].join());
      b++;
    
      }
    }
    
    Logger.log(a);
    Logger.log(b);
    
    }
    

    变量 b 会给出唯一值的数量,而变量 a 只会打印数组。

    【讨论】:

      猜你喜欢
      • 2013-08-24
      • 1970-01-01
      • 2020-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-03
      • 1970-01-01
      相关资源
      最近更新 更多