SpreadsheetApp如何从数组中返回唯一值

时间:2017-12-04 02:37:56

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

这是我做的功能。 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);   
}

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

3 个答案:

答案 0 :(得分:1)

添加到@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 只会打印数组。

答案 1 :(得分:0)

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

在代码

中定义myArray之后添加此内容
myArray = Array.from(new Set(myArray));

您可以详细了解here

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

假设您的数组仅包含名称,并且getValues返回2-D数组,那么,您的数组看起来像 - [['name1', 'name2', 'name3']]

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

答案 2 :(得分:0)

这是另一种方法(针对Google Script)

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