当前位置: 首页 > 知识库问答 >
问题:

Google应用程序脚本附加排序规则

庄星汉
2023-03-14

我正在开发一个GoogleApps脚本电子表格应用程序,我希望该程序具备的能力之一是根据来自两个不同列的数据自动排序一系列表单响应。所以我想按第16列中的数据排序,然后按第1列排序。我可以使用以下方法手动实现此功能:https://drive.googleblog.com/2010/06/tips-tricks-advanced-sorting-rules-in.html

目前我正在运行电子表格。sort(column,升序)函数与第一列一起运行,但我无法使它进行排序,以便它接受第二列作为额外的排序规则。谷歌应用程序脚本中有没有一种方法可以用来模拟这个功能?

共有2个答案

丰博
2023-03-14

您可以在数组级别进行排序,只需将数据从工作表中获取到矩阵,然后通过选择要排序的列对矩阵进行多次排序。

大概是这样的:

function test(){
sortSheetOnColumn(2,3)
}

function sortSheetOnColumn(col1,col2){
  var sh = SpreadsheetApp.getActiveSheet();
  var data = sh.getDataRange().getValues();// get all data
  var header = data.shift();
  data.sort(function(x,y){  // Note: sort method changes the original array
//  var xp = Number(x[col2-1]);// use these to sort on numeric values
//  var yp = Number(y[col2-1]);
  var xp = x[col2-1].toLowerCase();// use these for non-numeric values
  var yp = y[col2-1].toLowerCase(); // I used toLowerCase() for my use case but you can remove it or change it to whatever you need
  Logger.log(xp+'   '+yp); // just to check the sort is OK
  return xp == yp ? 0 : xp < yp ? -1 : 1;// sort on column col ascending
  });
  data.sort(function(x,y){  // Note: sort method changes the original array
//  var xp = Number(x[col1-1]);// use these to sort on numeric values
//  var yp = Number(y[col1-1]);
  var xp = x[col1-1].toLowerCase();// use these for non-numeric values
  var yp = y[col1-1].toLowerCase();//
  Logger.log(xp+'   '+yp); // just to check the sort is OK
  return xp == yp ? 0 : xp < yp ? -1 : 1;// sort on column col ascending
  });
// and at the end take back the headers
  data.unshift(header);
  sh.getDataRange().setValues(data);
}

或者更好,按照亚当的评论:

function sortSheetOnColumn2(col1, col2) {
  var sh = SpreadsheetApp.getActiveSheet();
  var data = sh.getDataRange().getValues();// get all data
  var header = data.shift(), x1, y1, x2, y2;
  col1--;
  col2--;
  data.sort(function(x, y) {
    x1 = x[col1].toLowerCase();
    y1 = y[col1].toLowerCase();
    x2 = x[col2].toLowerCase();
    y2 = y[col2].toLowerCase();
    return x1 == y1 ? (x2 == y2 ? 0 : x2 < y2 ? -1 : 1) : x1 < y1 ? -1 : 1;
  });
  data.unshift(header);
  sh.getDataRange().setValues(data);
}

但迈克尔的答案是,如果使用内置范围更聪明的话。我不知道的排序方法(至少它的扩展可能性)。

狄宪
2023-03-14

参见doc:https://developers.google.com/apps-script/reference/spreadsheet/range#sort(对象)

function sortFormResponses() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  // change name of sheet to your sheet name
  var s = ss.getSheetByName("Form Responses");
  var lastCol = s.getLastColumn();
  var lastRow = s.getLastRow();

  // assumes headers in row 1
  var r = s.getRange(2, 1, lastRow - 1, lastCol);

  // Note the use of an array
  r.sort([{ column: 1, ascending: true }, { column: 16, ascending: true}]);

}
 类似资料:
  • 我有一个谷歌表单,在a列中,我需要用无替换按钮上的文本。该列在几个不同的行中具有需要保持不变的标题。我写了以下脚本: 当我尝试运行脚本时,会出现以下错误:数据中的行数与范围中的行数不匹配。数据有1,但范围有2。 我知道这与具有比其他行更多列的行有关,但不确定如何修复代码。

  • 我正在使用谷歌应用程序脚本自动将附件从电子邮件保存到唯一的谷歌驱动器文件夹,具体取决于邮件过滤到的标签。 到目前为止,我已经设法使用我在网上找到的一些代码片段获得了消息ID。然而,我被困在试图访问消息的正文 提前感谢你的帮助。

  • 我一直在努力对我的数据进行自动排序(根据第二行第一列数据进行升序),我通过在线搜索找到了一些提示,但遇到了一个错误,似乎我无法通过网络找到答案。 下面是一个场景: 我有两张床单,一张 这是床单 这是第二张 请注意,两张表中的列lastname和code相同,不同之处在于列的性别(在下拉列表中格式化) 我发现一个脚本似乎可以工作,但我不能完全正常工作,下面是我运行脚本后的输出。 注意红色框中的列,似

  • 我是编程新手,所以请耐心听我说。我正在编写一个脚本,除其他外,在编辑时获取单元格值,然后在其他各种范围内的一系列单元格下划线。给定的单元格上有验证,因此用户只能从下拉框的一系列选项中进行选择。 据我所知,验证函数工作正常,但是当我通过选择一个下拉框选项来编辑指定的单元格时,什么都不会发生。我需要调用函数吗?我已经阅读了api的参考资料,并在stackoverflow和网络上搜索了帮助,但是我被卡住

  • 我有一个相当大的问题。如果我使用for循环和range(r,c.).getValue()读取列单元格(与使用range(r,c,m,1).getValues()读取列单元格相同),则不会读取值。我错了!。我正在读取单元格值,这些值有些是其他表格中的参考值,有些是if、舍入和加减计算值。 正如你可能在图中看到的,我在一些列上有一个固定的测试值(数字2, 3, 4, 5)这些总是读得很好。 在源代码中

  • 我以前在我的工作表上有一个脚本,是基于https://webapps.stackexchange.com/questions/7211/how-can-i-make-some-data-on-a-google-spreadsheet-auto-sorting此选项用于在编辑特定图纸时自动对其排序。然而,我无法确定日期,它似乎已经停止工作了。我已经做了一些研究,显然排序方法在不久前已经改变了。 现在