首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用脚本按字母顺序排序(A)忽略开头的"A“、"An”和"The“

使用脚本按字母顺序排序(A)忽略开头的"A“、"An”和"The“
EN

Web Applications用户
提问于 2015-09-08 20:37:37
回答 1查看 7.9K关注 0票数 2

我有一个使用Google的电影列表,我想用脚本而不是公式来排序。

A栏是电影的标题。我希望能够按字母顺序对电影标题进行排序,但如果电影标题以"A“、"An”和" the“开头,则忽略不计。例如:"The Abyss“将以”A“作为"Abyss”的格式,但仍然显示为"The Abyss“。

我也希望它忽略其他几个字,我可以继续输入需要。例如:“漫威”..。因此,“漫威的钢铁侠”将在“钢铁侠”的“I”下存档,但仍将显示为“漫威的钢铁侠”。

我知道如何在新的专栏中使用这个公式:

代码语言:javascript
运行
复制
=IF(LEFT(A2,2)="A ",RIGHT(A2,LEN(A2)-2),
   IF(LEFT(A2,3)= "An ",RIGHT(A2,LEN(A2)-3),
     IF(LEFT(A2,4)="The ",RIGHT(A2, LEN(A2)-4),A2)
    )
  )

但我宁愿通过脚本来完成,这样我就不需要为此使用另一列了。当有人点击排序电影标题A时,如果它忽略了"A“、" an”和"The“,而不必使用额外的标题列,那就更好了。它不那么凌乱,占用的空间也更少。

另外,如果有一种方法可以通过脚本首先按电影标题排序,然后在默认发布日期进行排序,那就太好了。当然,如果没有按顺序分类,这样朋友和家人就可以按他们喜欢的顺序分类(按年分类,等等),这当然还是很好的。浏览我们的目录时。不过,这并不是一个重要的特性。

EN

回答 1

Web Applications用户

回答已采纳

发布于 2015-09-08 22:32:53

管理期望

脚本无法拦截用户对列名的单击。此操作将始终调用内置搜索。因此,如果希望用户通过单击某个列进行排序,则需要一个单独的列进行排序。

具有独立列

您不需要一个带有IFs的复杂公式来删除文章或其他单词:正则表达式可用于同时处理所有变体:

代码语言:javascript
运行
复制
= regexreplace(A1, "(?i)^(a|an|the) ", "") 

(不区分大小写的替换),或

代码语言:javascript
运行
复制
= regexreplace(lower(A1), "^(a|an|the) ", "") 

(也可以转换为小写,以便排序不区分大小写)。

这很容易扩展到其他的词:(a|an|the|Marvel's)等等。

带有脚本的

,用于无公式工作表

但是如果你真的不想要另一个专栏,这里有一个脚本。它所做的:

  • 在菜单中添加"Sort > by“命令(当打开电子表格时)。
  • 使用此命令调用时,按照第一列对整个工作表A>Z进行排序,忽略开头的a、an、和也忽略大小写。
  • 不按任何其他列进行排序(添加年份等作为次要标准由您决定)。

副作用是,此脚本将从工作表中删除任何公式,并将其替换为这些单元格中的当前值。这是不可接受的,除非你不使用公式。

代码语言:javascript
运行
复制
function sortByTitle() {
  var range = SpreadsheetApp.getActiveSheet().getDataRange(); 
  var values = range.getValues();
  values.sort(function(a,b) {return (trimmed(a[0]) < trimmed(b[0]) ? -1 : 1);});
  range.setValues(values);
}

function trimmed(str) {
  return str.toLowerCase().replace(/^(a|an|the) /, ''); 
}

function onOpen() {
  SpreadsheetApp.getActiveSpreadsheet().addMenu("Sort", [{name: "by Movie Title",  functionName: "sortByTitle"}]);
}

带有脚本的

,保留公式

这是一种混合方法:它添加了一个新列,其中填充了修剪后的标题,调用Range类的方法sort,然后清除该列。因此,公式将被保留(如果您的公式对其他行中的单元格进行相对引用,排序仍然会导致混乱,但这是意料之中的)。

下面是新的sortByTitle函数;裁剪的函数和onOpen保持如上。

代码语言:javascript
运行
复制
function sortByTitle() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var height = sheet.getDataRange().getHeight();
  var width = sheet.getDataRange().getWidth();
  var titles = sheet.getRange(1, 1, height, 1).getValues();
  trimmedTitles = [];
  for (var i=0; i<titles.length; i++) {
    trimmedTitles.push([trimmed(titles[i][0])]);
  }
  var newColumn = sheet.getRange(1, width+1, height, 1);
  newColumn.setValues(trimmedTitles);
  sheet.getRange(1, 1, height, width+1).sort(width+1);   // see comment below
  newColumn.clear();
}

如果您的电子表格包含标题行(很有可能),请用注释替换该行

代码语言:javascript
运行
复制
  sheet.getRange(2, 1, height-1, width+1).sort(width+1);

以便将顶部行排除在排序之外。

票数 4
EN
页面原文内容由Web Applications提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://webapps.stackexchange.com/questions/84218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档