如何防止自定义排序脚本占用标题行?

时间:2019-05-28 04:33:21

标签: google-apps-script google-sheets

我修改了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);

    }

}

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可能会包装数据并因此排序不同。