我有一个使用Google的电影列表,我想用脚本而不是公式来排序。
A栏是电影的标题。我希望能够按字母顺序对电影标题进行排序,但如果电影标题以"A“、"An”和" the“开头,则忽略不计。例如:"The Abyss“将以”A“作为"Abyss”的格式,但仍然显示为"The Abyss“。
我也希望它忽略其他几个字,我可以继续输入需要。例如:“漫威”..。因此,“漫威的钢铁侠”将在“钢铁侠”的“I”下存档,但仍将显示为“漫威的钢铁侠”。
我知道如何在新的专栏中使用这个公式:
=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“,而不必使用额外的标题列,那就更好了。它不那么凌乱,占用的空间也更少。
另外,如果有一种方法可以通过脚本首先按电影标题排序,然后在默认发布日期进行排序,那就太好了。当然,如果没有按顺序分类,这样朋友和家人就可以按他们喜欢的顺序分类(按年分类,等等),这当然还是很好的。浏览我们的目录时。不过,这并不是一个重要的特性。
发布于 2015-09-08 22:32:53
脚本无法拦截用户对列名的单击。此操作将始终调用内置搜索。因此,如果希望用户通过单击某个列进行排序,则需要一个单独的列进行排序。
具有独立列
您不需要一个带有IFs的复杂公式来删除文章或其他单词:正则表达式可用于同时处理所有变体:
= regexreplace(A1, "(?i)^(a|an|the) ", "")
(不区分大小写的替换),或
= regexreplace(lower(A1), "^(a|an|the) ", "")
(也可以转换为小写,以便排序不区分大小写)。
这很容易扩展到其他的词:(a|an|the|Marvel's)
等等。
带有脚本的
但是如果你真的不想要另一个专栏,这里有一个脚本。它所做的:
副作用是,此脚本将从工作表中删除任何公式,并将其替换为这些单元格中的当前值。这是不可接受的,除非你不使用公式。
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保持如上。
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();
}
如果您的电子表格包含标题行(很有可能),请用注释替换该行
sheet.getRange(2, 1, height-1, width+1).sort(width+1);
以便将顶部行排除在排序之外。
https://webapps.stackexchange.com/questions/84218
复制相似问题