我修改了here提供的示例代码以提供以下脚本。当它完成这项工作时,我一直无法找到一种方法来防止它删除工作表的标题(第一行)。
除了切线:在引用脚本末尾的以下两行代码被删除以对工作表进行排序,而不删除其内容并将其替换为未格式化的数组:
sheet.clear();
sheet.getRange(1,1,rows,cols).setValues(vf);
我尝试在所有范围内都跳过它,但会收到有关范围与数据不匹配的错误或其他问题。
function status_sort(){
var ss=SpreadsheetApp.getActive();
var sheet = ss.getSheetByName('current');
var rows = sheet.getLastRow();
var cols = sheet.getLastColumn();
var columnToSortBy = 4;
var rg = sheet.getRange(2, columnToSortBy, sheet.getLastRow(), 1);
var v1 = rg.getValues();
var sortObj = {'black_box':1, 'purple_box':2, 'green_box':3, 'yellow_box':4, 'red_box':5,'blue_box':6};
var col = [];
for(var i = 0; i < v1.length; i++){
col.push([sortObj[v1[i]]]);
}
sheet.getRange(2, cols + 1, rows, 1).setValues(col);
sheet.getDataRange().sort([{column:sheet.getLastColumn(),ascending:true}]);
var vf = sheet.getDataRange().getValues();
for(var i = 0; i < vf.length; i++){
vf[i].splice(vf[i].length,1);
}
}
答案 0 :(得分:0)
看起来v1
包含您的数据(没有标题),并且您将密钥放入col
中,该密钥作为附加列追加到列表中,仅用于排序目的,然后对整个内容进行排序< / em>。如果我没看错,您的标头应该在排序后的数据中,因为我认为getDataRange不够聪明,无法忽略标头。
我想知道如果您替换了会发生什么:
sheet.getDataRange().sort([{column:sheet.getLastColumn(),ascending:true}]);
具有:
sortThis = sheet.getRange(2, 1, rows - 1, cols + 1)
sortThis.sort([{column:sheet.getLastColumn(),ascending:true}]);
// getRange parameters:
// 2 : skip a row for the headers
// 1 : start with the leftmost column
// rows - 1 : get one fewer than the original row count (to exclude the headers)
// cols : get one more than the original column count (to include the extra)
顺便说一句,我认为最后的循环会抓取工作表中的所有内容,然后删除最后一列(仅出于排序目的而注入),并且删除的代码将工作表替换为结果。如果您不打算调用setValues(vf)
,那么也可以省略其他任何引用vf
的代码。
基于https://stackoverflow.com/a/42224466/1054322,我想知道您是否想使用getDisplayValues()
。我在API参考中没有看到setDisplayValues()
,所以我猜测您的格式在读取而不是写入时会丢失,而且setValues()
也不会 破坏您的格式。不确定是否会干扰排序,因为displayValues可能会包装数据并因此排序不同。