2013-04-24 58 views
0

首先,如果这个问题已经得到解答,我真的很抱歉。我对脚本编写的所有内容都有非常基本的把握,所以如果我已经在没有意识到的情况下遇到我的问题的答案,我不会感到惊讶(因为它超出了我的头)...带有忽略字符的Google电子表格排序脚本?

我有一个大量库存电子表格,我想按字母顺序排序,但清单中的许多项目在他们的第一个原则单词前面有各种前缀,我希望按它们排序。是否可以创建一个脚本来指定一组字符串或字符,这些字符串或字符应该在排序中被忽略?我在查找包含基于指定分隔符生成新列的答案时看到了很多建议,但由于库存中的项目没有一致的前缀(或前缀),我不认为这种方法适用于我)。当我尝试这个建议时,我想根据项目名称为每个项目排序的原则单词是不同的列。希望这是有道理的......如果有人作为一个模板,甚至只是一个链接,让我开始创建一个这样的脚本,我会非常感激。

+0

我想任何脚本或公式都需要写入A)发现一个或几个文本模式,其中每个项目将适合该模式;或者B)你有一个你想要排序的所有单词的有限列表,并且脚本循环遍历电子表格中的每个项目,并查找是否包含你的排序单词之一。您可以筛选数据,并在此处发布数据中与数据匹配的每个文本模式的所有示例。 (如果您的电子表格中没有包含所有数据的模式,那么它就是计划B)。 – 2013-04-24 18:09:42

+0

给你一些文字模式的想法:第四个字符通常是第一个单词的开始,但如果是第五个,那么第四个字母总是一个数字;有一些字符,那么一个空格,然后是要搜索的单词;在要搜索的单词之前总是有一个字母数字或字母X. – 2013-04-24 18:11:33

+0

该库存是一个化学品的长长的清单,有一些漫长而荒谬的名字。我想按第一个原则词排序,这里有几个例子:1)D-** A **兰胺2)顺式-3-(N-Tert- ** B ** utoxycarbonylamino)环戊烷羧酸3)(1R, 2S,5R) - ( - ) - ** M **(S)-p-甲苯亚磺酸盐我认为在某些地方排列它会更容易,但我会告诉它忽略一组特定的字符串输入:'(''N-''顺''反'等等...感谢您的建议,但希望我能想出一些东西 – user2316646 2013-04-24 21:26:48

回答

0

你可以用数组来做到这一点,这里是一个例子,我在第一个字符后排序降序(在lowerCase中)。

您可以在排序功能中选择其他参数。

function test(){ 
    Logger.log(['xyz 123','wxy 234','vwx 345','abc 456',]) 
    Logger.log(sort(['xyz 123','wxy 234','vwx 345','abc 456',])) 
} 
function sort(array){ 
    array.sort(function(x,y){ 
     var xp = x.toLowerCase().substring(x.indexOf(' ')+1); 
     var yp = y.toLowerCase().substring(y.indexOf(' ')+1); 
     return xp == yp ? 0 : xp > yp ? -1 : 1;// replace xp > yp with xp < yp for ascending order 
     }); 
    return array 
} 

日志输出:

[xyz 123, wxy 234, vwx 345, abc 456] 
[abc 456, vwx 345, wxy 234, xyz 123] 

正如你所看到的,它是在数字空间(降序)

+0

当我建议我的答案,我没有你的'真实生活'答案更有效率,并且很可能适合您的需求......如果需要,您也可以将两者结合使用 – 2013-04-25 05:59:04

1

我站在哔叽的肩膀与此下面的例子,使用后整理正则表达式以匹配样本中较大的单词(5个或更多字母......你可以改变这个,但{7,}是与Menthyl和丙氨酸都匹配的最高单词。当然Butoxycarbo ...也是匹配的它要长得多。):

function test2(){ 
     Logger.log(sort2(['(1R,2S,5R)-(-)-Menthyl (S)-p-toluenesulfinate' ,'D-Alanine','Cis-3-(N-Tert-Butoxycarbonylamino)cyclopentanecarboxylic acid'])); 
     } 


     function sort2(array){ 
      array.sort(function(x,y){ 
      var xp = x.match(/\b[A-z]{5,}\b.*$/m); 
      var yp = y.match(/\b[A-z]{5,}\b.*$/m); 
      return xp == yp ? 0 : xp > yp ? -1 : 1;// replace xp > yp with xp < yp for ascending order 
      }); 
      return array 
     } 
+0

使用正则表达式确实是个好主意:-),+1 – 2013-04-25 05:43:58

+0

谢谢Serge。另外,对于OP,您可以访问regexpal.com并在您的一些示例数据上测试正则表达式的变体。 (顺便说一句,你不可能得到一个完美的正则表达式,它会匹配你所有的数据......所以塞尔的评论结合战术是有道理的。) – 2013-04-25 13:02:58

相关问题