我正在使用脚本对 Google 表格中的两列进行排序。
目前,两列都使用排序功能,我想知道是否可以对第一列使用自定义顺序(在这种情况下 ['OPEN','YES','NO'])
这里是 sample spreadsheet 的链接
function autoSort() {
/** Begin sorting function **/
var activeSheet = SpreadsheetApp.getActiveSheet();
var sheetName = activeSheet.getSheetName(); //name of sheet to be sorted
var sheet = SpreadsheetApp.getActive().getSheetByName(sheetName);
var range = sheet.getRange(headerRows+1, 1, sheet.getMaxRows()-headerRows, sheet.getLastColumn());
var sortOrder = ['OPEN','YES','NO'];
range.sort([{column: sortFirst, ascending: sortFirstAsc}, {column: sortSecond, ascending: sortSecondAsc}]);
}
最佳答案
- 您想在共享电子表格中运行两种类型。
- 您想要对“A”列的日期进行排序。
- 对于“C”列,您希望使用键按照自定义顺序进行排序。
- 您希望使用 Google Apps 脚本来实现此目的。
如果我的理解是正确的,这个示例脚本怎么样?在此修改中,从电子表格中检索的值通过 Javascript 的排序方法进行排序,然后使用 setValues()
将排序后的值放入电子表格中。请将此视为多个答案之一。
流程:
该示例脚本的流程如下。
- 从电子表格中检索值。
- 对“A”列的日期进行排序。
- 使用键按自定义排序对“C”列的值进行排序。
示例脚本:
function autoSort() {
var headerRows = 1;
var sortFirst = 1; // 1 is Column "A"
var sortFirstAsc = false; // When it's "true", the order is ascending.
var sortSecond = 3; // 3 is Column "C"
var sortSecondAsc = true; // When it's "true", the order is ['OPEN','YES','NO'].
// Retrieve values from Spreadsheet.
var activeSheet = SpreadsheetApp.getActiveSheet();
var sheetName = activeSheet.getSheetName(); //name of sheet to be sorted
var sheet = SpreadsheetApp.getActive().getSheetByName(sheetName);
var range = sheet.getRange(headerRows+1, 1, sheet.getLastRow()-headerRows, sheet.getLastColumn());
var values = range.getValues();
// Sort the date of column "A".
var s1 = sortFirstAsc ? 1 : -1;
values.sort(function(a, b) {return (a[sortFirst - 1] < b[sortFirst - 1] ? -s1 : s1)});
// Sort the values of column "C" with the custom sort using the keys.
var sortOrder = ['OPEN','YES','NO'];
var s2 = sortSecondAsc ? 1 : -1;
values.sort(function(a, b) {
var i1 = sortOrder.indexOf(a[sortSecond - 1]);
var i2 = sortOrder.indexOf(b[sortSecond - 1]);
var vlen = values.length;
return s2 * ((i1 > -1 ? i1 : vlen) - (i2 > -1 ? i2 : vlen));
});
sheet.getRange(2, 1, values.length, values[0].length).setValues(values);
}
- 如果要使用
headerRows
、sortFirst
、sortFirstAsc
、sortSecond
和变量sortSecondAsc
为全局的,请将它们放在autoSort()
函数的外部。 - 如果要对日期进行升序排序,请修改为
var sortFirstAsc = true;
。 - 如果您想按照
['NO', 'YES', 'OPEN']
的顺序对“C”列的值进行排序,请修改为var sortSecondAsc =假;
。
结果:
当脚本在以下输入情况下运行时,可以检索到以下输出。
输入:
输出:
注意:
- 在此回答中,使用了您共享的电子表格。因此,如果您想将此脚本用于其他电子表格,请注意列的顺序。
当然,为了对日期进行排序,您可以使用
range.sort()
。在这种情况下,请按如下方式修改脚本。function autoSort() { var headerRows = 1; var sortFirst = 1; // 1 is Column "A" var sortFirstAsc = false; // When it's "true", the order is ascending. var sortSecond = 3; // 3 is Column "C" var sortSecondAsc = true; // When it's "true", the order is ['OPEN','YES','NO']. // Retrieve values from Spreadsheet. var activeSheet = SpreadsheetApp.getActiveSheet(); var sheetName = activeSheet.getSheetName(); //name of sheet to be sorted var sheet = SpreadsheetApp.getActive().getSheetByName(sheetName); var range = sheet.getRange(headerRows+1, 1, sheet.getLastRow()-headerRows, sheet.getLastColumn()); // Sort the date of column "A". range.sort([{column: sortFirst, ascending: sortFirstAsc}]); SpreadsheetApp.flush(); // Sort the values of column "C" with the custom sort using the keys. var values = range.getValues(); var sortOrder = ['OPEN','YES','NO']; var s2 = sortSecondAsc ? 1 : -1; values.sort(function(a, b) { var i1 = sortOrder.indexOf(a[sortSecond - 1]); var i2 = sortOrder.indexOf(b[sortSecond - 1]); var vlen = values.length; return s2 * ((i1 > -1 ? i1 : vlen) - (i2 > -1 ? i2 : vlen)); }); sheet.getRange(2, 1, values.length, values[0].length).setValues(values); Logger.log(JSON.stringify(values)); }
引用:
如果我误解了您的问题并且这不是您想要的结果,我深表歉意。
关于google-apps-script - 在谷歌脚本中使用自定义顺序对列进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58472069/