排序范围值而不对电子表格进行排序

问题描述:

我从电子表格中捕获未排序的范围以在Google表单中创建ListItem。我希望这个列表项按字母顺序排序,但是一旦我得到范围,如果我使用range.sort(),它也会对电子表格中的数据进行排序。有关如何对值进行排序而不是电子表格的建议?排序范围值而不对电子表格进行排序

到目前为止,我有这样的代码:

//Import Clients List 
var sheetClients = ss.getSheetByName("Clients"); 
var range = sheetClients.getRange(1, 1, sheetClients.getLastRow()); 
range.sort(1); 
var values = range.getValues(); 
var item = formulari.addListItem(); 
item.setTitle("Client"); 
item.setChoiceValues(values); 

感谢。

+0

究竟是什么 “formulari”?需要什么论证? – 2014-09-02 14:20:05

+0

我想它是表单本身,但是在呈现代码示例时应该显示每个变量的定义......以避免混淆和错误答案。 – 2014-09-02 15:18:10

您应该有一个名为getValues()方法中的值的数组。只需对数值进行排序而不是范围...

var values = range.getValues(); 
values.sort(); 
+1

[这个文档](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/sort)可以帮助进一步;-) – 2014-09-02 16:17:06

对于“formulari”的错误信息,我很抱歉。这是一个表单类。

values.sort();不起作用sort();只能在不属于字符串数组的范围类中使用,因为值是。

我发现使用这个新库https://sites.google.com/site/scriptsexamples/custom-methods/2d-arrays-library

解决方案中的新代码将是这样的:

//Import Clients List 
var sheetClients = ss.getSheetByName("Clients"); 
var range = sheetClients.getRange(1, 1, sheetClients.getLastRow()); 

// CHANGE HERE from range.sort(1) 
var new_range = ArrayLib.sort(range , 1 , true); 

var values = new_range.getValues(); 
var item = formulari.addListItem(); 
item.setTitle("Client"); 
item.setChoiceValues(values); 

感谢。

Marc。

+1

很高兴你有它的工作,但是,应该肯定在一个字符串数组上工作,所以也许你有一个数组问题(logger.log帮助这里)。请参阅上面的Serge's(Gapps脚本传奇)评论... Google应用程序是JavaScript和一些自己的库的混合体,我毫无疑问知道它100%,它绝对会在JavaScript字符串数组中的be.sort()诀窍。 – Kevrone 2014-09-05 21:36:40

+0

@ Kevrone:谢谢:-) @MarcJordi:请看看最近的帖子,它展示了如何对2D数组进行排序:http://*.com/questions/26300610/google-script-sort-2d-array逐个列(也请阅读评论) – 2014-10-10 22:45:20

我建议你在你的项目中添加一个代码文件underscore.js,然后使用这些功能进行排序和过滤(还有很多很棒的东西)。

为例

function getListClients() { 
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Clients'); 
    var range = sheet.getRange("A1:A" + sheet.getMaxRows()).getValues(); 

    // using Underscore.js 
    var arrayClients = _.chain(range).flatten().uniq().without('').value(); 

    return arrayClients; 
}